← back to Japan Enrich
fix: untrack govarbitrage (has its own separate .git repo — was wrongly double-tracked by an accidental fleet-scoped commit) + ignore it going forward
9d0edd2c288322ec428ac23091437f7d566bc226 · 2026-09-13 00:08:12 -0700 · Steve
Files touched
M .gitignoreD govarbitrage/.dockerignoreD govarbitrage/.env.exampleD govarbitrage/.gitignoreD govarbitrage/.gitleaks.tomlD govarbitrage/5x/REPORT.mdD govarbitrage/DockerfileD govarbitrage/README.mdD govarbitrage/apps/mobile/.claude/settings.jsonD govarbitrage/apps/mobile/.gitignoreD govarbitrage/apps/mobile/.npmrcD govarbitrage/apps/mobile/AGENTS.mdD govarbitrage/apps/mobile/APP-STORE-LISTING.mdD govarbitrage/apps/mobile/ASC-PASTE-KIT.mdD govarbitrage/apps/mobile/CLAUDE.mdD govarbitrage/apps/mobile/LICENSED govarbitrage/apps/mobile/app.jsonD govarbitrage/apps/mobile/constants/theme.tsD govarbitrage/apps/mobile/device-proof-evidence/.gitignoreD govarbitrage/apps/mobile/device-proof-evidence/CAPTURE-RUNBOOK.mdD govarbitrage/apps/mobile/device-proof-evidence/COMPLETENESS-FINDING.mdD govarbitrage/apps/mobile/device-proof-evidence/DDI-UNBLOCK-CHECKLIST.mdD govarbitrage/apps/mobile/device-proof-evidence/EVIDENCE-INDEX.mdD govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/project.pbxprojD govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/project.xcworkspace/contents.xcworkspacedataD govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/xcshareddata/xcschemes/GovArbUITests.xcschemeD govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/README.mdD govarbitrage/apps/mobile/device-proof-evidence/SIM-DRYRUN-FINDINGS.mdD govarbitrage/apps/mobile/device-proof-evidence/SUBMIT-GATE-CHECKLIST.mdD govarbitrage/apps/mobile/device-proof-evidence/govarbitrage-SIMULATOR-dryrun-2026-09-02T221255Z.mov.DO-NOT-UPLOAD-simulator-fails-2.1D govarbitrage/apps/mobile/eas.jsonD govarbitrage/apps/mobile/index.tsD govarbitrage/apps/mobile/lib/api-error.tsD govarbitrage/apps/mobile/lib/api.tsD govarbitrage/apps/mobile/lib/auth-headers.tsD govarbitrage/apps/mobile/lib/auth.tsD govarbitrage/apps/mobile/lib/format.tsD govarbitrage/apps/mobile/lib/pnl.tsD govarbitrage/apps/mobile/lib/settings.tsD govarbitrage/apps/mobile/lib/types.tsD govarbitrage/apps/mobile/lib/validate.tsD govarbitrage/apps/mobile/package-lock.jsonD govarbitrage/apps/mobile/package.jsonD govarbitrage/apps/mobile/scripts/lint-financial-format.mjsD govarbitrage/apps/mobile/store-assets/privacy-label.mdD govarbitrage/apps/mobile/tests/auth-headers.test.mjsD govarbitrage/apps/mobile/tests/format.test.mjsD govarbitrage/apps/mobile/tsconfig.jsonD govarbitrage/docker-compose.ymlD govarbitrage/docs/API.mdD govarbitrage/docs/ARCHITECTURE.mdD govarbitrage/eslint.config.mjsD govarbitrage/extension/README.mdD govarbitrage/extension/background.jsD govarbitrage/extension/content.jsD govarbitrage/extension/manifest.jsonD govarbitrage/extension/popup.jsD govarbitrage/logs/digest.logD govarbitrage/logs/govdeals-free.logD govarbitrage/logs/gsa-import.logD govarbitrage/logs/hot-deals.logD govarbitrage/logs/liveness.logD govarbitrage/logs/newsletter-digest.err.logD govarbitrage/logs/newsletter-digest.out.logD govarbitrage/next.config.tsD govarbitrage/package-lock.jsonD govarbitrage/package.jsonD govarbitrage/playwright.config.tsD govarbitrage/postcss.config.mjsD govarbitrage/prisma/schema.prismaD govarbitrage/prisma/seed.tsD govarbitrage/public/.gitkeepD govarbitrage/scripts/hot-deal-alert.tsD govarbitrage/scripts/import-apify-govdeals.tsD govarbitrage/scripts/import-govdeals-free.tsD govarbitrage/scripts/import-govplanet-free.tsD govarbitrage/scripts/import-grays.tsD govarbitrage/scripts/import-gsa.tsD govarbitrage/scripts/import-municibid-free.tsD govarbitrage/scripts/import-publicsurplus-free.tsD govarbitrage/scripts/liveness-sweep.tsD govarbitrage/scripts/probe-govdeals.tsD govarbitrage/scripts/seed-digest-snapshots.tsD govarbitrage/scripts/send-digest.tsD govarbitrage/scripts/send-newsletter-digest.tsD govarbitrage/scripts/set-admin.tsD govarbitrage/src/agents/appraiser.tsD govarbitrage/src/agents/framework.tsD govarbitrage/src/agents/run.tsD govarbitrage/src/agents/scout.tsD govarbitrage/src/agents/skeptic-rules.test.tsD govarbitrage/src/agents/skeptic-rules.tsD govarbitrage/src/agents/skeptic.tsD govarbitrage/src/app/api/agents/search/route.tsD govarbitrage/src/app/api/auth/apple/route.tsD govarbitrage/src/app/api/auth/login/route.tsD govarbitrage/src/app/api/auth/logout/route.tsD govarbitrage/src/app/api/auth/me/route.tsD govarbitrage/src/app/api/billing/checkout/route.tsD govarbitrage/src/app/api/billing/webhook/route.tsD govarbitrage/src/app/api/import/apify-govdeals/route.tsD govarbitrage/src/app/api/import/csv/route.tsD govarbitrage/src/app/api/import/extension/route.tsD govarbitrage/src/app/api/import/gsa/route.tsD govarbitrage/src/app/api/import/url/route.tsD govarbitrage/src/app/api/listings/[id]/buyer-lead/route.tsD govarbitrage/src/app/api/listings/[id]/buyer-page/route.tsD govarbitrage/src/app/api/listings/[id]/route.tsD govarbitrage/src/app/api/listings/route.tsD govarbitrage/src/app/api/newsletter/confirm/route.tsD govarbitrage/src/app/api/newsletter/result-page.tsD govarbitrage/src/app/api/newsletter/subscribe/route.tsD govarbitrage/src/app/api/newsletter/unsubscribe/route.tsD govarbitrage/src/app/robots.tsD govarbitrage/src/app/sitemap.tsD govarbitrage/src/engines/constants.tsD govarbitrage/src/engines/costs.test.tsD govarbitrage/src/engines/costs.tsD govarbitrage/src/engines/demand.tsD govarbitrage/src/engines/freight.tsD govarbitrage/src/engines/scoring.test.tsD govarbitrage/src/engines/scoring.tsD govarbitrage/src/engines/types.tsD govarbitrage/src/engines/valuation.test.tsD govarbitrage/src/engines/valuation.tsD govarbitrage/src/importers/apify-govdeals.tsD govarbitrage/src/importers/csv.tsD govarbitrage/src/importers/govdeals-free.tsD govarbitrage/src/importers/govplanet-free.tsD govarbitrage/src/importers/grays-free.tsD govarbitrage/src/importers/gsa.tsD govarbitrage/src/importers/ingest.tsD govarbitrage/src/importers/municibid-free.tsD govarbitrage/src/importers/publicsurplus-free.tsD govarbitrage/src/importers/scrape.tsD govarbitrage/src/lib/ai.tsD govarbitrage/src/lib/auth.test.tsD govarbitrage/src/lib/auth.tsD govarbitrage/src/lib/billing.tsD govarbitrage/src/lib/crypto.test.tsD govarbitrage/src/lib/crypto.tsD govarbitrage/src/lib/current-user.tsD govarbitrage/src/lib/dashboard.tsD govarbitrage/src/lib/db.tsD govarbitrage/src/lib/digest-snapshot.tsD govarbitrage/src/lib/digest-top.tsD govarbitrage/src/lib/fleet-sso.tsD govarbitrage/src/lib/hot-deals.tsD govarbitrage/src/lib/listing-detail.test.tsD govarbitrage/src/lib/listing-detail.tsD govarbitrage/src/lib/listings-sort.test.tsD govarbitrage/src/lib/listings.tsD govarbitrage/src/lib/marketplace-links.test.tsD govarbitrage/src/lib/marketplace-links.tsD govarbitrage/src/lib/money-math-visibility.test.tsD govarbitrage/src/lib/newsletter.tsD govarbitrage/src/lib/password.tsD govarbitrage/src/lib/places.test.tsD govarbitrage/src/lib/places.tsD govarbitrage/src/lib/rate-limit.test.tsD govarbitrage/src/lib/rate-limit.tsD govarbitrage/src/lib/reports.tsD govarbitrage/src/lib/selling-avenues.tsD govarbitrage/src/lib/send-digest.tsD govarbitrage/src/lib/session.tsD govarbitrage/src/lib/site.tsD govarbitrage/src/lib/ssrf-guard.tsD govarbitrage/src/lib/tiers.tsD govarbitrage/src/lib/utils.tsD govarbitrage/src/middleware.test.tsD govarbitrage/src/middleware.tsD govarbitrage/src/pipeline/research.tsD govarbitrage/src/worker/index.tsD govarbitrage/store-assets/app-store-listing.mdD govarbitrage/tests/e2e/smoke.spec.tsD govarbitrage/tsconfig.jsonD govarbitrage/tsconfig.tsbuildinfoD govarbitrage/vitest.config.ts
Diff
commit 9d0edd2c288322ec428ac23091437f7d566bc226
Author: Steve <steve@designerwallcoverings.com>
Date: Sun Sep 13 00:08:12 2026 -0700
fix: untrack govarbitrage (has its own separate .git repo — was wrongly double-tracked by an accidental fleet-scoped commit) + ignore it going forward
---
.gitignore | 1 +
govarbitrage/.dockerignore | 36 -
govarbitrage/.env.example | 58 -
govarbitrage/.gitignore | 21 -
govarbitrage/.gitleaks.toml | 31 -
govarbitrage/5x/REPORT.md | 55 -
govarbitrage/Dockerfile | 42 -
govarbitrage/README.md | 226 -
govarbitrage/apps/mobile/.claude/settings.json | 5 -
govarbitrage/apps/mobile/.gitignore | 52 -
govarbitrage/apps/mobile/.npmrc | 1 -
govarbitrage/apps/mobile/AGENTS.md | 3 -
govarbitrage/apps/mobile/APP-STORE-LISTING.md | 84 -
govarbitrage/apps/mobile/ASC-PASTE-KIT.md | 288 -
govarbitrage/apps/mobile/CLAUDE.md | 1 -
govarbitrage/apps/mobile/LICENSE | 21 -
govarbitrage/apps/mobile/app.json | 55 -
govarbitrage/apps/mobile/constants/theme.ts | 73 -
.../apps/mobile/device-proof-evidence/.gitignore | 17 -
.../device-proof-evidence/CAPTURE-RUNBOOK.md | 43 -
.../device-proof-evidence/COMPLETENESS-FINDING.md | 51 -
.../device-proof-evidence/DDI-UNBLOCK-CHECKLIST.md | 29 -
.../mobile/device-proof-evidence/EVIDENCE-INDEX.md | 96 -
.../GovArbUITest.xcodeproj/project.pbxproj | 223 -
.../project.xcworkspace/contents.xcworkspacedata | 7 -
.../xcshareddata/xcschemes/GovArbUITests.xcscheme | 43 -
.../device-proof-evidence/GovArbUITest/README.md | 51 -
.../device-proof-evidence/SIM-DRYRUN-FINDINGS.md | 72 -
.../device-proof-evidence/SUBMIT-GATE-CHECKLIST.md | 41 -
...2T221255Z.mov.DO-NOT-UPLOAD-simulator-fails-2.1 | Bin 7994412 -> 0 bytes
govarbitrage/apps/mobile/eas.json | 40 -
govarbitrage/apps/mobile/index.ts | 1 -
govarbitrage/apps/mobile/lib/api-error.ts | 14 -
govarbitrage/apps/mobile/lib/api.ts | 145 -
govarbitrage/apps/mobile/lib/auth-headers.ts | 26 -
govarbitrage/apps/mobile/lib/auth.ts | 83 -
govarbitrage/apps/mobile/lib/format.ts | 125 -
govarbitrage/apps/mobile/lib/pnl.ts | 13 -
govarbitrage/apps/mobile/lib/settings.ts | 97 -
govarbitrage/apps/mobile/lib/types.ts | 240 -
govarbitrage/apps/mobile/lib/validate.ts | 95 -
govarbitrage/apps/mobile/package-lock.json | 7339 ----------------
govarbitrage/apps/mobile/package.json | 37 -
.../apps/mobile/scripts/lint-financial-format.mjs | 128 -
.../apps/mobile/store-assets/privacy-label.md | 45 -
.../apps/mobile/tests/auth-headers.test.mjs | 49 -
govarbitrage/apps/mobile/tests/format.test.mjs | 99 -
govarbitrage/apps/mobile/tsconfig.json | 18 -
govarbitrage/docker-compose.yml | 57 -
govarbitrage/docs/API.md | 155 -
govarbitrage/docs/ARCHITECTURE.md | 199 -
govarbitrage/eslint.config.mjs | 11 -
govarbitrage/extension/README.md | 92 -
govarbitrage/extension/background.js | 28 -
govarbitrage/extension/content.js | 422 -
govarbitrage/extension/manifest.json | 19 -
govarbitrage/extension/popup.js | 198 -
govarbitrage/logs/digest.log | 35 -
govarbitrage/logs/govdeals-free.log | 71 -
govarbitrage/logs/gsa-import.log | 52 -
govarbitrage/logs/hot-deals.log | 34 -
govarbitrage/logs/liveness.log | 7346 ----------------
govarbitrage/logs/newsletter-digest.err.log | 0
govarbitrage/logs/newsletter-digest.out.log | 28 -
govarbitrage/next.config.ts | 18 -
govarbitrage/package-lock.json | 9133 --------------------
govarbitrage/package.json | 70 -
govarbitrage/playwright.config.ts | 20 -
govarbitrage/postcss.config.mjs | 8 -
govarbitrage/prisma/schema.prisma | 533 --
govarbitrage/prisma/seed.ts | 820 --
govarbitrage/public/.gitkeep | 0
govarbitrage/scripts/hot-deal-alert.ts | 160 -
govarbitrage/scripts/import-apify-govdeals.ts | 30 -
govarbitrage/scripts/import-govdeals-free.ts | 37 -
govarbitrage/scripts/import-govplanet-free.ts | 29 -
govarbitrage/scripts/import-grays.ts | 25 -
govarbitrage/scripts/import-gsa.ts | 31 -
govarbitrage/scripts/import-municibid-free.ts | 29 -
govarbitrage/scripts/import-publicsurplus-free.ts | 29 -
govarbitrage/scripts/liveness-sweep.ts | 141 -
govarbitrage/scripts/probe-govdeals.ts | 61 -
govarbitrage/scripts/seed-digest-snapshots.ts | 117 -
govarbitrage/scripts/send-digest.ts | 256 -
govarbitrage/scripts/send-newsletter-digest.ts | 12 -
govarbitrage/scripts/set-admin.ts | 42 -
govarbitrage/src/agents/appraiser.ts | 85 -
govarbitrage/src/agents/framework.ts | 91 -
govarbitrage/src/agents/run.ts | 80 -
govarbitrage/src/agents/scout.ts | 49 -
govarbitrage/src/agents/skeptic-rules.test.ts | 82 -
govarbitrage/src/agents/skeptic-rules.ts | 69 -
govarbitrage/src/agents/skeptic.ts | 93 -
govarbitrage/src/app/api/agents/search/route.ts | 68 -
govarbitrage/src/app/api/auth/apple/route.ts | 104 -
govarbitrage/src/app/api/auth/login/route.ts | 73 -
govarbitrage/src/app/api/auth/logout/route.ts | 10 -
govarbitrage/src/app/api/auth/me/route.ts | 10 -
govarbitrage/src/app/api/billing/checkout/route.ts | 22 -
govarbitrage/src/app/api/billing/webhook/route.ts | 48 -
.../src/app/api/import/apify-govdeals/route.ts | 28 -
govarbitrage/src/app/api/import/csv/route.ts | 44 -
govarbitrage/src/app/api/import/extension/route.ts | 35 -
govarbitrage/src/app/api/import/gsa/route.ts | 26 -
govarbitrage/src/app/api/import/url/route.ts | 30 -
.../src/app/api/listings/[id]/buyer-lead/route.ts | 37 -
.../src/app/api/listings/[id]/buyer-page/route.ts | 46 -
govarbitrage/src/app/api/listings/[id]/route.ts | 11 -
govarbitrage/src/app/api/listings/route.ts | 56 -
.../src/app/api/newsletter/confirm/route.ts | 30 -
govarbitrage/src/app/api/newsletter/result-page.ts | 22 -
.../src/app/api/newsletter/subscribe/route.ts | 62 -
.../src/app/api/newsletter/unsubscribe/route.ts | 33 -
govarbitrage/src/app/robots.ts | 25 -
govarbitrage/src/app/sitemap.ts | 28 -
govarbitrage/src/engines/constants.ts | 56 -
govarbitrage/src/engines/costs.test.ts | 78 -
govarbitrage/src/engines/costs.ts | 162 -
govarbitrage/src/engines/demand.ts | 73 -
govarbitrage/src/engines/freight.ts | 47 -
govarbitrage/src/engines/scoring.test.ts | 72 -
govarbitrage/src/engines/scoring.ts | 196 -
govarbitrage/src/engines/types.ts | 133 -
govarbitrage/src/engines/valuation.test.ts | 85 -
govarbitrage/src/engines/valuation.ts | 84 -
govarbitrage/src/importers/apify-govdeals.ts | 148 -
govarbitrage/src/importers/csv.ts | 71 -
govarbitrage/src/importers/govdeals-free.ts | 127 -
govarbitrage/src/importers/govplanet-free.ts | 227 -
govarbitrage/src/importers/grays-free.ts | 88 -
govarbitrage/src/importers/gsa.ts | 91 -
govarbitrage/src/importers/ingest.ts | 159 -
govarbitrage/src/importers/municibid-free.ts | 246 -
govarbitrage/src/importers/publicsurplus-free.ts | 211 -
govarbitrage/src/importers/scrape.ts | 80 -
govarbitrage/src/lib/ai.ts | 122 -
govarbitrage/src/lib/auth.test.ts | 41 -
govarbitrage/src/lib/auth.ts | 48 -
govarbitrage/src/lib/billing.ts | 86 -
govarbitrage/src/lib/crypto.test.ts | 26 -
govarbitrage/src/lib/crypto.ts | 40 -
govarbitrage/src/lib/current-user.ts | 53 -
govarbitrage/src/lib/dashboard.ts | 41 -
govarbitrage/src/lib/db.ts | 13 -
govarbitrage/src/lib/digest-snapshot.ts | 134 -
govarbitrage/src/lib/digest-top.ts | 32 -
govarbitrage/src/lib/fleet-sso.ts | 44 -
govarbitrage/src/lib/hot-deals.ts | 191 -
govarbitrage/src/lib/listing-detail.test.ts | 85 -
govarbitrage/src/lib/listing-detail.ts | 81 -
govarbitrage/src/lib/listings-sort.test.ts | 57 -
govarbitrage/src/lib/listings.ts | 254 -
govarbitrage/src/lib/marketplace-links.test.ts | 49 -
govarbitrage/src/lib/marketplace-links.ts | 138 -
govarbitrage/src/lib/money-math-visibility.test.ts | 27 -
govarbitrage/src/lib/newsletter.ts | 141 -
govarbitrage/src/lib/password.ts | 21 -
govarbitrage/src/lib/places.test.ts | 538 --
govarbitrage/src/lib/places.ts | 634 --
govarbitrage/src/lib/rate-limit.test.ts | 32 -
govarbitrage/src/lib/rate-limit.ts | 76 -
govarbitrage/src/lib/reports.ts | 139 -
govarbitrage/src/lib/selling-avenues.ts | 168 -
govarbitrage/src/lib/send-digest.ts | 88 -
govarbitrage/src/lib/session.ts | 42 -
govarbitrage/src/lib/site.ts | 9 -
govarbitrage/src/lib/ssrf-guard.ts | 104 -
govarbitrage/src/lib/tiers.ts | 103 -
govarbitrage/src/lib/utils.ts | 50 -
govarbitrage/src/middleware.test.ts | 98 -
govarbitrage/src/middleware.ts | 142 -
govarbitrage/src/pipeline/research.ts | 257 -
govarbitrage/src/worker/index.ts | 66 -
govarbitrage/store-assets/app-store-listing.md | 153 -
govarbitrage/tests/e2e/smoke.spec.ts | 38 -
govarbitrage/tsconfig.json | 44 -
govarbitrage/tsconfig.tsbuildinfo | 1 -
govarbitrage/vitest.config.ts | 15 -
178 files changed, 1 insertion(+), 39019 deletions(-)
diff --git a/.gitignore b/.gitignore
index 2bebdc4..b5ee0ae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,4 @@ tmp/
dist/
build/
.next/
+govarbitrage/
diff --git a/govarbitrage/.dockerignore b/govarbitrage/.dockerignore
deleted file mode 100644
index 01df8e2..0000000
--- a/govarbitrage/.dockerignore
+++ /dev/null
@@ -1,36 +0,0 @@
-# Dependencies + build artifacts (rebuilt inside the image)
-node_modules
-.next
-dist
-build
-out
-coverage
-
-# Env + secrets (inject at runtime via compose / -e, never bake in)
-.env
-.env.*
-!.env.example
-
-# VCS + editor
-.git
-.gitignore
-.gitattributes
-.vscode
-.idea
-
-# Logs + OS cruft
-*.log
-.DS_Store
-npm-debug.log*
-
-# Test + tooling output
-playwright-report
-test-results
-prisma/*.db
-
-# Docs + Docker (not needed in the build context)
-Dockerfile
-docker-compose.yml
-.dockerignore
-README.md
-docs
diff --git a/govarbitrage/.env.example b/govarbitrage/.env.example
deleted file mode 100644
index 2511e2f..0000000
--- a/govarbitrage/.env.example
+++ /dev/null
@@ -1,58 +0,0 @@
-# ---- Database (local Postgres 14 already running on this machine) ----
-DATABASE_URL="postgresql://macstudio3@localhost:5432/govarbitrage?schema=public"
-
-# ---- Local AI (Ollama) — product identification runs local-first, $0/query ----
-OLLAMA_BASE_URL="http://localhost:11434"
-OLLAMA_TEXT_MODEL="qwen3:14b"
-OLLAMA_VISION_MODEL="qwen2.5vl:7b"
-
-# ---- Cloud AI fallback (opt-in only; leave blank to stay 100% local/$0) ----
-ANTHROPIC_API_KEY=""
-AI_PROVIDER="ollama" # "ollama" (default, local, free) | "anthropic" (opt-in, paid)
-
-# ---- Background jobs ----
-# Redis is OPTIONAL. If REDIS_URL is unset, the research worker runs in
-# direct/in-process mode (fine at this scale). Set it to enable BullMQ.
-REDIS_URL=""
-
-# ---- Auth / security ----
-AUTH_SECRET="dev-only-change-me"
-ENCRYPTION_KEY="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" # 32 bytes = 64 hex chars (AES-256-GCM)
-
-# Optional write-guard: if set, import + admin write endpoints require the
-# matching `x-import-token` header. Unset = open (local dev).
-IMPORT_TOKEN=""
-
-# ---- Data source: official GSA Auctions API (free, no scraping) ----
-# DEMO_KEY works for testing; get a real key at https://api.data.gov/signup/
-GSA_API_KEY="DEMO_KEY"
-
-# ---- GovDeals via Apify actor parseforge/govdeals-scraper (bypasses bot-wall) ----
-# Reading finished datasets is free; running the actor for fresh data costs
-# ~$0.0037/listing. Token is routed here by the secrets manager.
-APIFY_TOKEN=""
-APIFY_GOVDEALS_ACTOR="SZdBCF9FpwOzvByvM"
-APIFY_GOVDEALS_DATASET=""
-
-# ---- App ----
-NODE_ENV="development"
-
-# ---- Twice-daily "Top 10 Opportunities" digest (scripts/send-digest.ts) ----
-# George (DW Gmail HTTP agent) credentials are read at runtime from the George
-# MCP env in ~/.claude.json by scripts/run-digest.sh — NOT stored here.
-DIGEST_TO="steve@designerwallcoverings.com"
-APP_URL="http://localhost:3737"
-
-# ---- Public newsletter (double opt-in; TEST mode until Steve approves live) ----
-# TEST mode (default): confirmation/unsubscribe emails are logged to console +
-# logs/newsletter-outbox.jsonl, never sent. Live requires BOTH
-# NEWSLETTER_SEND_MODE=live AND NEWSLETTER_SEND_APPROVAL_TOKEN set — and the
-# actual send transport (George/SMTP) is deliberately not wired yet.
-NEWSLETTER_SEND_MODE="test"
-NEWSLETTER_SEND_APPROVAL_TOKEN=""
-NEWSLETTER_FROM_NAME="GovArbitrage Deal Digest"
-NEWSLETTER_FROM_EMAIL=""
-# CAN-SPAM: physical postal address, required in every commercial email footer.
-NEWSLETTER_MAILING_ADDRESS=""
-# Public origin used in confirm/unsubscribe links (falls back to request origin).
-NEWSLETTER_BASE_URL=""
diff --git a/govarbitrage/.gitignore b/govarbitrage/.gitignore
deleted file mode 100644
index 9a7a259..0000000
--- a/govarbitrage/.gitignore
+++ /dev/null
@@ -1,21 +0,0 @@
-node_modules/
-.next/
-dist/
-build/
-out/
-.env
-.env.*
-!.env.example
-*.log
-.DS_Store
-coverage/
-playwright-report/
-test-results/
-prisma/*.db
-next-env.d.ts
-logs/
-
-# EAS ASC API key (secret) — belt+suspenders over child gitignore
-*.p8
-apps/*/credentials/
-credentials/
diff --git a/govarbitrage/.gitleaks.toml b/govarbitrage/.gitleaks.toml
deleted file mode 100644
index ef833f8..0000000
--- a/govarbitrage/.gitleaks.toml
+++ /dev/null
@@ -1,31 +0,0 @@
-# gitleaks config for govarbitrage.
-# Keep ALL default rules (extend), and add ONLY a narrow allowlist for the App
-# Store Connect API *identifiers* that live in apps/mobile/eas.json. The ASC
-# issuer id and key id are account IDENTIFIERS, not secret key material — the
-# actual private key (AuthKey_*.p8) is referenced by a gitignored path
-# (~/.appstoreconnect/private_keys/…) and is never committed. gitleaks' generic
-# high-entropy rule false-positives on these UUID/key-id strings.
-title = "govarbitrage gitleaks config"
-
-[extend]
-useDefault = true
-
-[allowlist]
-description = "ASC API key identifiers (issuer id + key id) in eas.json — non-secret account identifiers, not key material"
-# .env.example is a pure documentation TEMPLATE — every value is a placeholder,
-# empty, or a public demo id. Allowlist the file (all rules stay active elsewhere).
-paths = [
- '''\.env\.example$''',
-]
-regexes = [
- '''cfbd63ed-301b-465c-aad7-49e94420ad70''',
- '''AuthKey_72Y2TZT54R''',
- '''72Y2TZT54R''',
- # Placeholder/dummy values in .env.example + dev docker-compose.yml — NOT live
- # secrets. The generic-api-key rule false-positives on the 64-hex SHAPE.
- '''0123456789abcdef''',
- '''dev-only-change-me''',
- '''GSA_API_KEY="DEMO_KEY"''',
- # Public Apify actor id (parseforge/govdeals-scraper) — an actor IDENTIFIER, not a token.
- '''SZdBCF9FpwOzvByvM''',
-]
diff --git a/govarbitrage/5x/REPORT.md b/govarbitrage/5x/REPORT.md
deleted file mode 100644
index 68deeda..0000000
--- a/govarbitrage/5x/REPORT.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# /5x REPORT — https://govarbitrage.agentabrams.com (live, 2026-07-13 ~09:30 PT)
-
-Target: all public surfaces, live through cloudflared tunnel → pm2 govarbitrage :3737.
-Stop condition reached: TWO consecutive clean sweeps (sweeps 1 & 2, 0 defects each).
-
-## Sweep 1 — six-way + all-path + console
-| Check | Result |
-|---|---|
-| 3x runner on /newsletter (M1 HTTP, M2 headless render, M3 Playwright E2E, B4 Chrome, B5 Safari, B6 Firefox, clickthrough) | 7/7 PASS, 0 JS errors, subscribe button exercised |
-| /newsletter /deals /deals/2026-07-13 /pricing /sitemap.xml /robots.txt — HTTP + content | all 200 + expected content |
-| /login | 200; client-rendered — headless confirmed 1 password + 1 email input (curl-grep false alarm, harness limitation not a defect) |
-| Console errors (5 pages, headless networkidle) | 0 on all |
-| /pricing tier prices | $12 + $29 render |
-| sitemap.xml \<loc\> base | public origin, no localhost leak |
-| Rate-limit IP source | reads x-forwarded-for (cloudflared supplies real client IP) — no shared-bucket trap |
-
-Defects caught: 0. Fixes: none needed.
-
-## Sweep 2 — API behavior + six-way on /deals
-| Check | Result |
-|---|---|
-| POST subscribe bad email | 400 |
-| POST subscribe honeypot filled | fake-OK 200, NO outbox entry (no send) |
-| GET confirm bogus/missing token | 404 / 400 |
-| GET unsubscribe bogus token | 404 |
-| /listings (auth-walled page) publicly | 307 → login |
-| /api/listings publicly | 401 |
-| 3x runner on /deals | 7/7 PASS, 0 JS errors |
-
-Defects caught: 0. Fixes: none needed.
-
-## Final state
-All six verification layers green on both entry pages; API validation, token handling,
-honeypot, rate-limit plumbing, auth wall, sitemap, robots all correct on the LIVE origin.
-Site stayed live the whole time (no restarts needed — no fixes required).
-
-Open items (not defects): 0 CONFIRMED subscribers until Steve clicks his confirm link;
-0 deals currently clear the hot-deal gate (empty-state renders honestly).
-
-## Contrarian gate → FIX FIRST → fixed (sweeps 3-4)
-Contrarian caught 3 gaps the clean sweeps missed:
-1. /newsletter had ZERO OG/social tags (acquisition page unfurled blank) → openGraph +
- twitter metadata added; 5 og: tags verified live.
-2. "Launching soon" copy became a lie once the digest went live → present-tense honest
- copy on page + confirm email; stale copy verified gone.
-3. localhost fallback in sendDigestToSubscribers could put localhost unsubscribe links in
- a real email → live mode now throws unless NEWSLETTER_BASE_URL is https; verified.
-Resilience chain verified (not a code fix): tunnel plist KeepAlive+RunAtLoad,
-com.steve.pm2-resurrect, govarbitrage in pm2 dump. Shared-tunnel SPOF documented as
-accepted infra (dedicated tunnel = future option).
-
-## Sweeps 3-4 (post-fix)
-Sweep 3: fixes verified live (OG ×5, honest copy, guard passes with https base) — clean.
-Sweep 4: 3x runner /newsletter 7/7, console clean on 4 pages — clean.
-STOP: two consecutive clean sweeps AFTER fixes. Final verdict: stable.
diff --git a/govarbitrage/Dockerfile b/govarbitrage/Dockerfile
deleted file mode 100644
index 86f4aab..0000000
--- a/govarbitrage/Dockerfile
+++ /dev/null
@@ -1,42 +0,0 @@
-# syntax=docker/dockerfile:1
-
-# ---------- Stage 1: dependencies ----------
-FROM node:22-alpine AS deps
-# Prisma engines + native modules need these on alpine.
-RUN apk add --no-cache libc6-compat openssl
-WORKDIR /app
-COPY package.json package-lock.json ./
-# Install all deps (incl. dev) so `next build` + `prisma generate` can run.
-RUN npm ci
-
-# ---------- Stage 2: build ----------
-FROM node:22-alpine AS builder
-RUN apk add --no-cache libc6-compat openssl
-WORKDIR /app
-COPY --from=deps /app/node_modules ./node_modules
-COPY . .
-# Generate the Prisma client, then build Next.js.
-# (npm run build already runs `prisma generate && next build`.)
-ENV NEXT_TELEMETRY_DISABLED=1
-RUN npx prisma generate && npm run build
-
-# ---------- Stage 3: runtime ----------
-FROM node:22-alpine AS runner
-RUN apk add --no-cache libc6-compat openssl
-WORKDIR /app
-ENV NODE_ENV=production
-ENV NEXT_TELEMETRY_DISABLED=1
-ENV PORT=3000
-
-# Bring over everything needed to `next start` (no standalone output assumed).
-COPY --from=builder /app/package.json ./package.json
-COPY --from=builder /app/node_modules ./node_modules
-COPY --from=builder /app/.next ./.next
-COPY --from=builder /app/public ./public
-COPY --from=builder /app/next.config.ts ./next.config.ts
-COPY --from=builder /app/prisma ./prisma
-
-EXPOSE 3000
-
-# Straightforward production start.
-CMD ["npm", "run", "start"]
diff --git a/govarbitrage/README.md b/govarbitrage/README.md
deleted file mode 100644
index f398fb0..0000000
--- a/govarbitrage/README.md
+++ /dev/null
@@ -1,226 +0,0 @@
-# GovArbitrage
-
-**GovArbitrage** discovers government-surplus auction listings, researches and
-values them, scores them for resale arbitrage, and surfaces the best
-opportunities on a dense analyst dashboard.
-
-It answers one question for every lot: *"If I win this at the current bid, what
-does it cost me all-in, what can I resell it for, how fast, and how much do I
-actually make?"* — then ranks every listing across nine named opportunity
-profiles so you can sort by whatever kind of flip you're hunting.
-
-The heavy lifting is done by **deterministic, explainable engines** (valuation,
-costs, scoring, freight, demand). AI is used only for the fuzzy step —
-identifying what a product actually *is* from a messy auction title — and it runs
-**local-first on Ollama at $0/query**, with an opt-in Anthropic fallback.
-
----
-
-## Features
-
-- **Listing intake** from multiple government auction sources (GovDeals, Public
- Surplus, GSA Auctions, county/state/university surplus, Municibid, Bid4Assets,
- CSV import, browser-extension capture).
-- **AI product identification** — infers manufacturer, model, category, and a
- new-retail anchor from the listing title/description (local Ollama text +
- vision models; Anthropic opt-in fallback; deterministic heuristic floor).
-- **Full valuation ladder** — from a single retail anchor + condition + demand,
- derives new/replacement/average retail, a used-market spread, wholesale /
- liquidation / sell-today channel values, 7- / 30- / 90-day time-horizon values,
- expected sale price, probability of sale, days-until-sold, and a confidence
- score.
-- **20+ line-item cost breakdown** — buyer's premium, sales tax, shipping,
- freight, insurance, packing, pickup labor, testing, repairs, certification,
- marketplace + payment fees, storage, photography, listing labor — rolled up
- into total investment, expected net profit, ROI, and annualized return.
-- **Recommended max bid** — back-solved from a target ROI given all
- bid-independent costs and resale fees, so you know the ceiling before you bid.
-- **Nine scoring profiles** — Overall Opportunity, Best Arbitrage, Quick Flip,
- Collector, Local Pickup, Easy Freight, Parts Only, High Confidence, High
- Profit — each built from seven component sub-scores, each with a plain-English
- explanation of *why* it scored the way it did, plus risk and drop-ship
- feasibility ratings.
-- **Dense TanStack dashboard** — ~40 sortable/hideable columns, per-profile
- re-ranking, server-side search + filtering (source / condition / risk /
- closing-soon), CSV export, and a live countdown to auction close.
-- **Listing detail view** — valuation ladder, full cost breakdown, per-profile
- score explanations, comparables, auction terms, and event history.
-- **Compliant buyer workflow** — contingent-offer interest pages and leads that
- never represent ownership before the auction is won (see
- [Compliance](#compliance)).
-- **Audit trail & secrets** — every listing carries a typed event log; API
- credentials submitted to `POST /api/credentials` are encrypted at rest with
- AES-256-GCM (`src/lib/crypto.ts`) and never returned to the client; an
- `AuditLog` records privileged actions. Import/admin write endpoints are guarded
- by an optional `IMPORT_TOKEN` header.
-
-### Security status (honest)
-
-**Implemented & verified:**
-
-- **Session authentication** — email/password login (`/login`), scrypt-hashed
- passwords (`src/lib/password.ts`), signed JWT session cookies (`jose`,
- `src/lib/session.ts`), and **Edge middleware** (`src/middleware.ts`) that gates
- every page + API route. Unauthenticated pages redirect to `/login`; APIs return
- 401. Public exceptions: `/login`, `/api/auth/*`, the `/b/<slug>` buyer pages, and
- the anonymous `buyer-lead` submission endpoint.
-- **Roles** — `ADMIN` / `ANALYST` / `VIEWER` on the `User` model; `hasRole()` helper
- for role checks; login/logout/failed-login written to `AuditLog`.
-- **AES-256-GCM secret encryption** for stored provider keys (`src/lib/crypto.ts`).
-- **Write-guard** — import/admin endpoints accept a valid session **or** the
- machine `x-import-token` header (`IMPORT_TOKEN`), enforced in middleware and again
- in-handler (`requireWrite`).
-- **Zod** request validation on auth + write endpoints.
-
-Demo users (password `changeme`): `admin@govarbitrage.local` (ADMIN),
-`analyst@govarbitrage.local` (ANALYST).
-
-**Remaining follow-on:** request **rate-limiting** (not yet implemented) — add
-before exposing the login + public buyer-lead endpoints to the open internet.
-
----
-
-## Tech stack
-
-| Layer | Technology |
-| ---------------- | ----------------------------------------------------------------- |
-| Framework | **Next.js 16** (App Router, server components, Turbopack) |
-| Language | **TypeScript** 5.7 |
-| UI runtime | **React 19** |
-| ORM | **Prisma 6** (`@prisma/client` 6.19) |
-| Database | **PostgreSQL 14** |
-| Styling | **Tailwind CSS v4** (`@tailwindcss/postcss`) |
-| Components | shadcn/ui-style primitives (`class-variance-authority`, `clsx`, `tailwind-merge`, `lucide-react`) |
-| Data grid | **TanStack Table** (`@tanstack/react-table` 8) |
-| Validation | **Zod** |
-| CSV | `csv-parse` |
-| Testing | **Vitest** (engine unit tests) + **Playwright** (e2e) |
-| Background jobs | **BullMQ + Redis** (optional; direct/in-process mode without it) |
-| Local AI | **Ollama** (text + vision models) |
-| Cloud AI (opt-in)| Anthropic Claude (fallback only) |
-
----
-
-## Prerequisites
-
-- **Node.js 20+**
-- **PostgreSQL** running locally (a `govarbitrage` database — Postgres 14+)
-- **Ollama** running locally for AI identification (optional; the app falls back
- to a deterministic heuristic when no model is reachable). Pull the configured
- models, e.g. `ollama pull qwen3:14b` and `ollama pull qwen2.5vl:7b`.
-- **Redis** (optional) only if you want BullMQ-backed background research.
-
----
-
-## Setup
-
-```bash
-# 1. Install dependencies
-npm install
-
-# 2. Create the database
-createdb govarbitrage
-
-# 3. Configure environment
-cp .env.example .env
-# Edit .env if your Postgres user / connection differs.
-
-# 4. Create the schema (no migration history needed for local dev)
-npx prisma db push
-
-# 5. Seed realistic sample listings + full research/valuation/scoring
-npm run db:seed
-
-# 6. Run the dev server
-npm run dev
-```
-
-The app runs on **http://localhost:3000** by default.
-
----
-
-## npm scripts
-
-| Script | Command | What it does |
-| ------------------- | ------------------------------ | ----------------------------------------------------- |
-| `npm run dev` | `next dev` | Start the dev server (http://localhost:3000) |
-| `npm run build` | `prisma generate && next build`| Generate the Prisma client, then production build |
-| `npm run start` | `next start` | Serve the production build |
-| `npm run lint` | `eslint .` | Lint the codebase |
-| `npm run typecheck` | `tsc --noEmit` | Type-check without emitting |
-| `npm run test` | `vitest run` | Run the engine unit tests once |
-| `npm run test:watch`| `vitest` | Run tests in watch mode |
-| `npm run db:generate` | `prisma generate` | (Re)generate the Prisma client |
-| `npm run db:push` | `prisma db push` | Push the schema to the database (no migration files) |
-| `npm run db:migrate`| `prisma migrate dev` | Create + apply a dev migration |
-| `npm run db:seed` | `tsx prisma/seed.ts` | Seed sample listings + run the research pipeline |
-| `npm run worker` | `tsx src/worker/index.ts` | Run the BullMQ research worker (optional; requires Redis) |
-| `npm run e2e` | `playwright test` | Run Playwright end-to-end tests |
-
-> The research worker (`npm run worker`) is the BullMQ-backed background runner.
-> When `REDIS_URL` is unset, research runs in direct/in-process mode instead
-> (invoked directly through `src/pipeline/research.ts`), which is fine at this
-> scale.
-
----
-
-## Environment variables
-
-From `.env.example`:
-
-| Variable | Default (example) | Purpose |
-| --------------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------- |
-| `DATABASE_URL` | `postgresql://<user>@localhost:5432/govarbitrage?schema=public` | Postgres connection string. |
-| `OLLAMA_BASE_URL` | `http://localhost:11434` | Local Ollama endpoint. |
-| `OLLAMA_TEXT_MODEL` | `qwen3:14b` | Ollama model for text-based product identification. |
-| `OLLAMA_VISION_MODEL` | `qwen2.5vl:7b` | Ollama vision model (used when listing images are supplied). |
-| `ANTHROPIC_API_KEY` | *(blank)* | Cloud fallback key. Leave blank to stay 100% local / $0. |
-| `AI_PROVIDER` | `ollama` | `ollama` (default, local, free) or `anthropic` (opt-in, paid). |
-| `REDIS_URL` | *(blank)* | Optional. Set to enable BullMQ background jobs; unset = in-process. |
-| `AUTH_SECRET` | `dev-only-change-me` | Session/auth secret. Change in production. |
-| `ENCRYPTION_KEY` | 32-byte hex | AES-256-GCM key for encrypting stored API credentials at rest. |
-| `NODE_ENV` | `development` | Node environment. |
-
----
-
-## How the AI layer works
-
-Product identification is the one genuinely fuzzy step in the pipeline, so it's
-the only place AI is used. It runs **local-first**:
-
-1. **Ollama text model** (`OLLAMA_TEXT_MODEL`, default `qwen3:14b`) — the default
- path. Runs on this machine, `$0`/query. If listing images are supplied, the
- **vision model** (`OLLAMA_VISION_MODEL`, default `qwen2.5vl:7b`) is tried
- first.
-2. **Anthropic Claude** — an **opt-in** fallback, used only when
- `AI_PROVIDER=anthropic` *and* `ANTHROPIC_API_KEY` is set, and only if the
- local model didn't return a result.
-3. **Deterministic heuristic** — if no model is reachable at all, the pipeline
- falls back to the keyword-driven demand/retail heuristic in
- `src/engines/demand.ts`. This keeps the app fully functional and reproducible
- offline; the AI estimate is also *blended* with the heuristic floor to avoid
- wild outliers.
-
-Everything downstream of identification (valuation, costs, scoring) is
-deterministic math, so the numbers are reproducible and auditable rather than a
-black box.
-
----
-
-## Compliance
-
-GovArbitrage's buyer workflow is deliberately constrained so you never
-misrepresent ownership of an item you have not yet won:
-
-- Buyer-interest pages and leads are **contingent by default**
- (`contingent = true`) and carry a standing disclaimer:
-
- > *"This item is not yet owned. Any offer is contingent on winning the
- > government auction and is non-binding until the auction is won and the item
- > is in hand."*
-
-- The workflow **only accepts contingent offers** and **never represents
- ownership before an auction is won**. Detail views label the buyer section
- explicitly: *"Buyer Interest (contingent — no ownership represented pre-win)."*
-
-This is a hard product rule, not a setting.
diff --git a/govarbitrage/apps/mobile/.claude/settings.json b/govarbitrage/apps/mobile/.claude/settings.json
deleted file mode 100644
index 176e6a5..0000000
--- a/govarbitrage/apps/mobile/.claude/settings.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "enabledPlugins": {
- "expo@claude-plugins-official": true
- }
-}
diff --git a/govarbitrage/apps/mobile/.gitignore b/govarbitrage/apps/mobile/.gitignore
deleted file mode 100644
index 94ffe1d..0000000
--- a/govarbitrage/apps/mobile/.gitignore
+++ /dev/null
@@ -1,52 +0,0 @@
-# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
-
-# dependencies
-node_modules/
-
-# Expo
-.expo/
-dist/
-web-build/
-expo-env.d.ts
-
-# Native
-.kotlin/
-*.orig.*
-*.jks
-*.p8
-*.p12
-*.key
-*.mobileprovision
-
-# Metro
-.metro-health-check*
-
-# debug
-npm-debug.*
-yarn-debug.*
-yarn-error.*
-
-# macOS
-.DS_Store
-*.pem
-
-# local env files
-.env*
-.env*.local
-
-# typescript
-*.tsbuildinfo
-
-# generated native folders
-/ios
-/android
-
-# EAS ASC API key (secret)
-credentials/
-*.p8
-
-# TK-10279 physical-device proof — ignore heavy capture artifacts (keep .md analysis docs)
-device-proof-evidence/*.mov
-device-proof-evidence/*.png
-device-proof-evidence/*.log
-device-proof-evidence/*.json
diff --git a/govarbitrage/apps/mobile/.npmrc b/govarbitrage/apps/mobile/.npmrc
deleted file mode 100644
index 521a9f7..0000000
--- a/govarbitrage/apps/mobile/.npmrc
+++ /dev/null
@@ -1 +0,0 @@
-legacy-peer-deps=true
diff --git a/govarbitrage/apps/mobile/AGENTS.md b/govarbitrage/apps/mobile/AGENTS.md
deleted file mode 100644
index 0e6bc80..0000000
--- a/govarbitrage/apps/mobile/AGENTS.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Expo HAS CHANGED
-
-Read the exact versioned docs at https://docs.expo.dev/versions/v57.0.0/ before writing any code.
diff --git a/govarbitrage/apps/mobile/APP-STORE-LISTING.md b/govarbitrage/apps/mobile/APP-STORE-LISTING.md
deleted file mode 100644
index 71a6939..0000000
--- a/govarbitrage/apps/mobile/APP-STORE-LISTING.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# App Store listing — GovArbitrage
-
-Bundle `com.abrams.govarbitrage` · EAS `@agentabrams/govarbitrage` · team `3VAV3KMNZK`
-Paste these into App Store Connect after `eas submit` creates the app record.
-
-## Name (30 char max)
-GovArbitrage
-
-## Subtitle (30 char max)
-Underpriced gov auctions
-
-## Primary category
-Business · Secondary: Finance
-
-## Promotional text (170 char max — editable anytime without review)
-Government surplus, seized, and foreclosure auctions from dozens of agencies — scored and
-ranked so the underpriced lots surface first. Find the deal before the crowd does.
-
-## Description
-GovArbitrage turns a fragmented, hard-to-monitor corner of the public market into a single
-opportunity dashboard. Government auctions — surplus, seized, and foreclosure listings
-scattered across dozens of agency portals — are pulled into one clean, searchable feed and
-scored so the lots most likely to be underpriced relative to real-world resale value rise to
-the top.
-
-Stop refreshing a dozen agency sites. Open one app, sort by opportunity, and see where the
-edge is right now.
-
-FEATURES
-• Opportunity feed — every active government auction in one consistent, searchable list,
- sorted so the best-scored deals lead.
-• Opportunity scoring — each lot is graded against comparable market value, so underpriced
- items are obvious at a glance.
-• Deep listing detail — full valuation, estimated cost breakdown and profit, recommended max
- bid, risk read, and links straight to the original auction.
-• Live pull-to-refresh — the feed stays current as new lots are identified and scored.
-• Private by design — the app does no tracking and shows no ads. Nothing personal leaves your
- device.
-
-Whether you resell, flip, or just love a good public-market deal, GovArbitrage makes the
-best government-auction opportunities easy to find.
-
-## Keywords (100 char max, comma-separated, no spaces)
-auction,government,surplus,seized,gsa,arbitrage,deals,resale,liquidation,flip,wholesale,bidding
-
-## Support URL
-https://auctions.agentabrams.com
-
-## Marketing URL (optional)
-https://auctions.agentabrams.com
-
-## Privacy Policy URL
-https://auctions.agentabrams.com/privacy
-
-## App Privacy questionnaire (Data types)
-Data Not Collected. The app links no analytics or ad SDKs, performs NO tracking, and shows no
-in-app advertising. The only data the app stores is the API server URL and (optional) access
-credentials the user types in Settings — held encrypted on-device via expo-secure-store and
-sent only to the user's configured server. It is never collected by us or a third party.
-Declare "Data Not Collected."
-
-## Age rating
-4+ (no objectionable content). Confirm during the ASC questionnaire.
-
-## Review notes (for App Review)
-• This is a NATIVE app over the auctions.agentabrams.com public JSON API (opportunities list,
- listing detail, settings) — not a website wrapper (Guideline 4.2). There is NO WebView in
- the app; the only outbound is opening an auction's source URL in Safari (Linking.openURL).
-• No sign-in is required to use the app. It ships pointed at the live default server
- (https://auctions.agentabrams.com) and renders real data on first launch — a reviewer can
- exercise the full app immediately with no account.
-• There is no user account created by the app, so Guideline 5.1.1(v) (in-app account
- deletion) does not apply. The Settings "credentials" field is just an optional API auth
- value for the user's own server, stored on-device.
-• The app contains NO in-app purchase and NO external-purchase link. Any "free tier / paid
- tier" labels are display-only; billing (if any) is handled server-side on the website, not
- in the binary — no Guideline 3.1.1 concern as shipped.
-• Export compliance: uses only standard HTTPS/system crypto — ITSAppUsesNonExemptEncryption
- is set to false in Info.plist.
-
-## Screenshots (STILL NEEDED before Submit for Review)
-Required sizes: 6.7" (1290×2796) and 6.5" (1242×2688). Capture from a simulator run of the
-Opportunities feed, a listing detail (valuation + cost breakdown + max-bid callout), and the
-Settings screen. (Say the word — I'll boot the sim and shoot these.)
diff --git a/govarbitrage/apps/mobile/ASC-PASTE-KIT.md b/govarbitrage/apps/mobile/ASC-PASTE-KIT.md
deleted file mode 100644
index d3d0027..0000000
--- a/govarbitrage/apps/mobile/ASC-PASTE-KIT.md
+++ /dev/null
@@ -1,288 +0,0 @@
-# ASC PASTE KIT — GovArbitrage (iOS 1.0) ✅ CORRECTED 2026-08-07
-
-App record **6799165231** · bundle `com.abrams.govarbitrage` · EAS `@agentabrams/govarbitrage` · team `3VAV3KMNZK`
-Inflight: https://appstoreconnect.apple.com/apps/6799165231/distribution/ios/version/inflight
-
----
-
-## 🟥 CURRENT STATE — Apple **Guideline 2.1 · Information Needed** (captured 2026-09-01) — SUPERSEDES the pre-submission checklists below
-
-Build 5 was submitted and **entered review**; on **2026-09-01** App Review returned **Guideline 2.1 – Information Needed** (App Completeness). This is a **request for information plus a video** — it is NOT a reported code/web defect and NOT a request for a new binary. Everything below framed as "4 blockers / Add for Review → Submit" is **pre-submission history, kept for reference only, and marked SUPERSEDED** — it does not apply until this 2.1 reply is sent.
-
-> **On verbatim text:** the exact Resolution Center prose sits behind **View Submission** and was **not** captured to file (read-only console diagnosis only; a screenshot of the Rejected banner exists at `/private/tmp/tk10279-isolated.png`, not committed). The **itemized requirements** below are what WAS captured — from the TK-10279 blocker (`evidence_at` 2026-09-01T21:06Z) and the capture note (2026-09-01T21:49Z). Do not treat the wording here as a verbatim quote.
-
-**Apple's Guideline 2.1 message requested one recording + six disclosures:**
-1. **A screen recording of the app in use on a physical device running the latest OS** (simulators do not satisfy this).
-2. **Which specific device(s) and OS version** were used to test the app.
-3. The app's **main features / functionality**, its **intended audience**, and its **value / purpose** to the user.
-4. What **setup or access** is required to fully use the app (demo credentials, hardware, backend).
-5. What **external services / third-party integrations** the app uses.
-6. Whether the app's behavior/content is **consistent across all regions** where it is available (or region-specific).
-7. Whether the app accesses/provides any **regulated, protected, or licensed material** — with an explanation.
-
-**Two deliverables clear this, both drafted in this file:**
-- **(A)** the physical-device recording → see **“Physical Recording Shot List — Guideline 2.1”** below.
-- **(B)** the reply text → see **“Guideline 2.1 Reply (paste)”** below.
-
-Sending the reply and uploading the video are **customer-facing, Apple-account actions** and remain **Steve's** — the Claude Code harness hard-gates all live App Store Connect writes. No agent has replied, uploaded, or resubmitted.
-
----
-
-> ⚠️ This file SUPERSEDES the earlier draft that said "Data Not Collected." That was WRONG —
-> the app has optional **Sign in with Apple** (`usesAppleSignIn: true`; `expo-apple-authentication`;
-> `lib/auth.ts` requests FULL_NAME+EMAIL; `/api/auth/apple` stores appleSub+email+name). Declaring
-> "collects nothing" contradicts the binary and risks a post-approval pull. Use the App Privacy
-> block below (Email + Name + User ID, App Functionality only). Verified against source 2026-08-07.
-
-Live-state verified today via ASC API + curl:
-- **Build 5 = UPLOADED & VALID** (uploaded 2026-08-07 09:41, not expired) → just ATTACH it, no rebuild.
-- Privacy URL `…/privacy` → **200** · Support `…` → **200** · `/api/listings` → **200** (reviewer sees live data, no login).
-
-> ✅ **FREE-CLIENT DEPLOY DONE + VERIFIED LIVE (2026-08-08).** The former 2.3.1/3.1.1 blocker
-> (reviewer sees an EMPTY analysis because the server redacted money-math for the FREE tier) is
-> CLEARED. Fix `0d630cf` is live on auctions.agentabrams.com. Verified via curl 2026-08-08:
-> app-client (Authorization header) → `scores: 9, costBreakdown: yes, gated: false` (reviewer
-> sees full money-math); browser (no header) → `gated: true` (paywall intact). Deploy memo now
-> in `pending-approval/_done/`. **Screenshots + submit are no longer deploy-blocked.**
->
-> 📋 **LIVE ASC STATE — read-only API discovery 2026-08-08 (app 6799165231, version 1.0 PREPARE_FOR_SUBMISSION).**
-> Most of the listing is ALREADY SET in the console. Confirmed present: build 5 attached,
-> description (1826 chars), keywords, promo text, support+marketing URLs, name, categories
-> (Business/Finance), privacy-policy URL, **Pricing schedule = SET**, **Content Rights = USES_THIRD_PARTY_CONTENT**
-> (that judgment call is already made — the app rehosts listing photos), Export Compliance = false (non-exempt=No),
-> iPhone 6.7"/6.9" screenshots (3 shots). Age-rating declaration exists.
->
-> ⛔ **SUPERSEDED (pre-submission history, 2026-08-08).** These four items were the *pre-submission* gaps; build 5 was later submitted, reviewed, and returned under **Guideline 2.1 · Information Needed** (see CURRENT STATE at top). The metadata paste blocks further down remain valid reference, but this "4 blockers → Submit" flow no longer describes the state — the 2.1 reply + recording do.
->
-> 🔴 **TRUE remaining GovArbitrage blockers — exactly 4 (all Steve ASC-console; harness blocks agent writes to Apple):**
-> 1. **Subtitle** is EMPTY → paste `Gov surplus auction arbitrage` (App Information → Localizable → Subtitle).
-> 2. **iPad screenshots** = NONE, but build 5 is `supportsTablet:true` → upload the local `ipad-13/` set (2064×2752). *(6.5" iPhone is OPTIONAL — the 6.7"/6.9" set already back-fills it.)*
-> 3. **App Privacy** questionnaire = 0 data usages → declare **Email + Name + User ID** (Contact/Identifiers, linked, App Functionality, tracking = No) per the App Privacy block below. Apple blocks submit until this is answered.
-> 4. **App Review contact info** = NONE → your name/email/phone + the Notes paste block below.
-> Then **Add for Review → Submit** (build 5 attaches in one click — already attached).
->
-> ⚠️ NOTE: an agent CANNOT do these — the Claude Code harness hard-blocks live App Store Connect
-> external writes even under a verbal "ungate" (correct: outward-facing, hard-to-reverse). Ignore the
-> earlier "one-click / nothing missing" framing; this discovered list is authoritative.
-
----
-
-## ⛔ SUPERSEDED · ASC click-list for Steve (in order) — everything here is a console action (Apple-account gate)
-
-> **SUPERSEDED (pre-submission).** This checklist described first-time submission and is kept for reference. The app is now in a **Guideline 2.1 · Information Needed** state — the actionable path is the 2.1 reply + physical recording (top of file), not this "Add for Review → Submit" list. The paste blocks it references (Name/Subtitle/Description/Privacy/Notes) are still accurate.
-
-- [ ] **Build → Add Build → select build 5** (it's already uploaded & VALID; one click).
-- [ ] **Name** → paste block.
-- [ ] **Subtitle** → paste block.
-- [ ] **Promotional Text** → paste block.
-- [ ] **Keywords** → paste block.
-- [ ] **Description** → paste block.
-- [ ] **Support URL** + **Marketing URL** → paste block.
-- [ ] **App Information → Category**: Primary **Business**, Secondary **Finance**.
-- [ ] **App Information → Privacy Policy URL** → `https://auctions.agentabrams.com/privacy`.
-- [ ] **App Information → Content Rights** → see the "Content Rights" note below (one judgment call).
-- [ ] **App Privacy** → the **YES / Email+Name+User ID** block below (NOT "Data Not Collected").
-- [ ] **Age Rating** → run questionnaire, all "None" → 4+.
-- [ ] **App Review Information → Contact** (your name/email/phone) + **Notes** (paste block) + Sign-In required = **No**.
-- [ ] **Export Compliance** → non-exempt encryption = **No**.
-- [x] **Pricing and Availability → Price = Free** — ✅ ALREADY SET (confirmed via ASC API 2026-08-08). No action.
-- [ ] **App Privacy** → declare Email + Name + User ID (see block below) — ❗questionnaire currently EMPTY, hard submit blocker.
-- [ ] **Screenshots** → upload **iPad 13"** (`ipad-13/`, REQUIRED — build 5 is `supportsTablet:true`; currently NONE in ASC). iPhone 6.7"/6.9" ✅ already uploaded (3 shots). 6.5" optional (back-filled by 6.9").
-- [ ] **Add for Review → Submit.**
-
----
-
-## Name — (12/30)
-```
-GovArbitrage
-```
-
-## Subtitle — (29/30)
-```
-Gov surplus auction arbitrage
-```
-
-## Promotional Text — (156/170) *(editable anytime without review)*
-```
-Turn government surplus auctions into ranked flip opportunities — all-in cost, resale value, ROI, and your max bid computed for every lot. Bid on math, not vibes.
-```
-
-## Keywords — (99/100) *(comma-separated, no spaces)*
-```
-surplus,auction,arbitrage,resale,flip,govdeals,gsa,reseller,liquidation,valuation,roi,bid,wholesale
-```
-
-## Description — (~1650/4000) *(feature-accurate — verified against app/listing/[id].tsx + lib/types.ts)*
-```
-GovArbitrage turns messy government-surplus auctions into clear, ranked flip opportunities. Point it at a lot and it answers the only question that matters: if you win at the current bid, what is your all-in cost, what can you resell it for, how fast, and how much do you actually make?
-
-WHAT IT DOES
-• Aggregates listings from major government auction sources — GovDeals, GSA Auctions, Public Surplus, Municibid, Bid4Assets, and county / state / university surplus.
-• Identifies what each lot actually is from its title and photos, then anchors it to a real new-retail price.
-• Builds a full valuation ladder — replacement, average, and used-market resale across sell-today, 7-, 30-, and 90-day horizons, with an expected sale price, probability of sale, and days-to-sold.
-• Breaks down 20+ real costs — buyer's premium, sales tax, shipping, freight, packing, pickup labor, testing, repairs, marketplace and payment fees, storage — into total investment, net profit, ROI, and annualized return.
-• Back-solves your recommended max bid from a target ROI, so you know your ceiling before you bid.
-• Ranks every lot across nine opportunity profiles — Best Arbitrage, Quick Flip, Collector, Local Pickup, Easy Freight, Parts Only, High Confidence, High Profit, and Overall Opportunity — each with plain-English reasoning.
-
-WHY IT IS DIFFERENT
-The numbers come from deterministic, explainable engines — not a black box. Every value and every cost is transparent and traceable, so you can trust the recommended bid instead of eyeballing it.
-
-PRIVACY-FIRST
-No tracking. No ads. No analytics or advertising SDKs. The app works fully without an account; optional Sign in with Apple is used only to authenticate you.
-
-GovArbitrage is built for resellers, flippers, and surplus buyers who want to stop guessing and start bidding on math.
-```
-
-## Support URL
-```
-https://auctions.agentabrams.com
-```
-
-## Marketing URL *(optional)*
-```
-https://auctions.agentabrams.com
-```
-
-## Privacy Policy URL ✅ verified 200
-```
-https://auctions.agentabrams.com/privacy
-```
-
-## Categories
-```
-Primary: Business
-Secondary: Finance
-```
-
-## Pricing and Availability ⚠️ live-validation 2026-08-08 found this UNSET (hard submit blocker)
-```
-Price: Free (Tier 0)
-Availability: All territories (default)
-No in-app purchases — GovArbitrage ships as a FREE CLIENT (the "free client" decision).
-```
-
-## Age Rating
-```
-4+ — answer every content item "None"; capability questions "No"
-(Unrestricted Web Access = No; Simulated Gambling = None; Made for Kids = No)
-```
-
----
-
-## App Privacy ✅ CORRECT ANSWER (do NOT use "Data Not Collected")
-
-"Do you or your third-party partners collect data from this app?" → **YES**
-
-Check EXACTLY these three data types — each collected ONLY via optional Sign in with Apple:
-
-| Data type | Category | Linked to identity? | Used for tracking? | Purpose |
-|----------------|---------------|---------------------|--------------------|------------------|
-| Email Address | Contact Info | Yes | No | App Functionality|
-| Name | Contact Info | Yes | No | App Functionality|
-| User ID | Identifiers | Yes | No | App Functionality|
-
-Leave everything else UNCHECKED (no Usage Data, no Diagnostics/Crash, no Location, no Financial
-Info, no Purchases, no Device IDs, no Advertising Data — the app links no analytics/ads SDKs).
-Tracking question → **No** (no ATT prompt required).
-Note: even if a user picks Apple "Hide My Email," you still store an email-format address → still declare Email Address.
-
-## Export Compliance
-```
-Uses non-exempt encryption? → NO
-(standard HTTPS/system crypto only; Info.plist ITSAppUsesNonExemptEncryption = false — no docs upload)
-```
-
-## Content Rights (App Information) ⚠️ one judgment call for Steve
-The app renders government-auction listing data (titles/specs are public records) and can show
-"Listing photos" pulled from the source auctions. Two truthful options:
-- If the app only shows public government-auction FACTS + links out to the source → answer
- **"No, it does not contain, show, or access third-party content."**
-- If it re-displays third-party auction PHOTOS in-app (it renders a "Listing photos" section) →
- answer **"Yes, it contains third-party content"** and confirm you have the rights/permission.
-Recommendation: pick based on whether build 5 actually rehosts source photos. Flagging because
-attesting rights to third-party auction photos is the one place this could bite.
-
-## App Review Information → Notes *(paste)*
-```
-GovArbitrage is a read-only analyst client for PUBLIC U.S. government-surplus auction listings. No account or sign-in is required to review the app.
-
-HOW TO TEST
-1) Launch the app and open the "Listings" tab. It loads live government-surplus auction opportunities immediately — the app ships preconfigured to our public API server (https://auctions.agentabrams.com), so there is no setup or login step.
-2) Tap any listing to see the full analysis: all-in cost breakdown, resale value across 7/30/90-day horizons, expected net profit, ROI, recommended max bid, and nine opportunity scores.
-3) The "Settings" tab shows the server URL plus an OPTIONAL username/password, used only by people who self-host their own GovArbitrage server. These are NOT required for review — no credentials are needed; leave those fields blank / at their defaults and data loads.
-
-PRIVACY: No tracking, no ads, no analytics SDKs. The app works without an account; the optional "Sign in with Apple" stores only your Apple ID and (if shared) name/email to authenticate you. Full policy: https://auctions.agentabrams.com/privacy
-```
-
-## App Review Information → other fields
-```
-Sign-In required: No (toggle OFF)
-Contact: your name / email / phone
-```
-
----
-
-## Physical Recording Shot List — Guideline 2.1 *(physical device, LATEST OS — simulators do not satisfy Apple)*
-
-**Device:** iPhone `00008150-001039662E3B401C` running **iOS 26.6.1** (latest OS installed on this device).
-**App under test:** GovArbitrage 1.0 (**build 5**, EAS cloud build) — install via TestFlight; there is no local `.ipa` to side-load (Steve's on-device action if not already installed).
-**Length:** ~30–60s, one continuous take, portrait, physical device only. Capture with QuickTime (New Movie Recording → iPhone source) or the on-device screen recorder, or the scripted `device-proof-evidence/capture-lib.sh` (ffmpeg + AVFoundation). Save as `govarbitrage-device-proof-<ISO>.mov` + key still frames.
-
-Journey (verified against source: `app/(tabs)/index.tsx`, `app/listing/[id].tsx`, `app/(tabs)/settings.tsx`, `lib/auth.ts`):
-
-1. **Cold launch** — from the home screen, tap the app icon; show the splash resolve into the app (proves it launches clean on the device).
-2. **Opportunities tab** (`(tabs)/index`) — live government-surplus listings load immediately with **no login / no setup** (app ships preconfigured to `https://auctions.agentabrams.com`). Pause on the feed; optionally touch a sort chip.
-3. **Open a listing** (`listing/[id]`) — scroll slowly through the full analysis so the reviewer sees the core value: **Recommended Max Bid** callout, **Valuation** ladder (7/30/90-day), **Cost Breakdown & Profit** (all-in cost → net profit → ROI), and the **Scores** grid (nine opportunity profiles).
-4. **Settings tab** (`(tabs)/settings`) — show the server URL default, then run **Connection Test** (`handleTest` → `testConnection`) and let it return success (proves the live backend works with no credentials).
-5. **(Optional) Sign in with Apple availability** — scroll to show the **Sign in with Apple** button is **present/available** in Settings. **DO NOT tap it / do not complete sign-in** — the recording only proves the optional auth is *available*, per the TK-10279 gates.
-
-> Gate reminder: read-only device inspection + local screen recording ONLY. No ASC write, no Resolution Center reply, no binary upload, no resubmit, and no completed identity action.
-
----
-
-## Guideline 2.1 Reply (paste) — App Review response *(draft; Steve pastes into Resolution Center — sending is Steve's gated action)*
-
-*Facts below are verified against the mobile source and the live API; no reviewer credentials are required — the app loads live data with no login.*
-
-```
-Thank you for reviewing GovArbitrage. The requested information is below, and a screen recording of the app running on a physical iPhone (iOS 26.6.1) is attached to this Resolution Center response.
-
-1) DEVICE(S) AND OS TESTED
-Physical iPhone running iOS 26.6.1 (the latest OS on our test device). Version reviewed: 1.0 (build 5). The binary also supports iPad.
-
-2) MAIN FEATURES, INTENDED AUDIENCE, AND VALUE
-Features: GovArbitrage is a read-only analyst client for PUBLIC U.S. government-surplus auction listings. It aggregates listings from public government and institutional surplus sources (GovDeals, GovPlanet, GSA Auctions, Public Surplus, GoIndustry, Municibid, Bid4Assets, and county/state/university surplus). For any lot it computes an all-in cost breakdown (buyer's premium, sales tax, shipping/freight, packing, fees, storage, and more), a resale-value ladder across 7/30/90-day horizons, expected net profit and ROI, a recommended maximum bid back-solved from a target ROI, and nine plain-English opportunity scores. All figures come from deterministic, explainable engines.
-Audience: resellers, flippers, and surplus buyers who evaluate government-surplus auction lots before bidding.
-Value: it turns messy public-auction listings into ranked, quantified flip opportunities so a buyer decides what to bid based on computed cost, resale value, and ROI instead of guessing.
-
-3) SETUP OR ACCESS REQUIRED
-None. No account or sign-in is required to review or use the app. It ships preconfigured to our public API server (https://auctions.agentabrams.com) and loads live listings on launch — open the Opportunities tab and data appears with no setup. The Settings tab shows the server URL and an OPTIONAL username/password used ONLY by people who self-host their own GovArbitrage server; these are not required for review — no credentials are needed, so leave those fields blank / at their defaults and data loads. "Sign in with Apple" is OPTIONAL and only authenticates a user; no feature requires it.
-
-4) EXTERNAL SERVICES / THIRD-PARTY INTEGRATIONS
-- Our own public backend API at https://auctions.agentabrams.com, which serves the aggregated public-auction data (the reviewer sees live data with no login).
-- Sign in with Apple (expo-apple-authentication) for optional authentication only.
-- The app displays "listing photos" that originate from the source auction listings (third-party content, declared under Content Rights = Uses Third-Party Content).
-There are no analytics SDKs, no advertising SDKs, and no tracking.
-
-5) REGIONAL CONSISTENCY
-The app behaves identically in every region where it is available (all territories). There are no region-locked features and no per-region content gating. The interface is English and the content is public government/institutional surplus-auction listings, predominantly U.S.
-
-6) REGULATED, PROTECTED, OR LICENSED MATERIAL
-The app does not provide any regulated, licensed, or age-restricted material (no gambling, no financial-account services, no medical or similar content). It surfaces PUBLIC government-surplus auction facts — titles and specifications are public records — and rehosts listing photos from the source auctions, which is disclosed under Content Rights = Uses Third-Party Content. There is no user-generated content and no in-app purchases.
-
-Full privacy policy: https://auctions.agentabrams.com/privacy
-```
-
----
-
-## Screenshots — ✅ READY (generated 2026-08-07, all 3 money shots per size)
-All sets live in `apps/mobile/store-assets/screenshots/`. Content: (1) Opportunities feed,
-(2) Listing detail — valuation ladder + cost breakdown + recommended max-bid + scores, (3) Settings.
-
-| ASC display set | Dimensions | Folder | Notes |
-|-----------------|-----------|--------|-------|
-| **iPhone 6.9"** | 1320×2868 | `framed-*-6.9.png` | Primary iPhone set — upload these; back-fills 6.5" too |
-| **iPhone 6.5"** | 1242×2688 | `iphone-6.5/` | Literal 6.5" set (clears the explicit "6.5-inch iPhone" blocker) |
-| **iPad 13"** | 2064×2752 | `ipad-13/` | Required because build 5 has `supportsTablet:true`; designed frames |
-
-Upload iPhone (6.9" or 6.5") + iPad 13" and both screenshot blockers clear.
diff --git a/govarbitrage/apps/mobile/CLAUDE.md b/govarbitrage/apps/mobile/CLAUDE.md
deleted file mode 100644
index 43c994c..0000000
--- a/govarbitrage/apps/mobile/CLAUDE.md
+++ /dev/null
@@ -1 +0,0 @@
-@AGENTS.md
diff --git a/govarbitrage/apps/mobile/LICENSE b/govarbitrage/apps/mobile/LICENSE
deleted file mode 100644
index 30b20e3..0000000
--- a/govarbitrage/apps/mobile/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/govarbitrage/apps/mobile/app.json b/govarbitrage/apps/mobile/app.json
deleted file mode 100644
index 360fe3b..0000000
--- a/govarbitrage/apps/mobile/app.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
- "expo": {
- "name": "GovArbitrage",
- "slug": "govarbitrage",
- "version": "1.0.0",
- "orientation": "portrait",
- "icon": "./assets/icon.png",
- "userInterfaceStyle": "dark",
- "ios": {
- "supportsTablet": false,
- "bundleIdentifier": "com.abrams.govarbitrage",
- "usesAppleSignIn": true,
- "infoPlist": {
- "ITSAppUsesNonExemptEncryption": false
- }
- },
- "android": {
- "adaptiveIcon": {
- "backgroundColor": "#0D1117",
- "foregroundImage": "./assets/android-icon-foreground.png",
- "backgroundImage": "./assets/android-icon-background.png",
- "monochromeImage": "./assets/android-icon-monochrome.png"
- },
- "package": "com.abrams.govarbitrage",
- "predictiveBackGestureEnabled": false
- },
- "web": {
- "favicon": "./assets/favicon.png"
- },
- "scheme": "govarbitrage",
- "plugins": [
- "expo-router",
- "expo-secure-store",
- "expo-apple-authentication",
- [
- "expo-splash-screen",
- {
- "image": "./assets/splash-icon.png",
- "backgroundColor": "#0D1117",
- "imageWidth": 200
- }
- ]
- ],
- "experiments": {
- "typedRoutes": true
- },
- "owner": "agentabrams",
- "extra": {
- "router": {},
- "eas": {
- "projectId": "4dd4b437-1325-49f8-b90a-1674e97a4b4b"
- }
- }
- }
-}
diff --git a/govarbitrage/apps/mobile/constants/theme.ts b/govarbitrage/apps/mobile/constants/theme.ts
deleted file mode 100644
index 6c7a31a..0000000
--- a/govarbitrage/apps/mobile/constants/theme.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * Dark, dense, financial-dashboard color palette.
- * Inspired by Bloomberg Terminal / trading cockpit aesthetics.
- */
-export const Colors = {
- bg: "#0D1117", // near-black background
- surface: "#161B22", // card/panel surface
- surfaceAlt: "#1C2128", // alternate surface (elevated)
- border: "#30363D", // subtle border
- borderStrong: "#484F58", // stronger border / divider
-
- // Text
- textPrimary: "#E6EDF3", // primary text
- textSecondary: "#8B949E", // muted / secondary
- textMuted: "#6E7681", // muted labels — ~4.7:1 on bg (WCAG AA); divider tone lives in borderStrong
-
- // Accent / brand
- accent: "#1F6FEB", // electric blue — action / link
- accentLight: "#388BFD",
-
- // Financial states
- profit: "#3FB950", // positive / gain (green)
- loss: "#F85149", // negative / risk (red)
- warning: "#D29922", // caution / medium risk (amber)
- neutral: "#8B949E", // neutral / unknown
-
- // Score color bands (0–100)
- scoreHigh: "#3FB950", // 70+
- scoreMid: "#D29922", // 40–69
- scoreLow: "#F85149", // 0–39
-
- // Source chips
- gsaColor: "#1F6FEB",
- govdealsColor: "#388BFD",
-
- // Risk badges
- riskLow: "#3FB950",
- riskMedium: "#D29922",
- riskHigh: "#F85149",
-
- // Rank badge
- rankGold: "#D29922",
- rankBg: "#21262D",
-} as const;
-
-export const Typography = {
- mono: "System", // will be overridden per-platform if needed
- sizes: {
- xs: 10,
- sm: 12,
- base: 14,
- md: 16,
- lg: 18,
- xl: 22,
- xxl: 28,
- },
-} as const;
-
-export const Spacing = {
- xs: 4,
- sm: 8,
- md: 12,
- lg: 16,
- xl: 24,
- xxl: 32,
-} as const;
-
-export const Radius = {
- sm: 4,
- md: 8,
- lg: 12,
- pill: 100,
-} as const;
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/.gitignore b/govarbitrage/apps/mobile/device-proof-evidence/.gitignore
deleted file mode 100644
index d6b1219..0000000
--- a/govarbitrage/apps/mobile/device-proof-evidence/.gitignore
+++ /dev/null
@@ -1,17 +0,0 @@
-# Physical-device recordings and transient capture state stay local.
-*.mov
-*.mp4
-ffmpeg.log
-rec.pid
-rec.path
-launch.txt
-
-# Raw device queries contain hardware identifiers and are reproducible.
-device-info.txt
-installed-apps.txt
-
-# Volatile live-API snapshots used to verify the reviewer journey.
-api-*.json
-first-listing-id.txt
-*.privacy-reviewed.sha256
-*.quarantined
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/CAPTURE-RUNBOOK.md b/govarbitrage/apps/mobile/device-proof-evidence/CAPTURE-RUNBOOK.md
deleted file mode 100644
index 8589543..0000000
--- a/govarbitrage/apps/mobile/device-proof-evidence/CAPTURE-RUNBOOK.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# GovArbitrage — Physical-Device Proof Capture Runbook (TK-10279)
-
-**Agent:** govarb-device-proof · **Device:** physical iPhone 17 Pro Max (iOS 26.6.1; identifier intentionally kept out of git)
-**App:** GovArbitrage · bundle `com.abrams.govarbitrage` · Build 5 (ASC cloud build; no local .ipa)
-
-## GATES (never cross)
-- ❌ No App Store Connect writes · ❌ No Resolution Center reply · ❌ No binary upload · ❌ No resubmit
-- ❌ Do not complete Sign in with Apple / any identity action — only prove it is *available*
-- ✅ Read-only device inspection + local screen recording + local evidence only
-
-## Precondition
-Device must be ONLINE (unlocked + "Trust This Computer" accepted). Monitored by dev-monitor.sh.
-Set `GOVARB_DEVICE_UDID` from `xcrun devicectl list devices` before sourcing the helpers.
-
-## Steps once ONLINE
-1. **Verify device identity/OS**
- `xcrun devicectl device info details --device "$GOVARB_DEVICE_UDID"`
- → capture productType, osVersionNumber, deviceName → save `device-info.txt`
-2. **Confirm app installed** (build 5 via TestFlight — cannot side-load, no local .ipa)
- `xcrun devicectl device info apps --device "$GOVARB_DEVICE_UDID" | grep -i govarbitrage`
- - Installed → proceed. Not installed → BLOCKER: build 5 must be installed on device
- via TestFlight (Steve action); cannot upload/install (gated). Surface + hold.
-3. **Start screen recording** of the physical device (QuickTime New Movie Recording → iPhone source,
- or Control Center on-device recording). Save MP4/MOV to this dir.
-4. **Launch app cold** `xcrun devicectl device process launch --device <UDID> com.abrams.govarbitrage`
-5. **Drive the required journey** (taps on device — human/XCUITest):
- cold launch → Opportunities list → open a listing → detail showing **valuation / cost / ROI / max bid**
- → Settings → **connection test** → (optional) show **Sign in with Apple availability** (do NOT sign in).
-6. **Stop recording**, save as `govarbitrage-device-proof-<ISO>.mov`, plus key still frames.
-7. Log every step to TK-10279 as TK_AGENT=govarb-device-proof. Report evidence path. Do NOT touch ASC.
-
-## 🔒 MANDATORY before ANY upload — privacy pre-scan (added 2026-09-03)
-The first recording passed codec validation but leaked a private Messages thread → rejected.
-`verify-recording.sh` is codec-only. So BEFORE treating any recording as uploadable:
-```
-bash device-proof-evidence/verify-recording.sh <file> # codec/duration/black
-bash device-proof-evidence/privacy-scan.sh <file> 1 # PII pre-scan (step=1s for the real screen)
-```
-`privacy-scan.sh` samples frames through a LOCAL vision model ($0) and exits nonzero if it sees a
-notification, Messages/SMS, a name, phone, email, or a visible password. **Verified 2026-09-03: it
-flags the quarantined PII recording (4 frames, rc=1).** Use step=1 for the final screen (a <3s
-notification banner can slip a coarser sample). A CLEAN pre-scan is NECESSARY, NOT SUFFICIENT — a
-human must still eyeball the whole recording before Steve replies to Apple.
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/COMPLETENESS-FINDING.md b/govarbitrage/apps/mobile/device-proof-evidence/COMPLETENESS-FINDING.md
deleted file mode 100644
index 5d851b5..0000000
--- a/govarbitrage/apps/mobile/device-proof-evidence/COMPLETENESS-FINDING.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# GovArbitrage — App-Completeness / Paywall Finding (TK-10279) — 2026-09-02
-
-Read-only probe of the LIVE backend the app depends on (https://auctions.agentabrams.com).
-No writes, no auth, no ASC actions.
-
-## FINAL VERDICT — the app is complete on a fresh free install
-
-The mobile app always sends an Authorization header, including `Basic Og==` for blank optional
-credentials. The server intentionally treats Basic/Bearer requests as native-app clients, so a fresh
-install receives the full valuation, cost, ROI, recommended-max-bid, scores, and research journey.
-No paid credential and no Sign in with Apple action are required. The browser-only observation below
-is retained as superseded diagnostic history and must not be used as the App Review conclusion.
-
-## Backend is healthy + content-rich (good 2.1 evidence)
-- `GET /api/listings` → **total: 2548** real opportunities, 25/page, `tier: FREE`.
-- Rows carry: id, source, title, category, condition, quantity, **currentBid, currentCost**, recommendedMaxBid, retailLow.
-
-## SUPERSEDED diagnostic: browser-style requests are gated
-- On the free/unauthenticated tier the detail endpoint returns `gated: true`, `costBreakdown: null`,
- `recommendedMaxBid: null`, `scores: []`. Confirmed identical across browser / okhttp / RN / no User-Agent
- — so it is NOT ungated by app User-Agent; only real auth ungates it.
-- List rows on free tier: `recommendedMaxBid`, `roi`, `retailLow`, score all **null** → the card shows
- **Current Bid only** (ROI / Max-Bid / Score blocks are conditionally hidden).
-- Detail screen with `costBreakdown` null renders **"Valuation data requires a paid tier."** and NO Max-Bid callout.
-
-## SUPERSEDED interpretation of ungate paths
-1. Sign in with Apple → Bearer JWT ← IDENTITY ACTION, gated-off per task
-2. Basic-auth username/password in Settings ← NOT an Apple-identity action
-3. Machine token: password prefixed `token:` → `x-import-token` header ← NOT an identity action
-
-## Why the superseded interpretation would have mattered
-A fresh reviewer install shows real listings + working nav + connection test, but EVERY analytic
-(valuation / cost / ROI / recommended max bid — the app's core value) is behind "requires a paid tier."
-That is a classic 2.1 trigger. To record the required valuation/cost/ROI/max-bid journey, the device
-must be authenticated to a paid tier via path 2 or 3 (NOT Apple sign-in). Needs a valid paid credential.
-
-## CORRECTION (same session, deeper trace) — the app is NOT gated; it is COMPLETE on free install
-Server logic `moneyMathVisible(tier) = tierDef.showMoneyMath || isAppClient()`, and
-`isAppClient() = request has an Authorization: Basic|Bearer header`. The mobile app ALWAYS sends one
-(getAuthHeaders → buildBasicAuthHeader even with empty creds = `Basic Og==`). So a FRESH FREE install
-IS an app-client → fully UNGATED. Browsers (no auth header) stay gated; the app never is.
-
-PROVEN by replicating the app's exact header (`Authorization: Basic Og==`) against LIVE prod:
-- detail `gated:false tier:FREE` → recommendedMaxBid **$103.93**, expectedNetProfit **$182.96**,
- totalInvestment $95.76, scores [92.66,88.46,88,82.07,80.19], research present.
-- list row → recommendedMaxBid $103.93, **roi 1.91 (191%)**, netProfit $182.96, opportunityScore 82.07, retailLow $252.
-
-Bottom line: the earlier "requires a paid tier" concern does NOT apply to the app. A plain fresh free
-install shows the FULL valuation/cost/ROI/max-bid journey with no sign-in. Strong 2.1-completeness evidence.
-Both recording passes will therefore look the same (app always ungated); a paid credential is NOT needed.
-Evidence: api-detail-appclient.json, api-listings-appclient.json.
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/DDI-UNBLOCK-CHECKLIST.md b/govarbitrage/apps/mobile/device-proof-evidence/DDI-UNBLOCK-CHECKLIST.md
deleted file mode 100644
index d95d2be..0000000
--- a/govarbitrage/apps/mobile/device-proof-evidence/DDI-UNBLOCK-CHECKLIST.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# DDI Unblock Checklist — clear CoreDeviceError 12040 for the 2.1 recording (TK-10279)
-
-**Device:** iPhone 17 Pro Max (iPhone18,2), iOS 26.6.1. Hardware identifiers are intentionally kept out of git.
-**Tooling verified (this Mac):** Xcode 26.6 · build **17F113** · devicectl 518.33 — DDI build **matches** iOS 26.6.x, and the device shows **`connected`** in `devicectl list devices`.
-
-## What the error means
-`CoreDeviceError 12040 — "developer disk image could not be mounted"` with matching Xcode ≠ a version problem. On iOS 17+/26 the DDI is personalized + mounted **on-device at connect time**, which requires the phone **unlocked, trusted, and with Developer Mode ON**. 12040 here = an on-device gate, not a Mac fix.
-
-## Do these on the iPhone, in order (Steve — on-device)
-1. **Unlock the phone and keep it unlocked** during the whole capture (auto-lock fights the mount).
-2. **Trust this Mac:** replug USB → tap **Trust** → enter passcode. (If no prompt: Settings ▸ General ▸ Transfer or Reset ▸ *Reset Location & Privacy* forces the prompt back.)
-3. **Enable Developer Mode:** Settings ▸ **Privacy & Security** ▸ **Developer Mode** ▸ **On** → phone reboots → after reboot confirm **On** and approve the prompt. *(Developer Mode only appears after a dev tool has connected once — it has here, so the toggle should be present.)*
-4. Let Xcode finish **"Preparing iPhone for development"** — open Xcode ▸ Window ▸ **Devices and Simulators**, select the phone, wait until it stops "Preparing…" and shows no yellow warning.
-
-## Re-verify from the Mac (read-only, safe to re-run)
-```sh
-export GOVARB_DEVICE_UDID="<copy from: xcrun devicectl list devices>"
-xcrun devicectl device info details --device "$GOVARB_DEVICE_UDID" # should now return full info, no 12040
-xcrun devicectl device info apps --device "$GOVARB_DEVICE_UDID" | grep -i govarb # confirm build 5 installed
-```
-- **Full info returns + govarbitrage listed →** unblocked; proceed to CAPTURE-RUNBOOK step 3 (record).
-- **Still 12040 →** device is locked or Developer Mode didn't stick; redo steps 1+3.
-- **Info OK but govarbitrage NOT listed →** build 5 isn't on the device: install it via **TestFlight** on the phone (Steve action — no local .ipa, cannot side-load). Then re-run.
-
-## Gates (unchanged — never cross)
-❌ No ASC writes · ❌ No Resolution Center reply/upload/resubmit · ❌ Do not complete Sign in with Apple (prove availability only) · ✅ read-only device inspection + local recording only.
-
-## Then (Steve's gated console step, after recording exists)
-Paste `../ASC-PASTE-KIT.md` → "Guideline 2.1 Reply (paste)" + attach the recording in App Store Connect ▸ Resolution Center ▸ reply to review.
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/EVIDENCE-INDEX.md b/govarbitrage/apps/mobile/device-proof-evidence/EVIDENCE-INDEX.md
deleted file mode 100644
index 0c49794..0000000
--- a/govarbitrage/apps/mobile/device-proof-evidence/EVIDENCE-INDEX.md
+++ /dev/null
@@ -1,96 +0,0 @@
-# GovArbitrage — Physical-Device Proof Evidence Index (TK-10279)
-
-Owner: govarb-device-proof · Device: iPhone 17 Pro Max (iPhone18,2), iOS 26.6.1 · App: com.abrams.govarbitrage
-GATES HELD THROUGHOUT: no App Store Connect write / reply / upload / resubmit; no Apple identity action.
-
-## SAFETY HOLD — first physical recording rejected
-
-The 34.99-second XCUITest attachment is **not valid submission evidence**. Independent visual review
-found a personal notification and a private Messages conversation with visible identifying content;
-the clip also does not show the full promised GovArbitrage journey. It is quarantined locally as
-`REJECTED-PII-DO-NOT-UPLOAD.mov.quarantined` and must never be uploaded. A clean physical recording
-with Focus/Do Not Disturb and notification previews hidden is still required.
-
-The five physical screenshots are diagnostic-only, not submission-ready proof: Settings captures show
-a configured username and masked password field, while the detail capture renders dashes for Max Bid
-and valuation rows. Do not upload these as the claimed full journey. The replacement recording must use
-blank/default optional credentials and visibly populated detail analytics.
-
-## Status: app INSTALLED on the physical device (both fixes) — clean privacy-reviewed journey recording pending
-
-### Milestones achieved autonomously (2026-09-02 PM)
-1. **Device identity verified** → `device-info.txt` (iPhone 17 Pro Max, iOS 26.6.1, dev mode enabled).
-2. **App-completeness proven** (strong 2.1 evidence) → `COMPLETENESS-FINDING.md`, `api-*-appclient.json`.
- Live backend = 2,548 real opportunities; the app is an app-client (sends `Authorization: Basic Og==`)
- so a FRESH FREE install is fully UNGATED and shows the full analytics: Max Bid $103.93, ROI 191%,
- Net Profit $182.96, cost breakdown, scores. The app is complete as shipped.
-3. **Native build fixed** (SDK57 prebuilt-XCFramework failure) → `ios/Podfile.properties.json`
- `buildReactNativeFromSource=true` + `EXPO_USE_PRECOMPILED_MODULES=false`.
-4. **Signed dev build built + INSTALLED on the physical iPhone** via the ASC key (`72Y2TZT54R`,
- `-allowProvisioningUpdates`, Steve-approved in session) — **no TestFlight, no ASC submission**.
- Build carries BOTH fixes: the from-source build fix AND the critical %-display fix (`389c347`,
- which build 5 in ASC lacks). Logs: `device-signed-build.log`, `device-install.log`.
-5. **Simulator full-journey recording** (supplementary) → `govarbitrage-SIMULATOR-dryrun-*.mov` (36.4s)
- + `still-01..04-*.png`. Real live data: List 2,516 · Detail iMac Max Bid $104 + Valuation ·
- Settings connection test + Sign-in-with-Apple AVAILABLE (not tapped). Writeup: `SIM-DRYRUN-FINDINGS.md`.
-6. Physical-device screenshot tooling ready (`idevicescreenshot` via libimobiledevice).
-
-### Historical capture plan (superseded by the safety hold above)
-The physical iPhone auto-locks, and launching/screenshotting/recording all require it UNLOCKED; the
-per-screen journey navigation needs taps (devicectl can't open deep-links on device). So the final
-physical-device *journey* recording is a ~60-second human step:
- 1. Set Auto-Lock → Never, keep the phone unlocked (USB-connected).
- 2. Either let the armed monitor auto-capture while you tap through Opportunities → a listing
- (Max Bid/Valuation/Cost/ROI) → Settings → connection test → show Sign-in-with-Apple available,
- OR use iOS Control Center Screen Recording on the phone and AirDrop the .mov here.
-The unlock-capture monitor auto-launches the app + bursts device screenshots on each unlock window.
-
-### Gate reminder
-Attaching the recording + replying to Apple + any resubmit is the ONLY remaining ASC step and stays
-Steve-gated — it will be drafted to pending-approval, never auto-fired.
-
----
-
-## REJECTED CAPTURE ATTEMPT — 2026-09-02 ~17:00 (govarb-xcuitest)
-
-XCUITest successfully produced diagnostic screenshots, but it did **not** produce acceptable App Review
-evidence. The screenshots expose configured credentials and show unpopulated analytics; the subsequent
-video exposed private content and did not complete the promised journey. The mechanics below are retained
-only to help produce a clean replacement. A standalone
-throwaway XCUITest drives the installed app by bundle id and captures each screen IN-PROCESS via
-`XCUIScreen.main.screenshot()` (bypasses the dead idevicescreenshot/DDI path on iOS 26). No human
-tapping required while the phone is unlocked.
-
-Project (scratch, does NOT touch the shared Xcode project):
- .../scratchpad/GovArbUITest/ (single UI-testing target, team 3VAV3KMNZK, bundle
- com.abrams.govarbitrage.uitests; signed via ASC key 72Y2TZT54R + -allowProvisioningUpdates).
-Run: `xcodebuild test -scheme GovArbUITests -destination 'platform=iOS,id=00008150-001039662E3B401C' ...`
-
-Captured for diagnostics only (run passed technically; rejected for submission after visual review):
- - device-journey-1-cold-launch-opportunities-2026-09-02T16-59-00.png (2492 active listings, live)
- - device-journey-2-detail-maxbid-valuation-2026-09-02T16-59-00.png (Late 2013 iMac detail:
- RECOMMENDED MAX BID + VALUATION rows New/Avg Retail, Used Low/Avg/High, Wholesale)
- - device-journey-3-settings-2026-09-02T16-59-00.png (full Settings screen)
- - device-journey-4-settings-connection-test-2026-09-02T16-59-00.png (Settings, Test Connection btn)
- - device-journey-5-siwa-available-2026-09-02T16-59-00.png (Sign in with Apple present)
- Sign-in-with-Apple asserted EXISTS, never tapped. The Settings screen shows BOTH the Test Connection
- button AND the SIWA button simultaneously, so shots 3/4/5 each contain their required control.
-
-GATES HELD: no ASC submit/reply/upload/resubmit, no Apple identity beyond dev signing, no prod/data
-writes, no remote push. App ran on live data (ungated app-client).
-
-ONE gap (optional, blocked on device lock): shots 4/5 show the PRE-tap Settings state. The follow-up
-run that adds a coordinate-tap on "Test Connection" (to capture the post-tap connection RESULT banner)
-failed at preflight with "Unlock iPhone (6) to Continue" — the phone auto-locked. To capture that
-banner: set Auto-Lock → Never, unlock, then re-run the same xcodebuild test command. The screenshot
-journey itself needs no human taps anymore.
-
-### RESOLVED 2026-09-02 23:32 — post-tap connection banner captured
-The optional gap is closed. A background watcher retried the XCUITest until the phone was unlocked
-(caught on attempt 32) and captured the full journey INCLUDING the post-tap result:
-`device-journey-4-settings-connection-test-2026-09-02T23-32-20.png` now shows the green
-"● Connected · 2030ms · Tier: PREMIUM" banner under the Test Connection button (live test vs
-auctions.agentabrams.com succeeded). Final verified set (all @2026-09-02T23-32-20):
- device-journey-1-cold-launch-opportunities / 2-detail-maxbid-valuation / 3-settings /
- 4-settings-connection-test (post-tap Connected banner) / 5-siwa-available.
-Stale pre-tap 16-59 set removed. Task #1 fully complete; all hard gates held.
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/project.pbxproj b/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/project.pbxproj
deleted file mode 100644
index 7378945..0000000
--- a/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,223 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 56;
- objects = {
-
-/* Begin PBXBuildFile section */
- 1A0000000000000000000041 /* GovArbUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A0000000000000000000040 /* GovArbUITests.swift */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXFileReference section */
- 1A0000000000000000000020 /* GovArbUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GovArbUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
- 1A0000000000000000000040 /* GovArbUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GovArbUITests.swift; sourceTree = "<group>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 1A0000000000000000000052 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 1A0000000000000000000030 = {
- isa = PBXGroup;
- children = (
- 1A0000000000000000000032 /* GovArbUITests */,
- 1A0000000000000000000031 /* Products */,
- );
- sourceTree = "<group>";
- };
- 1A0000000000000000000031 /* Products */ = {
- isa = PBXGroup;
- children = (
- 1A0000000000000000000020 /* GovArbUITests.xctest */,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 1A0000000000000000000032 /* GovArbUITests */ = {
- isa = PBXGroup;
- children = (
- 1A0000000000000000000040 /* GovArbUITests.swift */,
- );
- path = GovArbUITests;
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 1A0000000000000000000010 /* GovArbUITests */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 1A0000000000000000000061 /* Build configuration list for PBXNativeTarget "GovArbUITests" */;
- buildPhases = (
- 1A0000000000000000000050 /* Sources */,
- 1A0000000000000000000052 /* Frameworks */,
- 1A0000000000000000000051 /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = GovArbUITests;
- productName = GovArbUITests;
- productReference = 1A0000000000000000000020 /* GovArbUITests.xctest */;
- productType = "com.apple.product-type.bundle.ui-testing";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 1A0000000000000000000001 /* Project object */ = {
- isa = PBXProject;
- attributes = {
- BuildIndependentTargetsInParallel = 1;
- LastSwiftUpdateCheck = 2600;
- LastUpgradeCheck = 2600;
- TargetAttributes = {
- 1A0000000000000000000010 = {
- CreatedOnToolsVersion = 26.0;
- };
- };
- };
- buildConfigurationList = 1A0000000000000000000060 /* Build configuration list for PBXProject "GovArbUITest" */;
- compatibilityVersion = "Xcode 14.0";
- developmentRegion = en;
- hasScannedForEncodings = 0;
- knownRegions = (
- en,
- Base,
- );
- mainGroup = 1A0000000000000000000030;
- productRefGroup = 1A0000000000000000000031 /* Products */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 1A0000000000000000000010 /* GovArbUITests */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- 1A0000000000000000000051 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 1A0000000000000000000050 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 1A0000000000000000000041 /* GovArbUITests.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin XCBuildConfiguration section */
- 1A0000000000000000000070 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = dwarf;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_TESTABILITY = YES;
- GCC_C_LANGUAGE_STANDARD = gnu11;
- GCC_OPTIMIZATION_LEVEL = 0;
- IPHONEOS_DEPLOYMENT_TARGET = 17.0;
- ONLY_ACTIVE_ARCH = YES;
- SDKROOT = iphoneos;
- SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- };
- name = Debug;
- };
- 1A0000000000000000000071 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu11;
- IPHONEOS_DEPLOYMENT_TARGET = 17.0;
- SDKROOT = iphoneos;
- SWIFT_COMPILATION_MODE = wholemodule;
- SWIFT_OPTIMIZATION_LEVEL = "-O";
- VALIDATE_PRODUCT = YES;
- };
- name = Release;
- };
- 1A0000000000000000000072 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = 3VAV3KMNZK;
- GENERATE_INFOPLIST_FILE = YES;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.abrams.govarbitrage.uitests;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_EMIT_LOC_STRINGS = NO;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Debug;
- };
- 1A0000000000000000000073 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = 3VAV3KMNZK;
- GENERATE_INFOPLIST_FILE = YES;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.abrams.govarbitrage.uitests;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_EMIT_LOC_STRINGS = NO;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 1A0000000000000000000060 /* Build configuration list for PBXProject "GovArbUITest" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1A0000000000000000000070 /* Debug */,
- 1A0000000000000000000071 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 1A0000000000000000000061 /* Build configuration list for PBXNativeTarget "GovArbUITests" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1A0000000000000000000072 /* Debug */,
- 1A0000000000000000000073 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 1A0000000000000000000001 /* Project object */;
-}
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 919434a..0000000
--- a/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Workspace
- version = "1.0">
- <FileRef
- location = "self:">
- </FileRef>
-</Workspace>
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/xcshareddata/xcschemes/GovArbUITests.xcscheme b/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/xcshareddata/xcschemes/GovArbUITests.xcscheme
deleted file mode 100644
index 4719919..0000000
--- a/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/xcshareddata/xcschemes/GovArbUITests.xcscheme
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
- LastUpgradeVersion = "2600"
- version = "1.7">
- <BuildAction
- parallelizeBuildables = "YES"
- buildImplicitDependencies = "YES">
- <BuildActionEntries>
- <BuildActionEntry
- buildForTesting = "YES"
- buildForRunning = "NO"
- buildForProfiling = "NO"
- buildForArchiving = "NO"
- buildForAnalyzing = "NO">
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "1A0000000000000000000010"
- BuildableName = "GovArbUITests.xctest"
- BlueprintName = "GovArbUITests"
- ReferencedContainer = "container:GovArbUITest.xcodeproj">
- </BuildableReference>
- </BuildActionEntry>
- </BuildActionEntries>
- </BuildAction>
- <TestAction
- buildConfiguration = "Debug"
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- shouldUseLaunchSchemeArgsEnv = "YES">
- <Testables>
- <TestableReference
- skipped = "NO">
- <BuildableReference
- BuildableIdentifier = "primary"
- BlueprintIdentifier = "1A0000000000000000000010"
- BuildableName = "GovArbUITests.xctest"
- BlueprintName = "GovArbUITests"
- ReferencedContainer = "container:GovArbUITest.xcodeproj">
- </BuildableReference>
- </TestableReference>
- </Testables>
- </TestAction>
-</Scheme>
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/README.md b/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/README.md
deleted file mode 100644
index ab4307d..0000000
--- a/govarbitrage/apps/mobile/device-proof-evidence/GovArbUITest/README.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# GovArbUITest — physical-device journey capture (TK-10279)
-
-Standalone, throwaway XCUITest that drives the **already-installed** GovArbitrage app
-(`com.abrams.govarbitrage`) on a physical iPhone **by bundle id** and captures each screen
-**in-process** via `XCUIScreen.main.screenshot()` as `XCTAttachment`s. This bypasses the dead
-`idevicescreenshot` / DDI screenshot path on iOS 26.
-
-It is **independent** of the shared GovArbitrage Xcode project (that one is built by other agents);
-this project has a single UI-testing target and nothing else.
-
-## What it captures
-1. `cold-launch-opportunities` — the Opportunities list on live data
-2. `detail-maxbid-valuation` — a listing detail (Recommended Max Bid + Valuation rows)
-3. `settings` — the Settings screen
-4. `settings-connection-test` — after tapping **Test Connection** (green "Connected … Tier: PREMIUM" banner)
-5. `siwa-available` — asserts the **Sign in with Apple** button EXISTS (never taps it)
-
-Because the Opportunities list holds ~2,500 cards, a full accessibility snapshot of it stalls the a11y
-server, so the big list is driven with **normalized-coordinate taps** (first card ≈ 0.5/0.30, Settings
-tab ≈ 0.75/0.95, Test Connection ≈ 0.5/0.72). Element queries are reserved for the small Settings screen.
-
-## Run
-The device must be **unlocked** (set Auto-Lock → Never); `xcodebuild` hangs at preflight otherwise.
-
-```sh
-xcodebuild test \
- -project GovArbUITest.xcodeproj -scheme GovArbUITests \
- -destination 'platform=iOS,id=<DEVICE_UDID>' \
- -derivedDataPath ./DerivedData -resultBundlePath ./result.xcresult \
- -allowProvisioningUpdates \
- -authenticationKeyPath ~/.appstoreconnect/private_keys/AuthKey_72Y2TZT54R.p8 \
- -authenticationKeyID 72Y2TZT54R \
- -authenticationKeyIssuerID cfbd63ed-301b-465c-aad7-49e94420ad70
-```
-
-Signing: automatic, team `3VAV3KMNZK`, runner bundle id `com.abrams.govarbitrage.uitests`.
-
-## Extract the screenshots
-```sh
-xcrun xcresulttool export attachments --path result.xcresult --output-path attachments
-# named PNGs land under attachments/ with a manifest.json mapping human-readable names
-```
-
-## watch-capture.sh
-Background helper that retries the test until the phone is unlocked, then exports the named PNGs and
-copies them into `../` as `device-journey-<n>-<step>-<ISO>.png`. Useful when the device auto-locks
-between runs. Edit the hard-coded paths/UDID at the top before reuse.
-
-## Hard gates (local dev only)
-No App Store Connect submit/reply/upload/resubmit; no Apple identity beyond dev signing; no prod/data
-writes; no remote push. The app runs on live data (it is an ungated app-client).
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/SIM-DRYRUN-FINDINGS.md b/govarbitrage/apps/mobile/device-proof-evidence/SIM-DRYRUN-FINDINGS.md
deleted file mode 100644
index f39097d..0000000
--- a/govarbitrage/apps/mobile/device-proof-evidence/SIM-DRYRUN-FINDINGS.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# GovArbitrage — iOS Simulator Dry-Run (SUPPLEMENTARY evidence) — TK-10279
-
-**When:** 2026-09-02T22:12:55Z (UTC)
-**Device:** iPhone 17 Pro Max, iOS 26.5 (simulator udid `2061D117-F2B5-419D-82D6-E9567908D5E8`)
-**Bundle:** `com.abrams.govarbitrage` · Expo SDK 57 / React Native 0.86 · app version 1.0.0
-**Scope:** LOCAL dev only. No App Store Connect writes/replies/uploads/resubmits, no Apple-identity
-actions (Sign in with Apple shown AVAILABLE, never tapped), no prod/data writes. This is a
-supplementary simulator record + journey validation while the physical iPhone is off-network; the
-physical-device App Review proof is handled separately.
-
-## Artifacts
-- **Recording:** `govarbitrage-SIMULATOR-dryrun-2026-09-02T221255Z.mov` (h264, 1320×2868, 36.4s, 7.99 MB)
-- **Stills:**
- - `still-01-opportunities-list-<ISO>.png` — Opportunities list, real data
- - `still-02-detail-maxbid-<ISO>.png` — Listing detail (Recommended Max Bid + Valuation)
- - `still-03-settings-apple-<ISO>.png` — Settings (Sign in with Apple AVAILABLE + Test Connection + config)
- - `still-04-list-return-<ISO>.png` — back on the list
-
-## Journey validated (all screens rendered with REAL live data from https://auctions.agentabrams.com)
-The app sends an empty Basic auth header (`admin:` → `Authorization: Basic YWRtaW46`), which the API
-treats as UNGATED, so full analytics are returned (`gated:false`, `tier:FREE`).
-
-1. **Cold launch → Opportunities list** — `2516 active listings`; ranked cards (#1 Late-2013 iMac,
- #2/#3 MacBook Pros, #4 Vintage Apple monitor) each showing GOVDEALS source, category, MEDIUM RISK,
- and the analytics columns **CURRENT BID $10 · NET PROFIT $183 · ROI 191.0% · SCORE 82**. Sort chips
- (Opportunity/ROI %/Net Profit/Closing Soon/Newest) + Listings/Settings tab bar.
-2. **Listing detail** (iMac, id `cmtk1nnat00eysqssvwvbewq7`, deep-linked `govarbitrage://listing/<id>`)
- — GOVDEALS chip, Lot #29250-189, Toledo OH, MEDIUM RISK, Drop Ship: Easy, Imported timestamp, hero
- photo, **RECOMMENDED MAX BID $104** (rounded from 103.93; current bid $10 · 0 bids), View-on-GovDeals
- link, and the **Valuation** table (New Retail $900 · Avg Retail $828 · Used Low/Avg/High
- $252/$315/$410 · Wholesale $189 · …).
-3. **Settings** (`govarbitrage://settings`) — the whole screen fits one frame: **Sign in with Apple
- button rendered and AVAILABLE (not tapped)**, Base URL `https://auctions.agentabrams.com`, Username
- `admin`, Password, Save Settings, **Test Connection** button, About (GovArbitrage Mobile ·
- com.abrams.govarbitrage · Expo SDK 57 / React Native 0.86).
-
-### Detail below-the-fold data (rendered on-device below the visible fold; values from the live API)
-`api-detail-appclient.json`: **Recommended Max Bid $103.93 · Net Profit $182.96 · ROI 191% ·
-Annualized return · Total Investment / Expected Returns (Cost Breakdown & Profit)** + **9 Scores**
-(Opportunity/Arbitrage/Demand/Velocity/Logistics/Condition/Competition/Buyer). These sections are
-present in the detail ScrollView beneath the Valuation table (see the code in `app/listing/[id].tsx`).
-
-## Build findings (native build could NOT be freshly rebuilt — captured, not guessed)
-Two build attempts failed on the SDK 57 / RN 0.86 **prebuilt React Native XCFramework** toolchain:
-1. `xcodebuild -configuration Release … -derivedDataPath ios/build` → EXIT 65, exact error:
- `<unknown>:0: error: virtual filesystem overlay file '.../ios/Pods/React-Core-prebuilt/React-VFS.yaml' not found`
- (×2) + SwiftCompile failure in `ExpoLogBox`.
-2. `npx expo run:ios --configuration Release` (default DerivedData) → EXIT 65, 1 error:
- `❌ Script '[CP-User] Build ExpoModulesJSI xcframework' failed`.
-Both point at the new switchable-prebuilt-XCFramework script phases (React-Core-prebuilt /
-ExpoModulesJSI). A `/Users/macstudio3/Projects/govarbitrage` ↔ `/Volumes/Henry/…` symlink path
-duality (seen in the VFS error path) is the likely aggravator.
-
-**What was recorded instead:** the already-installed prior **Release** build on the simulator
-(universal Mach-O + embedded 2.8 MB `main.jsbundle`, v1.0.0, Aug 7). Every TS/JS source file
-(`app/`, `lib/`, `components/`, `constants/`, `index.ts`) predates that binary, so it faithfully
-reflects the CURRENT journey code. The only config delta since is `supportsTablet:false`
-(iPad-only; irrelevant to an iPhone-simulator recording).
-
-## Interaction limitation (why the video is deep-link-driven, not tap-driven)
-Synthetic mouse taps/scrolls into the Simulator (cliclick) do NOT reach the app — macOS
-Accessibility / Input-Monitoring is not granted to the terminal (TCC-blocked). The cursor moves but
-button/drag events are filtered. `idb`/`idb_companion` are not installed, and an XCUITest would hit
-the same failing native build. Navigation was therefore driven deterministically via the app's own
-`govarbitrage://` deep-link handler (URL handler, not synthetic input), which is faithful. The one
-tap-only item (the Test Connection RESULT) is independently proven: the cold-launched list loaded
-2516 live listings, i.e. the exact same authenticated GET the Test Connection button issues.
-
-### To capture the tap/scroll-only bits in a follow-up (optional, Steve-gated GUI grant)
-Grant the terminal (iTerm/Terminal) **Accessibility** and **Input Monitoring** in
-System Settings → Privacy & Security. Then a re-run can tap Test Connection (→ "Connected · latency ·
-tier FREE") and scroll the detail to show Cost Breakdown & Profit + Scores on-screen.
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/SUBMIT-GATE-CHECKLIST.md b/govarbitrage/apps/mobile/device-proof-evidence/SUBMIT-GATE-CHECKLIST.md
deleted file mode 100644
index 832f879..0000000
--- a/govarbitrage/apps/mobile/device-proof-evidence/SUBMIT-GATE-CHECKLIST.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Submit Gate — run the moment the 2.1 recording exists (TK-10279)
-
-Final pre-send verification before replying to Apple's **Guideline 2.1 · Information Needed**.
-Do NOT reply/attach until every box is checked. Sending is Steve's gated console action.
-
-## 1. The recording (the item that was blocking)
-- [ ] A `.mov`/`.mp4` exists in `device-proof-evidence/` from the **physical iPhone 17 Pro Max**, iOS 26.6.1 (not a simulator).
-- [ ] It shows the full shot-list journey: cold launch → Opportunities list → open a listing showing **Max Bid / Valuation / Cost / Scores** → Settings → **connection test** → (optional) **Sign in with Apple availability** (never tapped).
-- [ ] Playback is clean end-to-end, no crash, no blank/error state.
-- [ ] `./verify-recording.sh <recording.mov|recording.mp4>` returns **PASS** before upload.
-- [ ] Manual frame review confirms **no notifications, private apps, names, messages, phone numbers, email addresses, or other personal content** appears anywhere.
-- [ ] The recording remains inside GovArbitrage and visibly completes the promised detail/settings journey; codec validation alone is insufficient.
-- [ ] After that manual review, create the bound sidecar: `shasum -a 256 <recording> > <recording>.privacy-reviewed.sha256`; `readiness-probe.sh` must report recording `PASS` and privacy review `PASS`.
-
-## 2. Live backend the reviewer will exercise (re-verify same-day — was PASS 2026-09-02)
-```sh
-for p in "" /privacy /api/listings; do
- curl -sS -o /dev/null -w "%{http_code} %{time_total}s https://auctions.agentabrams.com$p\n" --max-time 20 "https://auctions.agentabrams.com$p"
-done
-```
-- [ ] All three return **200**. `/api/listings` still serves rows (was total=2613).
-
-## 3. ASC artifact state (re-verify same-day)
-```sh
-ASC_KEY_PATH=/Users/macstudio3/.appstoreconnect/private_keys/AuthKey_72Y2TZT54R.p8 \
-ASC_KEY_ID=72Y2TZT54R node ~/.claude/skills/ipa-status/scripts/ipa-status.mjs --ready
-```
-- [ ] GovArbitrage still shows build + description + screenshots present (SUBMIT-READY line).
-
-## 4. The reply text
-- [ ] `../ASC-PASTE-KIT.md` → "Guideline 2.1 Reply (paste)" covers all 6 disclosures Apple asked for
- (auction source, backend `auctions.agentabrams.com`, Sign in with Apple via expo-apple-authentication,
- third-party listing photos, all-territories consistency, public-records / no-regulated-material).
-
-## 5. Send (Steve — gated console step, only after 1–4 all checked)
-- [ ] App Store Connect ▸ **Resolution Center** ▸ reply to the 2.1 review.
-- [ ] Paste the reply text + **attach the recording**.
-- [ ] Submit the reply. (No new binary needed — this is an info+video response, not a resubmit.)
-
-## Gates (unchanged)
-❌ No ASC write until box 5 · ❌ Do not complete Sign in with Apple (availability only) · ✅ read-only re-verify above.
diff --git a/govarbitrage/apps/mobile/device-proof-evidence/govarbitrage-SIMULATOR-dryrun-2026-09-02T221255Z.mov.DO-NOT-UPLOAD-simulator-fails-2.1 b/govarbitrage/apps/mobile/device-proof-evidence/govarbitrage-SIMULATOR-dryrun-2026-09-02T221255Z.mov.DO-NOT-UPLOAD-simulator-fails-2.1
deleted file mode 100644
index 9cc18ba..0000000
Binary files a/govarbitrage/apps/mobile/device-proof-evidence/govarbitrage-SIMULATOR-dryrun-2026-09-02T221255Z.mov.DO-NOT-UPLOAD-simulator-fails-2.1 and /dev/null differ
diff --git a/govarbitrage/apps/mobile/eas.json b/govarbitrage/apps/mobile/eas.json
deleted file mode 100644
index f6151a6..0000000
--- a/govarbitrage/apps/mobile/eas.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
- "cli": {
- "version": ">= 5.0.0",
- "appVersionSource": "remote"
- },
- "build": {
- "development": {
- "developmentClient": true,
- "distribution": "internal",
- "ios": {
- "simulator": true
- }
- },
- "preview": {
- "distribution": "internal",
- "ios": {
- "simulator": false
- }
- },
- "production": {
- "autoIncrement": true,
- "ios": {
- "image": "latest"
- },
- "android": {
- "buildType": "app-bundle"
- }
- }
- },
- "submit": {
- "production": {
- "ios": {
- "ascAppId": "6799165231",
- "ascApiKeyPath": "/Users/macstudio3/.appstoreconnect/private_keys/AuthKey_72Y2TZT54R.p8",
- "ascApiKeyId": "72Y2TZT54R",
- "ascApiKeyIssuerId": "cfbd63ed-301b-465c-aad7-49e94420ad70"
- }
- }
- }
-}
diff --git a/govarbitrage/apps/mobile/index.ts b/govarbitrage/apps/mobile/index.ts
deleted file mode 100644
index 80d3d99..0000000
--- a/govarbitrage/apps/mobile/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-import "expo-router/entry";
diff --git a/govarbitrage/apps/mobile/lib/api-error.ts b/govarbitrage/apps/mobile/lib/api-error.ts
deleted file mode 100644
index 1c0036b..0000000
--- a/govarbitrage/apps/mobile/lib/api-error.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * ApiError lives in its own module so both the API client (api.ts) and the
- * payload validator (validate.ts) can throw/import it without a circular
- * import between them.
- */
-export class ApiError extends Error {
- constructor(
- public readonly status: number,
- message: string
- ) {
- super(message);
- this.name = "ApiError";
- }
-}
diff --git a/govarbitrage/apps/mobile/lib/api.ts b/govarbitrage/apps/mobile/lib/api.ts
deleted file mode 100644
index 6400e23..0000000
--- a/govarbitrage/apps/mobile/lib/api.ts
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * GovArbitrage typed API client.
- *
- * Auth is OPTIONAL. The default server's read API is public, so a fresh install
- * sends NO Authorization header and gets the same data any browser or curl gets
- * — identical behavior across every client. A header is only added when the user
- * takes an explicit, visible action:
- * • Sign in with Apple → Authorization: Bearer <app session JWT>
- * • Enter a username + password in Settings (to point the app at their own
- * self-hosted server) → Authorization: Basic base64(user:pass)
- * With neither, requests are anonymous.
- */
-import { loadSettings, loadAppleAccount } from "./settings";
-import { authHeadersFor } from "./auth-headers";
-import type {
- ListingDetail,
- ListingsQueryParams,
- ListingsResponse,
-} from "./types";
-import { normalizeListingsResponse, normalizeListingDetail } from "./validate";
-import { ApiError } from "./api-error";
-
-// ── Internal helpers ──────────────────────────────────────────────────────────
-
-async function getAuthHeaders(): Promise<HeadersInit> {
- const account = await loadAppleAccount();
- const { username, password } = await loadSettings();
- return authHeadersFor({ appleToken: account?.token, username, password });
-}
-
-interface FetchOptions {
- signal?: AbortSignal;
-}
-
-const REQUEST_TIMEOUT_MS = 15_000;
-
-async function apiFetch<T>(path: string, opts: FetchOptions = {}): Promise<T> {
- const { baseUrl } = await loadSettings();
- const authHeaders = await getAuthHeaders();
-
- const url = `${baseUrl.replace(/\/$/, "")}${path}`;
-
- // Bound every request so a stalled connection can't leave the UI spinning
- // forever. A timeout throws a real ApiError (surfaced to the user); a genuine
- // caller-abort keeps its AbortError (callers treat that as silent navigation).
- const controller = new AbortController();
- let timedOut = false;
- const timer = setTimeout(() => {
- timedOut = true;
- controller.abort();
- }, REQUEST_TIMEOUT_MS);
- if (opts.signal) {
- if (opts.signal.aborted) controller.abort();
- else opts.signal.addEventListener("abort", () => controller.abort(), { once: true });
- }
-
- try {
- const res = await fetch(url, {
- headers: {
- Accept: "application/json",
- ...authHeaders,
- },
- signal: controller.signal,
- });
-
- if (!res.ok) {
- const body = await res.text().catch(() => "");
- const msg = body || res.statusText || String(res.status);
- throw new ApiError(res.status, msg);
- }
-
- return (await res.json()) as T;
- } catch (err) {
- if (timedOut) {
- throw new ApiError(0, "Request timed out. Check your connection or the server URL in Settings.");
- }
- throw err;
- } finally {
- clearTimeout(timer);
- }
-}
-
-// ── Error type ────────────────────────────────────────────────────────────────
-// Re-exported from ./api-error so existing `import { ApiError } from "./api"`
-// callers keep working while validate.ts imports it without a circular dep.
-export { ApiError } from "./api-error";
-
-// ── Listings ──────────────────────────────────────────────────────────────────
-
-export async function fetchListings(
- params: ListingsQueryParams = {},
- opts: FetchOptions = {}
-): Promise<ListingsResponse> {
- const qs = new URLSearchParams();
- if (params.search) qs.set("search", params.search);
- if (params.source) qs.set("source", params.source);
- if (params.category) qs.set("category", params.category);
- if (params.condition) qs.set("condition", params.condition);
- if (params.risk) qs.set("risk", params.risk);
- if (params.closingWithinHours != null)
- qs.set("closingWithinHours", String(params.closingWithinHours));
- if (params.sort) qs.set("sort", params.sort);
- if (params.dir) qs.set("dir", params.dir);
- if (params.page != null) qs.set("page", String(params.page));
- if (params.pageSize != null) qs.set("pageSize", String(params.pageSize));
- if (params.profile) qs.set("profile", params.profile);
-
- const query = qs.toString();
- const raw = await apiFetch<unknown>(
- `/api/listings${query ? `?${query}` : ""}`,
- opts
- );
- return normalizeListingsResponse(raw);
-}
-
-export async function fetchListing(
- id: string,
- opts: FetchOptions = {}
-): Promise<ListingDetail> {
- const raw = await apiFetch<unknown>(`/api/listings/${encodeURIComponent(id)}`, opts);
- return normalizeListingDetail(raw);
-}
-
-// ── Connection test ───────────────────────────────────────────────────────────
-
-export interface ConnectionTestResult {
- ok: boolean;
- latencyMs: number;
- tier?: string;
- error?: string;
-}
-
-export async function testConnection(): Promise<ConnectionTestResult> {
- const t0 = Date.now();
- try {
- const data = await fetchListings({ pageSize: 1 });
- return { ok: true, latencyMs: Date.now() - t0, tier: data.tier };
- } catch (err) {
- return {
- ok: false,
- latencyMs: Date.now() - t0,
- error: err instanceof Error ? err.message : String(err),
- };
- }
-}
diff --git a/govarbitrage/apps/mobile/lib/auth-headers.ts b/govarbitrage/apps/mobile/lib/auth-headers.ts
deleted file mode 100644
index a4d31b0..0000000
--- a/govarbitrage/apps/mobile/lib/auth-headers.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Pure auth-header policy — zero native dependencies so it is unit-testable.
- *
- * The GovArbitrage app never sniffs the client type and never carries a secret
- * machine-token path. A request carries an Authorization header ONLY when the
- * user has taken an explicit, visible action, with this precedence:
- * 1. Signed in with Apple → Bearer <app session JWT>
- * 2. Self-hosting creds set → Basic base64(user:pass)
- * 3. otherwise → no header (anonymous public read)
- */
-
-export function buildBasicAuthHeader(username: string, password: string): string {
- return `Basic ${btoa(`${username}:${password}`)}`;
-}
-
-export function authHeadersFor(input: {
- appleToken?: string | null;
- username?: string;
- password?: string;
-}): Record<string, string> {
- if (input.appleToken) return { Authorization: `Bearer ${input.appleToken}` };
- if (input.password) {
- return { Authorization: buildBasicAuthHeader(input.username ?? "", input.password) };
- }
- return {};
-}
diff --git a/govarbitrage/apps/mobile/lib/auth.ts b/govarbitrage/apps/mobile/lib/auth.ts
deleted file mode 100644
index cc16f77..0000000
--- a/govarbitrage/apps/mobile/lib/auth.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * Sign in with Apple (native iOS). Uses expo-apple-authentication to obtain an
- * Apple identity token, exchanges it at the backend's /api/auth/apple for our
- * own app session JWT, and stores that in expo-secure-store. Optional: the rest
- * of the app works signed-out; this just creates/links a lightweight account.
- */
-import * as AppleAuthentication from "expo-apple-authentication";
-import {
- loadSettings,
- saveAppleAccount,
- clearAppleAccount,
- type AppleAccount,
-} from "./settings";
-
-/** True only on iOS devices/simulators that support Sign in with Apple. */
-export async function isAppleSignInAvailable(): Promise<boolean> {
- try {
- return await AppleAuthentication.isAvailableAsync();
- } catch {
- return false;
- }
-}
-
-export async function signInWithApple(): Promise<AppleAccount> {
- const credential = await AppleAuthentication.signInAsync({
- requestedScopes: [
- AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
- AppleAuthentication.AppleAuthenticationScope.EMAIL,
- ],
- });
-
- const { identityToken, fullName, email } = credential;
- if (!identityToken) {
- throw new Error("Apple did not return an identity token.");
- }
-
- // Apple sends name/email only on the FIRST authorization — pass them through
- // so the backend can populate the account on create.
- const name =
- fullName && (fullName.givenName || fullName.familyName)
- ? [fullName.givenName, fullName.familyName].filter(Boolean).join(" ")
- : null;
-
- const { baseUrl } = await loadSettings();
- const res = await fetch(`${baseUrl.replace(/\/$/, "")}/api/auth/apple`, {
- method: "POST",
- headers: { "Content-Type": "application/json", Accept: "application/json" },
- body: JSON.stringify({
- identityToken,
- fullName: name || undefined,
- email: email || undefined,
- }),
- });
-
- if (!res.ok) {
- let msg = `Sign-in failed (${res.status}).`;
- try {
- const body = await res.json();
- if (body?.error) msg = body.error;
- } catch {
- // keep the status-code message
- }
- throw new Error(msg);
- }
-
- const data = (await res.json()) as {
- token: string;
- user?: { name?: string | null; email?: string | null };
- };
- if (!data?.token) throw new Error("Server did not return a session token.");
-
- const account: AppleAccount = {
- token: data.token,
- name: data.user?.name ?? name,
- email: data.user?.email ?? email ?? null,
- };
- await saveAppleAccount(account);
- return account;
-}
-
-export async function signOut(): Promise<void> {
- await clearAppleAccount();
-}
diff --git a/govarbitrage/apps/mobile/lib/format.ts b/govarbitrage/apps/mobile/lib/format.ts
deleted file mode 100644
index 84be147..0000000
--- a/govarbitrage/apps/mobile/lib/format.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-/**
- * Formatting utilities for financial data, scores, dates, and countdowns.
- */
-
-// ── Currency ──────────────────────────────────────────────────────────────────
-
-export function fmtUSD(value: number | null | undefined, decimals = 0): string {
- if (value == null || !Number.isFinite(value)) return "—";
- return new Intl.NumberFormat("en-US", {
- style: "currency",
- currency: "USD",
- minimumFractionDigits: decimals,
- maximumFractionDigits: decimals,
- }).format(value);
-}
-
-// Percentages above this ratio are treated as implausible/garbage and rendered
-// as "—" instead of an absurd number (e.g. a backend annualizedReturn of
-// 23002764 would otherwise display as 2,300,276,400.0%). 1000 ratio = 100,000%,
-// generous enough to keep legitimate aggressive returns (e.g. roi 6.83 = 683%).
-const MAX_PCT_RATIO = 1000;
-
-export function fmtPct(
- value: number | null | undefined,
- opts?: { maxRatioAbs?: number; decimals?: number }
-): string {
- if (value == null || !Number.isFinite(value)) return "—";
- // value is a decimal ratio (0.42 = 42%)
- const maxAbs = opts?.maxRatioAbs ?? MAX_PCT_RATIO;
- if (Math.abs(value) > maxAbs) return "—";
- const decimals = opts?.decimals ?? 1;
- return `${(value * 100).toFixed(decimals)}%`;
-}
-
-// ── Scores ────────────────────────────────────────────────────────────────────
-
-export function fmtScore(score: number | null | undefined): string {
- if (score == null || !Number.isFinite(score)) return "—";
- return Math.round(score).toString();
-}
-
-// ── Time / countdown ──────────────────────────────────────────────────────────
-
-/**
- * Returns a human-readable countdown string like "2d 4h" or "45m" or "CLOSED".
- * closingAt is an ISO8601 string.
- */
-export function closingCountdown(closingAt: string | null | undefined): string {
- if (!closingAt) return "—";
- const ms = new Date(closingAt).getTime() - Date.now();
- if (ms <= 0) return "CLOSED";
- const totalMin = Math.floor(ms / 60_000);
- const days = Math.floor(totalMin / 1440);
- const hours = Math.floor((totalMin % 1440) / 60);
- const mins = totalMin % 60;
- if (days > 0) return `${days}d ${hours}h`;
- if (hours > 0) return `${hours}h ${mins}m`;
- return `${mins}m`;
-}
-
-export function isClosingSoon(closingAt: string | null | undefined): boolean {
- if (!closingAt) return false;
- const ms = new Date(closingAt).getTime() - Date.now();
- return ms > 0 && ms < 24 * 3_600_000; // within 24h
-}
-
-/**
- * Formats a date+time for admin cards in local timezone.
- * Steve's hard rule: admin cards must show created date AND time.
- */
-export function fmtDateTime(iso: string | null | undefined): string {
- if (!iso) return "—";
- return new Date(iso).toLocaleString(undefined, {
- year: "numeric",
- month: "short",
- day: "numeric",
- hour: "numeric",
- minute: "2-digit",
- });
-}
-
-// ── Condition / risk labels ───────────────────────────────────────────────────
-
-export function conditionLabel(c: string | null): string {
- const map: Record<string, string> = {
- NEW: "New",
- LIKE_NEW: "Like New",
- USED_GOOD: "Used — Good",
- USED_FAIR: "Used — Fair",
- FOR_PARTS: "Parts Only",
- UNKNOWN: "Unknown",
- };
- return c ? (map[c] ?? c) : "Unknown";
-}
-
-export function sourceLabel(s: string): string {
- const map: Record<string, string> = {
- GOVDEALS: "GovDeals",
- GSA_AUCTIONS: "GSA Auctions",
- PUBLIC_SURPLUS: "Public Surplus",
- COUNTY: "County",
- STATE_SURPLUS: "State Surplus",
- UNIVERSITY_SURPLUS: "University Surplus",
- MUNICIBID: "Municibid",
- BID4ASSETS: "Bid4Assets",
- GOINDUSTRY: "GoIndustry",
- NETWORK_INTL: "Network Intl",
- GRAYS_AU: "Grays",
- GOVPLANET: "GovPlanet",
- CSV: "CSV Import",
- EXTENSION: "Extension",
- OTHER: "Other",
- };
- return map[s] ?? s;
-}
-
-export function dropShipLabel(d: string): string {
- const map: Record<string, string> = {
- EASY: "Drop Ship: Easy",
- MODERATE: "Drop Ship: OK",
- DIFFICULT: "Drop Ship: Hard",
- INFEASIBLE: "No Drop Ship",
- };
- return map[d] ?? d;
-}
diff --git a/govarbitrage/apps/mobile/lib/pnl.ts b/govarbitrage/apps/mobile/lib/pnl.ts
deleted file mode 100644
index df90a67..0000000
--- a/govarbitrage/apps/mobile/lib/pnl.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * Shared profit/loss color helper — used by any screen that tints a financial
- * value green/red by its sign. Respects the same finite guard as the formatters
- * in lib/format.ts: a missing or non-finite value is NEUTRAL, never a misleading
- * red (a null value would otherwise imply a loss) or green. Color each field by
- * its OWN value — do not drive one metric's color from another's sign.
- */
-import { Colors } from "../constants/theme";
-
-export function pnlColor(value: number | null | undefined): string {
- if (value == null || !Number.isFinite(value)) return Colors.neutral;
- return value >= 0 ? Colors.profit : Colors.loss;
-}
diff --git a/govarbitrage/apps/mobile/lib/settings.ts b/govarbitrage/apps/mobile/lib/settings.ts
deleted file mode 100644
index 7f91d47..0000000
--- a/govarbitrage/apps/mobile/lib/settings.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * Settings persistence — base URL and Basic Auth credentials stored in
- * expo-secure-store so they never touch AsyncStorage (unencrypted).
- *
- * Keys:
- * GOVARB_BASE_URL — e.g. "https://auctions.agentabrams.com"
- * GOVARB_USERNAME — Basic auth username
- * GOVARB_PASSWORD — Basic auth password
- */
-import * as SecureStore from "expo-secure-store";
-export { buildBasicAuthHeader } from "./auth-headers";
-
-const KEYS = {
- BASE_URL: "GOVARB_BASE_URL",
- USERNAME: "GOVARB_USERNAME",
- PASSWORD: "GOVARB_PASSWORD",
- // Sign in with Apple — the app session JWT issued by /api/auth/apple, plus the
- // account identity to show in Settings. Optional: absent = signed out.
- SESSION_JWT: "GOVARB_SESSION_JWT",
- ACCOUNT_NAME: "GOVARB_ACCOUNT_NAME",
- ACCOUNT_EMAIL: "GOVARB_ACCOUNT_EMAIL",
-} as const;
-
-const DEFAULTS = {
- BASE_URL: "https://auctions.agentabrams.com",
- // Empty by default — the default server's read API is public, so a fresh
- // install sends no Authorization header. Credentials are only for users
- // pointing the app at their own self-hosted server.
- USERNAME: "",
- PASSWORD: "",
-} as const;
-
-export interface AppSettings {
- baseUrl: string;
- username: string;
- password: string;
-}
-
-export async function loadSettings(): Promise<AppSettings> {
- const [baseUrl, username, password] = await Promise.all([
- SecureStore.getItemAsync(KEYS.BASE_URL),
- SecureStore.getItemAsync(KEYS.USERNAME),
- SecureStore.getItemAsync(KEYS.PASSWORD),
- ]);
- return {
- baseUrl: baseUrl ?? DEFAULTS.BASE_URL,
- username: username ?? DEFAULTS.USERNAME,
- password: password ?? DEFAULTS.PASSWORD,
- };
-}
-
-export async function saveSettings(settings: AppSettings): Promise<void> {
- await Promise.all([
- SecureStore.setItemAsync(KEYS.BASE_URL, settings.baseUrl.trim()),
- SecureStore.setItemAsync(KEYS.USERNAME, settings.username.trim()),
- SecureStore.setItemAsync(KEYS.PASSWORD, settings.password),
- ]);
-}
-
-// ── Sign in with Apple session ──────────────────────────────────────────────
-
-export interface AppleAccount {
- token: string;
- name: string | null;
- email: string | null;
-}
-
-/** The signed-in Apple account, or null when signed out. */
-export async function loadAppleAccount(): Promise<AppleAccount | null> {
- const [token, name, email] = await Promise.all([
- SecureStore.getItemAsync(KEYS.SESSION_JWT),
- SecureStore.getItemAsync(KEYS.ACCOUNT_NAME),
- SecureStore.getItemAsync(KEYS.ACCOUNT_EMAIL),
- ]);
- if (!token) return null;
- return { token, name: name ?? null, email: email ?? null };
-}
-
-export async function saveAppleAccount(account: AppleAccount): Promise<void> {
- await Promise.all([
- SecureStore.setItemAsync(KEYS.SESSION_JWT, account.token),
- account.name
- ? SecureStore.setItemAsync(KEYS.ACCOUNT_NAME, account.name)
- : SecureStore.deleteItemAsync(KEYS.ACCOUNT_NAME),
- account.email
- ? SecureStore.setItemAsync(KEYS.ACCOUNT_EMAIL, account.email)
- : SecureStore.deleteItemAsync(KEYS.ACCOUNT_EMAIL),
- ]);
-}
-
-export async function clearAppleAccount(): Promise<void> {
- await Promise.all([
- SecureStore.deleteItemAsync(KEYS.SESSION_JWT),
- SecureStore.deleteItemAsync(KEYS.ACCOUNT_NAME),
- SecureStore.deleteItemAsync(KEYS.ACCOUNT_EMAIL),
- ]);
-}
diff --git a/govarbitrage/apps/mobile/lib/types.ts b/govarbitrage/apps/mobile/lib/types.ts
deleted file mode 100644
index 7d6c0d6..0000000
--- a/govarbitrage/apps/mobile/lib/types.ts
+++ /dev/null
@@ -1,240 +0,0 @@
-// TypeScript types derived directly from the GovArbitrage API response shapes.
-// Source: src/lib/listings.ts (ListingRow), src/prisma/schema.prisma,
-// src/app/api/listings/route.ts, src/lib/listing-detail.ts
-
-// ── Enum mirrors ─────────────────────────────────────────────────────────────
-
-export type AuctionSource =
- | "GOVDEALS"
- | "PUBLIC_SURPLUS"
- | "GSA_AUCTIONS"
- | "COUNTY"
- | "STATE_SURPLUS"
- | "UNIVERSITY_SURPLUS"
- | "MUNICIBID"
- | "BID4ASSETS"
- | "GOINDUSTRY"
- | "NETWORK_INTL"
- | "GRAYS_AU"
- | "GOVPLANET"
- | "CSV"
- | "EXTENSION"
- | "OTHER";
-
-export type Condition = "NEW" | "LIKE_NEW" | "USED_GOOD" | "USED_FAIR" | "FOR_PARTS" | "UNKNOWN";
-export type RiskLevel = "LOW" | "MEDIUM" | "HIGH";
-export type DropShipFeasibility = "EASY" | "MODERATE" | "DIFFICULT" | "INFEASIBLE";
-export type ResearchStatus = "PENDING" | "QUEUED" | "IN_PROGRESS" | "COMPLETE" | "FAILED";
-export type ListingStatus = "ACTIVE" | "ENDED" | "REMOVED";
-export type Tier = "FREE" | "STANDARD" | "PREMIUM";
-export type ScoreProfile =
- | "OVERALL_OPPORTUNITY"
- | "BEST_ARBITRAGE"
- | "QUICK_FLIP"
- | "COLLECTOR"
- | "LOCAL_PICKUP"
- | "EASY_FREIGHT"
- | "PARTS_ONLY"
- | "HIGH_CONFIDENCE"
- | "HIGH_PROFIT";
-
-// ── Flat listing row (from GET /api/listings) ────────────────────────────────
-
-export interface ListingRow {
- id: string;
- source: AuctionSource;
- sourceAuctionId: string;
- sourceUrl: string | null;
- title: string;
- category: string | null;
- manufacturer: string | null;
- model: string | null;
- condition: Condition;
- quantity: number;
- currentBid: number;
- currentCost: number; // bid + premium + tax
- /** Null for FREE tier — money-math gate */
- recommendedMaxBid: number | null;
- retailLow: number | null;
- retailAverage: number | null;
- retailHigh: number | null;
- usedLow: number | null;
- usedAverage: number | null;
- usedHigh: number | null;
- wholesale: number | null;
- liquidation: number | null;
- sellNow: number | null;
- value7Day: number | null;
- value30Day: number | null;
- value90Day: number | null;
- expectedSale: number | null;
- shipping: number;
- freight: number;
- repairs: number;
- marketplaceFees: number;
- netProfit: number | null;
- roi: number | null; // decimal ratio e.g. 0.42 = 42%
- risk: RiskLevel;
- confidence: number | null; // 0..100
- opportunityScore: number | null;
- arbitrageScore: number | null;
- demandScore: number | null;
- velocityScore: number | null;
- logisticsScore: number | null;
- conditionScore: number | null;
- competitionScore: number | null;
- buyerScore: number | null;
- dropShip: DropShipFeasibility;
- closingAt: string | null; // ISO8601
- researchStatus: ResearchStatus;
- imageUrl: string | null;
- // createdAt is present on the full Listing model, returned on detail
- createdAt?: string;
-}
-
-// ── Paginated list response ───────────────────────────────────────────────────
-
-export interface ListingsResponse {
- rows: ListingRow[];
- total: number;
- page: number;
- pageSize: number;
- tier: Tier;
- gated: boolean;
-}
-
-// ── Detail response (GET /api/listings/:id) ───────────────────────────────────
-
-export interface Research {
- id: string;
- newRetail: number | null;
- newReplacement: number | null;
- avgRetail: number | null;
- usedSoldPrice: number | null;
- usedAskingPrice: number | null;
- usedLow: number | null;
- usedHigh: number | null;
- wholesaleValue: number | null;
- liquidationValue: number | null;
- sellTodayValue: number | null;
- value7Day: number | null;
- value30Day: number | null;
- value90Day: number | null;
- expectedSalePrice: number | null;
- probabilityOfSale: number | null; // 0..1
- daysUntilSold: number | null;
- confidenceScore: number | null; // 0..100
- summary: string | null;
- createdAt: string;
-}
-
-export interface CostBreakdown {
- id: string;
- winningBid: number;
- buyerPremium: number;
- salesTax: number;
- shipping: number;
- freight: number;
- insurance: number;
- packing: number;
- pickupLabor: number;
- testing: number;
- repairs: number;
- certification: number;
- marketplaceFees: number;
- paymentFees: number;
- storage: number;
- photography: number;
- listingLabor: number;
- expectedReturns: number;
- totalInvestment: number;
- expectedNetProfit: number;
- roi: number; // decimal ratio
- annualizedReturn: number;
- recommendedMaxBid: number;
-}
-
-export interface Score {
- id: string;
- profile: ScoreProfile;
- value: number; // 0..100
- arbitrage: number;
- demand: number;
- velocity: number;
- logistics: number;
- condition: number;
- competition: number;
- buyer: number;
- risk: RiskLevel;
- dropShip: DropShipFeasibility;
- explanation: string;
-}
-
-export interface Comparable {
- id: string;
- kind: "SOLD" | "ACTIVE" | "RETAIL";
- title: string;
- price: number;
- url: string | null;
- source: string | null;
- soldAt: string | null;
-}
-
-export interface ListingDetail {
- id: string;
- source: AuctionSource;
- sourceAuctionId: string;
- sourceUrl: string | null;
- title: string;
- description: string | null;
- category: string | null;
- manufacturer: string | null;
- model: string | null;
- serialNumber: string | null;
- condition: Condition;
- quantity: number;
- accessories: string | null;
- missingParts: string | null;
- weightLbs: number | null;
- dimensions: string | null;
- locationCity: string | null;
- locationState: string | null;
- locationZip: string | null;
- currentBid: number;
- bidCount: number;
- closingAt: string | null;
- imageUrls: string[];
- researchStatus: ResearchStatus;
- listingStatus: ListingStatus;
- createdAt: string;
- updatedAt: string;
- research: Research | null;
- costBreakdown: CostBreakdown | null;
- scores: Score[];
- comparables: Comparable[];
- tier: Tier;
- gated: boolean;
-}
-
-// ── Query params ──────────────────────────────────────────────────────────────
-
-export type SortField =
- | "opportunityScore"
- | "roi"
- | "netProfit"
- | "closingAt"
- | "currentBid";
-
-export interface ListingsQueryParams {
- search?: string;
- source?: AuctionSource;
- category?: string;
- condition?: Condition;
- risk?: RiskLevel;
- closingWithinHours?: number;
- sort?: SortField;
- dir?: "asc" | "desc";
- page?: number;
- pageSize?: number;
- profile?: ScoreProfile;
-}
diff --git a/govarbitrage/apps/mobile/lib/validate.ts b/govarbitrage/apps/mobile/lib/validate.ts
deleted file mode 100644
index eb8f0c9..0000000
--- a/govarbitrage/apps/mobile/lib/validate.ts
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * Runtime payload validation for the API boundary (TK-10279, Cycle 6).
- *
- * Replaces the blind `as T` cast in api.ts: the server is trusted for TYPES at
- * compile time only, so a malformed/garbage payload used to flow straight into
- * the UI and crash it (a non-array `scores` → `.map` throw; a non-string
- * `title` → `.slice` throw; NaN/Infinity numbers → absurd renders). This is the
- * ROOT the render-layer guards (fmt helpers, pnlColor, scoreColor) were
- * treating symptomatically.
- *
- * Scope (tight, per DTD): own what the render guards CANNOT —
- * - structural faults (required arrays/objects/strings) that cause crashes,
- * - non-finite / non-number values → null (so the existing guards show "—").
- * It does NOT clamp implausible-but-finite numbers (e.g. annualizedReturn
- * 23002764) — that stays fmtPct's job, by design.
- */
-import type { ListingDetail, ListingsResponse, Tier } from "./types";
-import { ApiError } from "./api-error";
-
-// Recursively replace non-finite numbers (NaN/Infinity) with null, everywhere.
-// Leaves finite numbers, strings, arrays, and object structure intact.
-function sanitizeNonFinite(v: unknown): unknown {
- if (typeof v === "number") return Number.isFinite(v) ? v : null;
- if (Array.isArray(v)) return v.map(sanitizeNonFinite);
- if (v && typeof v === "object") {
- const out: Record<string, unknown> = {};
- for (const k of Object.keys(v as Record<string, unknown>)) {
- out[k] = sanitizeNonFinite((v as Record<string, unknown>)[k]);
- }
- return out;
- }
- return v;
-}
-
-const asObj = (v: unknown): Record<string, unknown> =>
- v && typeof v === "object" && !Array.isArray(v) ? (v as Record<string, unknown>) : {};
-const asString = (v: unknown, fallback = ""): string => (typeof v === "string" ? v : fallback);
-const asArr = (v: unknown): unknown[] => (Array.isArray(v) ? v : []);
-
-/** GET /api/listings — guarantees rows is an array of shape-safe rows. */
-export function normalizeListingsResponse(raw: unknown): ListingsResponse {
- if (!raw || typeof raw !== "object" || !Array.isArray((raw as { rows?: unknown }).rows)) {
- throw new ApiError(0, "Malformed response from server (expected a listings payload).");
- }
- const o = sanitizeNonFinite(raw) as Record<string, unknown>;
- const rows = asArr(o.rows).map((r) => {
- const row = asObj(r);
- // guarantee the string fields that hit ad-hoc string ops downstream
- row.id = asString(row.id);
- row.title = asString(row.title);
- return row;
- });
- return {
- ...o,
- rows,
- total: typeof o.total === "number" ? o.total : rows.length,
- page: typeof o.page === "number" ? o.page : 1,
- pageSize: typeof o.pageSize === "number" ? o.pageSize : rows.length,
- tier: asString(o.tier, "FREE") as Tier,
- gated: !!o.gated,
- } as unknown as ListingsResponse;
-}
-
-/** GET /api/listings/:id — guarantees id/title strings + the mapped arrays. */
-export function normalizeListingDetail(raw: unknown): ListingDetail {
- if (!raw || typeof raw !== "object" || typeof (raw as { id?: unknown }).id !== "string") {
- throw new ApiError(0, "Malformed response from server (expected a listing detail).");
- }
- const o = sanitizeNonFinite(raw) as Record<string, unknown>;
- return {
- ...o,
- id: asString(o.id),
- title: asString(o.title),
- // arrays the detail screen .map()s over — never let them be non-arrays
- imageUrls: asArr(o.imageUrls).filter((u): u is string => typeof u === "string"),
- // guard ITEM shape too: a non-string sc.profile crashes sc.profile.replace()
- // in the detail screen — arrays-are-arrays isn't enough.
- scores: asArr(o.scores).map((s) => {
- const so = asObj(s);
- so.profile = asString(so.profile);
- so.explanation = asString(so.explanation);
- return so;
- }),
- comparables: asArr(o.comparables).map((c) => {
- const co = asObj(c);
- co.title = asString(co.title);
- co.kind = asString(co.kind);
- co.source = co.source == null ? null : asString(co.source);
- return co;
- }),
- // nested objects the screen reads with `cb.x` / `r.x` — object or null, never a scalar
- research: o.research && typeof o.research === "object" ? o.research : null,
- costBreakdown: o.costBreakdown && typeof o.costBreakdown === "object" ? o.costBreakdown : null,
- } as unknown as ListingDetail;
-}
diff --git a/govarbitrage/apps/mobile/package-lock.json b/govarbitrage/apps/mobile/package-lock.json
deleted file mode 100644
index f804459..0000000
--- a/govarbitrage/apps/mobile/package-lock.json
+++ /dev/null
@@ -1,7339 +0,0 @@
-{
- "name": "mobile",
- "version": "1.0.3",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "mobile",
- "version": "1.0.3",
- "dependencies": {
- "@expo/vector-icons": "^15.0.2",
- "@react-native-async-storage/async-storage": "2.2.0",
- "expo": "~57.0.11",
- "expo-apple-authentication": "~57.0.1",
- "expo-constants": "~57.0.9",
- "expo-linking": "~57.0.5",
- "expo-router": "~57.0.11",
- "expo-secure-store": "~57.0.1",
- "expo-splash-screen": "~57.0.5",
- "expo-status-bar": "~57.0.1",
- "react": "19.2.3",
- "react-native": "0.86.2",
- "react-native-gesture-handler": "~2.32.0",
- "react-native-reanimated": "4.5.1",
- "react-native-safe-area-context": "~5.7.0",
- "react-native-screens": "~4.26.0",
- "react-native-worklets": "0.10.1"
- },
- "devDependencies": {
- "@types/react": "~19.2.2",
- "typescript": "~6.0.3"
- }
- },
- "node_modules/@adobe/css-tools": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz",
- "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==",
- "license": "MIT"
- },
- "node_modules/@babel/code-frame": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
- "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.29.7",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.1.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
- "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
- "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.29.7",
- "@babel/generator": "^7.29.7",
- "@babel/helper-compilation-targets": "^7.29.7",
- "@babel/helper-module-transforms": "^7.29.7",
- "@babel/helpers": "^7.29.7",
- "@babel/parser": "^7.29.7",
- "@babel/template": "^7.29.7",
- "@babel/traverse": "^7.29.7",
- "@babel/types": "^7.29.7",
- "@jridgewell/remapping": "^2.3.5",
- "convert-source-map": "^2.0.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/generator": {
- "version": "7.29.8",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz",
- "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.29.8",
- "@babel/types": "^7.29.8",
- "@jridgewell/gen-mapping": "^0.3.12",
- "@jridgewell/trace-mapping": "^0.3.28",
- "jsesc": "^3.0.2"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz",
- "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
- "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.29.7",
- "@babel/helper-validator-option": "^7.29.7",
- "browserslist": "^4.24.0",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz",
- "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.29.7",
- "@babel/helper-member-expression-to-functions": "^7.29.7",
- "@babel/helper-optimise-call-expression": "^7.29.7",
- "@babel/helper-replace-supers": "^7.29.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
- "@babel/traverse": "^7.29.7",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz",
- "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.29.7",
- "regexpu-core": "^6.3.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.6.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz",
- "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.28.6",
- "@babel/helper-plugin-utils": "^7.28.6",
- "debug": "^4.4.3",
- "lodash.debounce": "^4.0.8",
- "resolve": "^1.22.11"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/@babel/helper-globals": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
- "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz",
- "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==",
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
- "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
- "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.29.7",
- "@babel/helper-validator-identifier": "^7.29.7",
- "@babel/traverse": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz",
- "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
- "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz",
- "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.29.7",
- "@babel/helper-wrap-function": "^7.29.7",
- "@babel/traverse": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-replace-supers": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz",
- "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.29.7",
- "@babel/helper-optimise-call-expression": "^7.29.7",
- "@babel/traverse": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz",
- "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
- "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
- "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
- "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-wrap-function": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz",
- "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==",
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.29.7",
- "@babel/traverse": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
- "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.29.8",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
- "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.29.8"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-proposal-decorators": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.7.tgz",
- "integrity": "sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/plugin-syntax-decorators": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-export-default-from": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.29.7.tgz",
- "integrity": "sha512-p+G5BNXDcy3bOXplhY4HybQ1GxH3i2Tppmdm/3epyRu2VgJJZuUlZ61MqRTg582Q7ZLBdP7fePYvsumSEkMxcQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-decorators": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.29.7.tgz",
- "integrity": "sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-export-default-from": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.29.7.tgz",
- "integrity": "sha512-foag0BB37ROhdeIX9O8G0jX7hw0UekJc04cHMrYLOnrErsnBKqJGHJ8eDRpoCFZBvEPPygmmtw4qyU97qa4oOw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-flow": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.29.7.tgz",
- "integrity": "sha512-ajMX6QPcyomotqwpzhkYGxcK2i/us0rs1Qo9QvUpa+Fca0FTmqrzKrctoIYLMxcOhGZldGT/BAVkRGTWBiR8gQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz",
- "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz",
- "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz",
- "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz",
- "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/helper-remap-async-to-generator": "^7.29.7",
- "@babel/traverse": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz",
- "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/helper-remap-async-to-generator": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz",
- "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz",
- "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz",
- "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.12.0"
- }
- },
- "node_modules/@babel/plugin-transform-classes": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz",
- "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.29.7",
- "@babel/helper-compilation-targets": "^7.29.7",
- "@babel/helper-globals": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/helper-replace-supers": "^7.29.7",
- "@babel/traverse": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz",
- "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/traverse": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz",
- "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-flow-strip-types": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.29.7.tgz",
- "integrity": "sha512-wRHeUjUjCZnMHmiO5bRgjFLcoEh7JyTdByOW11ahhwNa4V0bmeGEaIvt51yq0zQp2yWIpqfxXXPyUP6GFJZHOQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/plugin-syntax-flow": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-for-of": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz",
- "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz",
- "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz",
- "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz",
- "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz",
- "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz",
- "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/plugin-transform-destructuring": "^7.29.7",
- "@babel/plugin-transform-parameters": "^7.29.7",
- "@babel/traverse": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz",
- "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz",
- "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-parameters": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz",
- "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz",
- "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz",
- "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.29.7",
- "@babel/helper-create-class-features-plugin": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-display-name": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz",
- "integrity": "sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz",
- "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.29.7",
- "@babel/helper-module-imports": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/plugin-syntax-jsx": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-development": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz",
- "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==",
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-transform-react-jsx": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-pure-annotations": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz",
- "integrity": "sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-runtime": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz",
- "integrity": "sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7",
- "babel-plugin-polyfill-corejs2": "^0.4.14",
- "babel-plugin-polyfill-corejs3": "^0.13.0",
- "babel-plugin-polyfill-regenerator": "^0.6.5",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz",
- "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz",
- "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-typescript": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz",
- "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.29.7",
- "@babel/helper-create-class-features-plugin": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
- "@babel/plugin-syntax-typescript": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz",
- "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.29.7",
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-typescript": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz",
- "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7",
- "@babel/helper-validator-option": "^7.29.7",
- "@babel/plugin-syntax-jsx": "^7.29.7",
- "@babel/plugin-transform-modules-commonjs": "^7.29.7",
- "@babel/plugin-transform-typescript": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
- "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
- "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.29.7",
- "@babel/parser": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.29.8",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz",
- "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.29.7",
- "@babel/generator": "^7.29.8",
- "@babel/helper-globals": "^7.29.7",
- "@babel/parser": "^7.29.8",
- "@babel/template": "^7.29.7",
- "@babel/types": "^7.29.8",
- "debug": "^4.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.29.8",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
- "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-string-parser": "^7.29.7",
- "@babel/helper-validator-identifier": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@egjs/hammerjs": {
- "version": "2.0.17",
- "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz",
- "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==",
- "license": "MIT",
- "dependencies": {
- "@types/hammerjs": "^2.0.36"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/@expo-google-fonts/material-symbols": {
- "version": "0.4.42",
- "resolved": "https://registry.npmjs.org/@expo-google-fonts/material-symbols/-/material-symbols-0.4.42.tgz",
- "integrity": "sha512-KZmHZRcthJ3KFZZlpzHjopA9guZgWR9fb3uVZlTR0BNlvG2pw1bnYBCpkze2PB0vRllwGhAM7lWXsfmcWCbXYg==",
- "license": "MIT AND Apache-2.0"
- },
- "node_modules/@expo/code-signing-certificates": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz",
- "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==",
- "license": "MIT",
- "dependencies": {
- "node-forge": "^1.3.3"
- }
- },
- "node_modules/@expo/config": {
- "version": "57.0.6",
- "resolved": "https://registry.npmjs.org/@expo/config/-/config-57.0.6.tgz",
- "integrity": "sha512-VpMJpB/De/fb9bBFVVBiK6Ntg9lt0kAleLH9hcZz85CYRUQ3jVFVA8rNC5f8y4cp2+FiiPNFp62+kEOFI6pDiw==",
- "license": "MIT",
- "dependencies": {
- "@expo/config-plugins": "~57.0.6",
- "@expo/config-types": "^57.0.2",
- "@expo/json-file": "^11.0.1",
- "@expo/require-utils": "^57.0.4",
- "deepmerge": "^4.3.1",
- "getenv": "^2.0.0",
- "glob": "^13.0.0",
- "resolve-workspace-root": "^2.0.0",
- "semver": "^7.6.0",
- "slugify": "^1.3.4"
- }
- },
- "node_modules/@expo/config-plugins": {
- "version": "57.0.7",
- "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.7.tgz",
- "integrity": "sha512-jvXMiNuH8W7fmU9yCk4/jVwDX2G/5rWUg5PZ22mriccEeQVS9HJjQiUHivMaK6MxEG5L9f0RPScxe/nQfnpQvg==",
- "license": "MIT",
- "dependencies": {
- "@expo/config-types": "^57.0.2",
- "@expo/json-file": "~11.0.1",
- "@expo/plist": "^0.8.1",
- "@expo/require-utils": "^57.0.4",
- "@expo/sdk-runtime-versions": "^1.0.0",
- "chalk": "^4.1.2",
- "debug": "^4.3.5",
- "getenv": "^2.0.0",
- "glob": "^13.0.0",
- "semver": "^7.5.4",
- "slugify": "^1.6.6",
- "xcode": "^3.0.1",
- "xml2js": "0.6.0"
- }
- },
- "node_modules/@expo/config-types": {
- "version": "57.0.2",
- "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-57.0.2.tgz",
- "integrity": "sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==",
- "license": "MIT"
- },
- "node_modules/@expo/devcert": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz",
- "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==",
- "license": "MIT",
- "dependencies": {
- "@expo/sudo-prompt": "^9.3.1",
- "debug": "^3.1.0"
- }
- },
- "node_modules/@expo/devcert/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/@expo/devtools": {
- "version": "57.0.1",
- "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-57.0.1.tgz",
- "integrity": "sha512-GyUf+wFNkbttaX0jR7MZa9bm77U0IrLg6d2AjpxdyoXw/w4abHoXG0oFufwLMgP9zLTd5+Ct4X/ffNUTnlzZgg==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.1.2"
- },
- "peerDependencies": {
- "react": "*",
- "react-native": "*"
- },
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-native": {
- "optional": true
- }
- }
- },
- "node_modules/@expo/dom-webview": {
- "version": "57.0.1",
- "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-57.0.1.tgz",
- "integrity": "sha512-lAKsME4SAq+8sf56oN0DX5TBYyruupoRxbWbD2xf9RnKY8y6x8eb9LCE5pxSN0qyWdqnp+0wmyWzDkKboThKAw==",
- "license": "MIT",
- "peerDependencies": {
- "expo": "*",
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/@expo/env": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.4.2.tgz",
- "integrity": "sha512-28pqaEqwnmLduZ00Pq9HkSzE5wbj1MTwp5/n8nm8rD8MCjR9eUnVOwmNksPI3Be2ReAPO/DbPn1puy0mvoocsQ==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^4.0.0",
- "debug": "^4.3.4",
- "getenv": "^2.0.0"
- },
- "engines": {
- "node": ">=20.12.0"
- }
- },
- "node_modules/@expo/expo-modules-macros-plugin": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/@expo/expo-modules-macros-plugin/-/expo-modules-macros-plugin-0.6.1.tgz",
- "integrity": "sha512-cpsLZE4rqkc1Y3eZTkxB98jrqY1YXgetmtxFt8q89jBRmk3quRuk1BZo+VcnCSObZardjg99r1k5xijEMONFGA==",
- "license": "MIT"
- },
- "node_modules/@expo/fingerprint": {
- "version": "0.20.6",
- "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.20.6.tgz",
- "integrity": "sha512-cmC/6BOPRbdKr77Mgjwszb8aM0hY2RKBpMRCmjSdn9zIcn2FGor/ic4fHVr46cQFa1G6RDGg1GyAjRw3US4CCQ==",
- "license": "MIT",
- "dependencies": {
- "@expo/env": "^2.4.2",
- "@expo/spawn-async": "^1.8.0",
- "arg": "^5.0.2",
- "chalk": "^4.1.2",
- "debug": "^4.3.4",
- "getenv": "^2.0.0",
- "glob": "^13.0.0",
- "ignore": "^5.3.1",
- "minimatch": "^10.2.2",
- "resolve-from": "^5.0.0",
- "semver": "^7.6.0"
- },
- "bin": {
- "fingerprint": "bin/cli.js"
- }
- },
- "node_modules/@expo/image-utils": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.11.4.tgz",
- "integrity": "sha512-pn/4770DIEOcYZr484uazuwg20FX/qaDkeMRF6J+oxejynDmEmO8wLsCudaNShFE0BhyKGQTYrs2rsRhqrqESw==",
- "license": "MIT",
- "dependencies": {
- "@expo/require-utils": "^57.0.4",
- "@expo/spawn-async": "^1.8.0",
- "chalk": "^4.0.0",
- "getenv": "^2.0.0",
- "jimp-compact": "0.16.1",
- "parse-png": "^2.1.0",
- "semver": "^7.6.0"
- }
- },
- "node_modules/@expo/inline-modules": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/@expo/inline-modules/-/inline-modules-0.1.4.tgz",
- "integrity": "sha512-8bPSCm//dv8raYfrQ4x79rCX52vMw0QzmnYYl4eSOAvEbGvDPPRGGdbrhZZ7oihU+hI1sZNS5kYEgqODgFwfsw==",
- "license": "MIT",
- "dependencies": {
- "@expo/config-plugins": "~57.0.6"
- }
- },
- "node_modules/@expo/json-file": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.1.tgz",
- "integrity": "sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.20.0",
- "json5": "^2.2.3"
- }
- },
- "node_modules/@expo/local-build-cache-provider": {
- "version": "57.0.5",
- "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-57.0.5.tgz",
- "integrity": "sha512-OwiNC0Uxu67TOH7TEQ94GLa4oNzNfbbItKGdy3QMfX+hCSZv2VvjcjRo5vttMHfXCnXa9KZIu3GBS9pvtDHWhA==",
- "license": "MIT",
- "dependencies": {
- "@expo/config": "~57.0.6",
- "chalk": "^4.1.2"
- }
- },
- "node_modules/@expo/log-box": {
- "version": "57.0.2",
- "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-57.0.2.tgz",
- "integrity": "sha512-ZsFyfIR7YCbQAdVLzuTUmMHofZC7ZS9ywYCJNPlLc78x59cI8GwXFEIVbRjjC0uJERpNtXx/tsNNnkhexXlzMw==",
- "license": "MIT",
- "dependencies": {
- "@expo/dom-webview": "^57.0.1",
- "anser": "^1.4.9",
- "stacktrace-parser": "^0.1.10"
- },
- "peerDependencies": {
- "@expo/dom-webview": "^57.0.1",
- "expo": "*",
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/@expo/metro": {
- "version": "56.0.0",
- "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-56.0.0.tgz",
- "integrity": "sha512-5gIgQHtEpjjvsjKfVtIv23a98LLRV0/y07PDShEwYSytAMlE3FSF8RHXqtHc1sUJL6dn7hnuIBpIbrLXXuVi0A==",
- "license": "MIT",
- "dependencies": {
- "metro": "0.84.4",
- "metro-babel-transformer": "0.84.4",
- "metro-cache": "0.84.4",
- "metro-cache-key": "0.84.4",
- "metro-config": "0.84.4",
- "metro-core": "0.84.4",
- "metro-file-map": "0.84.4",
- "metro-minify-terser": "0.84.4",
- "metro-resolver": "0.84.4",
- "metro-runtime": "0.84.4",
- "metro-source-map": "0.84.4",
- "metro-symbolicate": "0.84.4",
- "metro-transform-plugins": "0.84.4",
- "metro-transform-worker": "0.84.4"
- }
- },
- "node_modules/@expo/metro-file-map": {
- "version": "57.0.1",
- "resolved": "https://registry.npmjs.org/@expo/metro-file-map/-/metro-file-map-57.0.1.tgz",
- "integrity": "sha512-8JXfVstZN7QnP4NianZZnlTVboOWR0sG8trUDNajOjnbGlPln29vponXM84tY+3tAHapz5/TxE53L0ixUwqPtA==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.3.4",
- "fb-watchman": "^2.0.2",
- "invariant": "^2.2.4",
- "jest-worker": "^29.7.0",
- "micromatch": "^4.0.4",
- "walker": "^1.0.8"
- }
- },
- "node_modules/@expo/osascript": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.7.1.tgz",
- "integrity": "sha512-Zn03EX6In7ts2lPUW2ESUSkEhEWQN1qqsiXjadtZMJOuZRkMiAg1ZQHuvz9DjByDWNJ2pBwAGyrts9lj9k389g==",
- "license": "MIT",
- "dependencies": {
- "@expo/spawn-async": "^1.8.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@expo/package-manager": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.13.1.tgz",
- "integrity": "sha512-y/K+CaYYpZpNGZhSX4HyLT/vyIunFjNfyoxNysPBCefeLKI/VCx6f9LNPzrxayr3rCYO5bl9O8H+HRQK265Nkg==",
- "license": "MIT",
- "dependencies": {
- "@expo/json-file": "^11.0.1",
- "@expo/spawn-async": "^1.8.0",
- "chalk": "^4.0.0",
- "npm-package-arg": "^11.0.0",
- "ora": "^3.4.0",
- "resolve-workspace-root": "^2.0.0"
- }
- },
- "node_modules/@expo/plist": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.8.1.tgz",
- "integrity": "sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==",
- "license": "MIT",
- "dependencies": {
- "@xmldom/xmldom": "^0.8.8",
- "base64-js": "^1.5.1",
- "xmlbuilder": "^15.1.1"
- }
- },
- "node_modules/@expo/prebuild-config": {
- "version": "57.0.10",
- "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-57.0.10.tgz",
- "integrity": "sha512-myrS5NolFAQWD8g7QuqkettnkyJx3GRl603N6rlmqAMxmO5EU7sZu4EX2EsIKkva8QtpX84B0E17PsM9xXMsTQ==",
- "license": "MIT",
- "dependencies": {
- "@expo/config": "~57.0.6",
- "@expo/config-plugins": "~57.0.6",
- "@expo/config-types": "^57.0.2",
- "@expo/image-utils": "^0.11.4",
- "@expo/json-file": "^11.0.1",
- "@react-native/normalize-colors": "0.86.2",
- "debug": "^4.3.1",
- "expo-modules-autolinking": "~57.0.9",
- "resolve-from": "^5.0.0",
- "semver": "^7.6.0"
- }
- },
- "node_modules/@expo/require-utils": {
- "version": "57.0.4",
- "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-57.0.4.tgz",
- "integrity": "sha512-e7xbg/9BTQcsZE/oErafZXtI7kh5IgfasLJ97J5sFSzX2cA74pDvdlhW1KHVSaDkQyQv6h1LSLhsY7dEeOk7hw==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.20.0",
- "@babel/core": "^7.25.2",
- "@babel/plugin-transform-modules-commonjs": "^7.24.8"
- },
- "peerDependencies": {
- "typescript": "^5.0.0 || ^5.0.0-0 || ^6.0.0 || ^7.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@expo/schema-utils": {
- "version": "57.0.2",
- "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-57.0.2.tgz",
- "integrity": "sha512-fMu/jyN0l1Wzv7XkeWR4IYCx1M8ryui3FdBNGrWwbRgJ7EhxXxK8E2jxP2W3pbgUwUY0V3hG8+GyfCZwny+Lxw==",
- "license": "MIT"
- },
- "node_modules/@expo/sdk-runtime-versions": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz",
- "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==",
- "license": "MIT"
- },
- "node_modules/@expo/spawn-async": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.8.0.tgz",
- "integrity": "sha512-eb9xxd/LbuEGSdua4NumCu/McVB9EM+F/JxB9pWgnERw4HQ9XyTNH1KapG6oqLWR8TuRK2LQfzJlmNi94CVobw==",
- "license": "MIT",
- "dependencies": {
- "cross-spawn": "^7.0.6"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@expo/sudo-prompt": {
- "version": "9.3.2",
- "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz",
- "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==",
- "license": "MIT"
- },
- "node_modules/@expo/vector-icons": {
- "version": "15.1.1",
- "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz",
- "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==",
- "license": "MIT",
- "peerDependencies": {
- "expo-font": ">=14.0.4",
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/@expo/xcpretty": {
- "version": "4.4.4",
- "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.4.tgz",
- "integrity": "sha512-4aQzz9vgxcNXFfo/iyNgDDYfsU5XGKKxWxZopw0cVotHiW+U8IJbIxMaxsINs6bHhtkG3StKNPcOrn3eBuxKPw==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/code-frame": "^7.20.0",
- "chalk": "^4.1.0",
- "js-yaml": "^4.1.0"
- },
- "bin": {
- "excpretty": "build/cli.js"
- }
- },
- "node_modules/@isaacs/ttlcache": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz",
- "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
- "license": "MIT",
- "dependencies": {
- "@sinclair/typebox": "^0.27.8"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/types": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
- "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/remapping": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
- "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.11",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
- "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.31",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@radix-ui/primitive": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz",
- "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==",
- "license": "MIT"
- },
- "node_modules/@radix-ui/react-collection": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz",
- "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.5",
- "@radix-ui/react-context": "1.2.2",
- "@radix-ui/react-primitive": "2.1.10",
- "@radix-ui/react-slot": "1.3.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-compose-refs": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz",
- "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-context": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz",
- "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog": {
- "version": "1.1.23",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz",
- "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.7",
- "@radix-ui/react-compose-refs": "1.1.5",
- "@radix-ui/react-context": "1.2.2",
- "@radix-ui/react-dismissable-layer": "1.1.19",
- "@radix-ui/react-focus-guards": "1.1.6",
- "@radix-ui/react-focus-scope": "1.1.16",
- "@radix-ui/react-id": "1.1.4",
- "@radix-ui/react-portal": "1.1.17",
- "@radix-ui/react-presence": "1.1.10",
- "@radix-ui/react-primitive": "2.1.10",
- "@radix-ui/react-slot": "1.3.3",
- "@radix-ui/react-use-controllable-state": "1.2.6",
- "@radix-ui/react-use-layout-effect": "1.1.4",
- "aria-hidden": "^1.2.4",
- "react-remove-scroll": "^2.7.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-direction": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz",
- "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dismissable-layer": {
- "version": "1.1.19",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz",
- "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.7",
- "@radix-ui/react-compose-refs": "1.1.5",
- "@radix-ui/react-primitive": "2.1.10",
- "@radix-ui/react-use-callback-ref": "1.1.4",
- "@radix-ui/react-use-effect-event": "0.0.5"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-focus-guards": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz",
- "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-focus-scope": {
- "version": "1.1.16",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz",
- "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.5",
- "@radix-ui/react-primitive": "2.1.10",
- "@radix-ui/react-use-callback-ref": "1.1.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-id": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz",
- "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-layout-effect": "1.1.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-portal": {
- "version": "1.1.17",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz",
- "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.1.10",
- "@radix-ui/react-use-layout-effect": "1.1.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-presence": {
- "version": "1.1.10",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz",
- "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-layout-effect": "1.1.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-primitive": {
- "version": "2.1.10",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz",
- "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-slot": "1.3.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-roving-focus": {
- "version": "1.1.19",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz",
- "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.7",
- "@radix-ui/react-collection": "1.1.15",
- "@radix-ui/react-compose-refs": "1.1.5",
- "@radix-ui/react-context": "1.2.2",
- "@radix-ui/react-direction": "1.1.4",
- "@radix-ui/react-id": "1.1.4",
- "@radix-ui/react-primitive": "2.1.10",
- "@radix-ui/react-use-callback-ref": "1.1.4",
- "@radix-ui/react-use-controllable-state": "1.2.6",
- "@radix-ui/react-use-is-hydrated": "0.1.3",
- "@radix-ui/react-use-layout-effect": "1.1.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-slot": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz",
- "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.5"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-callback-ref": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz",
- "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-controllable-state": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz",
- "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.7",
- "@radix-ui/react-use-effect-event": "0.0.5",
- "@radix-ui/react-use-layout-effect": "1.1.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-effect-event": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz",
- "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-layout-effect": "1.1.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-is-hydrated": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz",
- "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-layout-effect": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz",
- "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@react-native-async-storage/async-storage": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz",
- "integrity": "sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==",
- "license": "MIT",
- "dependencies": {
- "merge-options": "^3.0.4"
- },
- "peerDependencies": {
- "react-native": "^0.0.0-0 || >=0.65 <1.0"
- }
- },
- "node_modules/@react-native-masked-view/masked-view": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@react-native-masked-view/masked-view/-/masked-view-0.3.2.tgz",
- "integrity": "sha512-XwuQoW7/GEgWRMovOQtX3A4PrXhyaZm0lVUiY8qJDvdngjLms9Cpdck6SmGAUNqQwcj2EadHC1HwL0bEyoa/SQ==",
- "license": "MIT",
- "peerDependencies": {
- "react": ">=16",
- "react-native": ">=0.57"
- }
- },
- "node_modules/@react-native/assets-registry": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.86.2.tgz",
- "integrity": "sha512-vcX/mBjWAVnWofu7KecotquI2unZ/tITwA7OGdq/mdY/zmGXIEvYhfEYyOQij/LRqi9WAL+iizInTBWnxDhK/Q==",
- "license": "MIT",
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/@react-native/babel-plugin-codegen": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.86.2.tgz",
- "integrity": "sha512-NNDZqOlNbH5SzgPks1jFDYH3234Rpa5e/nhZymxhIiBH3NcE3uD+rGj/HWXhH7nHF2ToGK6XbUpqy7nmJPeh+g==",
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.29.0",
- "@react-native/codegen": "0.86.2"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/@react-native/codegen": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.86.2.tgz",
- "integrity": "sha512-xKkudsahUJ1n//55g4fXk5BStVqqmZlz8HQveL45ZxcfDnwvhuYe2GymksQANFsSN+slvrarjrfq8kIxJzbceA==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "@babel/parser": "^7.29.0",
- "hermes-parser": "0.36.0",
- "invariant": "^2.2.4",
- "nullthrows": "^1.1.1",
- "tinyglobby": "^0.2.15",
- "yargs": "^17.6.2"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- },
- "peerDependencies": {
- "@babel/core": "*"
- }
- },
- "node_modules/@react-native/codegen/node_modules/hermes-estree": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.0.tgz",
- "integrity": "sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==",
- "license": "MIT"
- },
- "node_modules/@react-native/codegen/node_modules/hermes-parser": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.0.tgz",
- "integrity": "sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==",
- "license": "MIT",
- "dependencies": {
- "hermes-estree": "0.36.0"
- }
- },
- "node_modules/@react-native/community-cli-plugin": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.86.2.tgz",
- "integrity": "sha512-YHXNKoM6Y/HjREySZ5arET2xgiHgg67r1MdwJB//MPJAJ0Xc5g0u6UHxY9VzsHO3Y07dre6s0BinYwjt1SEWvQ==",
- "license": "MIT",
- "dependencies": {
- "@react-native/dev-middleware": "0.86.2",
- "debug": "^4.4.0",
- "invariant": "^2.2.4",
- "metro": "^0.84.3",
- "metro-config": "^0.84.3",
- "metro-core": "^0.84.3",
- "semver": "^7.1.3"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- },
- "peerDependencies": {
- "@react-native-community/cli": "*",
- "@react-native/metro-config": "0.86.2"
- },
- "peerDependenciesMeta": {
- "@react-native-community/cli": {
- "optional": true
- },
- "@react-native/metro-config": {
- "optional": true
- }
- }
- },
- "node_modules/@react-native/debugger-frontend": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.86.2.tgz",
- "integrity": "sha512-KGS1aV5F6cIqpnoIUhLBXyVzy1oAj8jBFGau6vX4Vy0HXRJN7p+68RU7x6NuyraHvQcR14ccMGT5TkFuNjQ4gA==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/@react-native/debugger-shell": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.86.2.tgz",
- "integrity": "sha512-/TaVJ2+gGajZPJGrFaObUQmHmlaxAlfmOPZicl6pNKDUjzSgFMpcLkdTOExvb+USYTVdGX1XwxXyvjQdUO2bvg==",
- "license": "MIT",
- "dependencies": {
- "cross-spawn": "^7.0.6",
- "debug": "^4.4.0",
- "fb-dotslash": "0.5.8"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/@react-native/dev-middleware": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.86.2.tgz",
- "integrity": "sha512-B7L0vKvg+IcEElT7Vpqh1xj5yJAqWUegjbP+bQRaorJMAYnv11GkliTnZV2AdTDfZQJWgOEx8i8LGkHkUg7bnA==",
- "license": "MIT",
- "dependencies": {
- "@isaacs/ttlcache": "^1.4.1",
- "@react-native/debugger-frontend": "0.86.2",
- "@react-native/debugger-shell": "0.86.2",
- "chrome-launcher": "^0.15.2",
- "chromium-edge-launcher": "^0.3.0",
- "connect": "^3.6.5",
- "debug": "^4.4.0",
- "invariant": "^2.2.4",
- "nullthrows": "^1.1.1",
- "open": "^7.0.3",
- "serve-static": "^1.16.2",
- "ws": "^7.5.10"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/@react-native/gradle-plugin": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.86.2.tgz",
- "integrity": "sha512-2F6x14NcHMpVmfTTFKfMkpV5dZedZrLiv6PE+c3vgnesV2bjleUBydr4U+NI8VkI7OwW71L0A5qQ76I9LCrfoQ==",
- "license": "MIT",
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/@react-native/js-polyfills": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.86.2.tgz",
- "integrity": "sha512-bIwNcGBaQ74shB5z1mRkxOpjikimuwsnOCEkZSzL67Z1FTyK1ObpENfyd2QvcvVW9Cjl+tHuw9ynpBnb2jPoJQ==",
- "license": "MIT",
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/@react-native/normalize-colors": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.86.2.tgz",
- "integrity": "sha512-EzPFc9Y6lzYOWeso2almwXI7f8+qReHxWvT+algsOczb2UhWXIWXDoSvkdwoSfiwwmGt/ijJgKJoeHlzPkLwRg==",
- "license": "MIT"
- },
- "node_modules/@react-native/virtualized-lists": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.86.2.tgz",
- "integrity": "sha512-uO0J72gh3EvE+1/GHRk18QRyBDTRHRB0AraAfojsRjbT7VMuJwKrZYaKGshavoaEud6aw00ZB9/8mTMIKjjcAw==",
- "license": "MIT",
- "dependencies": {
- "invariant": "^2.2.4",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- },
- "peerDependencies": {
- "@types/react": "^19.2.0",
- "react": "*",
- "react-native": "0.86.2"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@sinclair/typebox": {
- "version": "0.27.12",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz",
- "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==",
- "license": "MIT"
- },
- "node_modules/@testing-library/jest-dom": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz",
- "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==",
- "license": "MIT",
- "dependencies": {
- "@adobe/css-tools": "^4.4.0",
- "aria-query": "^5.0.0",
- "css.escape": "^1.5.1",
- "dom-accessibility-api": "^0.6.3",
- "picocolors": "^1.1.1",
- "redent": "^3.0.0"
- },
- "engines": {
- "node": ">=14",
- "npm": ">=6",
- "yarn": ">=1"
- }
- },
- "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
- "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
- "license": "MIT"
- },
- "node_modules/@testing-library/user-event": {
- "version": "14.6.3",
- "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.3.tgz",
- "integrity": "sha512-6dBq67jT8lE+JTE8Exm02Kt6ze43hz1jdiSpSJwtTZiT1xQQ6b7nZYTTQ9njdArdU8XklOwaDp/AbT/eYSKF4g==",
- "license": "MIT",
- "engines": {
- "node": ">=12",
- "npm": ">=6"
- },
- "peerDependencies": {
- "@testing-library/dom": ">=7.21.4"
- }
- },
- "node_modules/@types/hammerjs": {
- "version": "2.0.46",
- "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz",
- "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==",
- "license": "MIT"
- },
- "node_modules/@types/istanbul-lib-coverage": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
- "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
- "license": "MIT"
- },
- "node_modules/@types/istanbul-lib-report": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
- "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-coverage": "*"
- }
- },
- "node_modules/@types/istanbul-reports": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
- "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
- "license": "MIT",
- "dependencies": {
- "@types/istanbul-lib-report": "*"
- }
- },
- "node_modules/@types/node": {
- "version": "26.1.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz",
- "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==",
- "license": "MIT",
- "dependencies": {
- "undici-types": "~8.3.0"
- }
- },
- "node_modules/@types/react": {
- "version": "19.2.18",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz",
- "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==",
- "license": "MIT",
- "dependencies": {
- "csstype": "^3.2.2"
- }
- },
- "node_modules/@types/react-test-renderer": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-19.1.0.tgz",
- "integrity": "sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==",
- "license": "MIT",
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/yargs": {
- "version": "17.0.35",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
- "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@types/yargs-parser": {
- "version": "21.0.3",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
- "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
- "license": "MIT"
- },
- "node_modules/@ungap/structured-clone": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz",
- "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==",
- "license": "ISC"
- },
- "node_modules/@xmldom/xmldom": {
- "version": "0.8.13",
- "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz",
- "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==",
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/abort-controller": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
- "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
- "license": "MIT",
- "dependencies": {
- "event-target-shim": "^5.0.0"
- },
- "engines": {
- "node": ">=6.5"
- }
- },
- "node_modules/accepts": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
- "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
- "license": "MIT",
- "dependencies": {
- "mime-types": "^3.0.0",
- "negotiator": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/acorn": {
- "version": "8.18.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
- "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/agent-base": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
- "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/agent-cli-detector": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/agent-cli-detector/-/agent-cli-detector-0.1.5.tgz",
- "integrity": "sha512-6xvLw0EGPuxoYGZeqyMV4AK+WoZ31jsqb7a5pln1BTf6oDFsrgvfCJT7E7y9oAqifJZhJ3fZ0J36H7o6JzrB0Q==",
- "license": "MIT",
- "bin": {
- "agent-cli-detector": "dist/cli.js"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/anser": {
- "version": "1.4.10",
- "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz",
- "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==",
- "license": "MIT"
- },
- "node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.21.3"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ansi-escapes/node_modules/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/arg": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
- "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
- "license": "MIT"
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "license": "Python-2.0"
- },
- "node_modules/aria-hidden": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
- "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/aria-query": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
- "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
- "license": "Apache-2.0",
- "dependencies": {
- "dequal": "^2.0.3"
- }
- },
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "license": "MIT"
- },
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.17",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz",
- "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==",
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.28.6",
- "@babel/helper-define-polyfill-provider": "^0.6.8",
- "semver": "^6.3.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz",
- "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.5",
- "core-js-compat": "^3.43.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.6.8",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz",
- "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.8"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-react-compiler": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz",
- "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.26.0"
- }
- },
- "node_modules/babel-plugin-react-native-web": {
- "version": "0.21.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz",
- "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==",
- "license": "MIT"
- },
- "node_modules/babel-plugin-syntax-hermes-parser": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.36.0.tgz",
- "integrity": "sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==",
- "license": "MIT",
- "dependencies": {
- "hermes-parser": "0.36.0"
- }
- },
- "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-estree": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.0.tgz",
- "integrity": "sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==",
- "license": "MIT"
- },
- "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-parser": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.0.tgz",
- "integrity": "sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==",
- "license": "MIT",
- "dependencies": {
- "hermes-estree": "0.36.0"
- }
- },
- "node_modules/babel-plugin-transform-flow-enums": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz",
- "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-syntax-flow": "^7.12.1"
- }
- },
- "node_modules/balanced-match": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
- "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
- "license": "MIT",
- "engines": {
- "node": "18 || 20 || >=22"
- }
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/baseline-browser-mapping": {
- "version": "2.11.12",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz",
- "integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==",
- "license": "Apache-2.0",
- "bin": {
- "baseline-browser-mapping": "dist/cli.cjs"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/big-integer": {
- "version": "1.6.52",
- "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
- "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
- "license": "Unlicense",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/bplist-creator": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz",
- "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==",
- "license": "MIT",
- "dependencies": {
- "stream-buffers": "2.2.x"
- }
- },
- "node_modules/bplist-parser": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz",
- "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==",
- "license": "MIT",
- "dependencies": {
- "big-integer": "1.6.x"
- },
- "engines": {
- "node": ">= 5.10.0"
- }
- },
- "node_modules/brace-expansion": {
- "version": "5.0.9",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
- "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^4.0.2"
- },
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.28.7",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz",
- "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "baseline-browser-mapping": "^2.10.44",
- "caniuse-lite": "^1.0.30001806",
- "electron-to-chromium": "^1.5.393",
- "node-releases": "^2.0.51",
- "update-browserslist-db": "^1.2.3"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/bser": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
- "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "node-int64": "^0.4.0"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "license": "MIT"
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001807",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001807.tgz",
- "integrity": "sha512-daRXJ9EB/rdRgu7kV+TTl1YUKtlsMWblPl2sLnpg9DZae16QCegol6A1SmCE31Lm9mXC1sRWGt/krouH+/dl7Q==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/chrome-launcher": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz",
- "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@types/node": "*",
- "escape-string-regexp": "^4.0.0",
- "is-wsl": "^2.2.0",
- "lighthouse-logger": "^1.0.0"
- },
- "bin": {
- "print-chrome-path": "bin/print-chrome-path.js"
- },
- "engines": {
- "node": ">=12.13.0"
- }
- },
- "node_modules/chromium-edge-launcher": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.3.0.tgz",
- "integrity": "sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@types/node": "*",
- "escape-string-regexp": "^4.0.0",
- "is-wsl": "^2.2.0",
- "lighthouse-logger": "^1.0.0",
- "mkdirp": "^1.0.4"
- }
- },
- "node_modules/ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "license": "MIT"
- },
- "node_modules/cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==",
- "license": "MIT",
- "dependencies": {
- "restore-cursor": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cli-spinners": {
- "version": "2.9.2",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
- "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/client-only": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
- "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
- "license": "MIT"
- },
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "license": "ISC",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
- "license": "MIT",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/color": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
- "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1",
- "color-string": "^1.9.0"
- },
- "engines": {
- "node": ">=12.5.0"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "license": "MIT"
- },
- "node_modules/color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
- "license": "MIT",
- "dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
- "node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "license": "MIT",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "license": "MIT",
- "dependencies": {
- "mime-db": ">= 1.43.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/compression": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
- "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
- "license": "MIT",
- "dependencies": {
- "bytes": "3.1.2",
- "compressible": "~2.0.18",
- "debug": "2.6.9",
- "negotiator": "~0.6.4",
- "on-headers": "~1.1.0",
- "safe-buffer": "5.2.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/compression/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/compression/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/compression/node_modules/negotiator": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
- "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/connect": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
- "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
- "license": "MIT",
- "dependencies": {
- "debug": "2.6.9",
- "finalhandler": "1.1.2",
- "parseurl": "~1.3.3",
- "utils-merge": "1.0.1"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/connect/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/connect/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "license": "MIT"
- },
- "node_modules/core-js-compat": {
- "version": "3.50.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.50.0.tgz",
- "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==",
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.28.7"
- },
- "engines": {
- "node": ">=6.4.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/css.escape": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
- "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
- "license": "MIT"
- },
- "node_modules/csstype": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
- "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
- "license": "MIT"
- },
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decode-uri-component": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
- "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/defaults": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
- "license": "MIT",
- "dependencies": {
- "clone": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/detect-libc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/detect-node-es": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
- "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
- "license": "MIT"
- },
- "node_modules/dnssd-advertise": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/dnssd-advertise/-/dnssd-advertise-1.1.6.tgz",
- "integrity": "sha512-Ndrrf6BMPalkQPd/zubL+4YghH2J9NspapQ09uDXwYbvOPkP0oaqf5CkcwJ0b50kS2O3ul6yVu+jz+RY62Cejg==",
- "license": "MIT"
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "license": "MIT"
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.402",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.402.tgz",
- "integrity": "sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA==",
- "license": "ISC"
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "license": "MIT"
- },
- "node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/error-stack-parser": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
- "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
- "license": "MIT",
- "dependencies": {
- "stackframe": "^1.3.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "license": "MIT"
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/event-target-shim": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
- "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/expo": {
- "version": "57.0.11",
- "resolved": "https://registry.npmjs.org/expo/-/expo-57.0.11.tgz",
- "integrity": "sha512-R97257N39Dw0kQFuI4/RvYx95GQ+dmePdo8hxcMOjDxAT4VcCckjILJeAWCE19Jxjb92hZ5NDXAfDPkkV1RB9w==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.20.0",
- "@expo/cli": "^57.0.13",
- "@expo/config": "~57.0.6",
- "@expo/config-plugins": "~57.0.7",
- "@expo/devtools": "~57.0.1",
- "@expo/dom-webview": "~57.0.1",
- "@expo/fingerprint": "^0.20.6",
- "@expo/local-build-cache-provider": "^57.0.5",
- "@expo/log-box": "^57.0.2",
- "@expo/metro": "~56.0.0",
- "@expo/metro-config": "~57.0.7",
- "@ungap/structured-clone": "^1.3.0",
- "babel-preset-expo": "~57.0.6",
- "expo-asset": "~57.0.9",
- "expo-constants": "~57.0.9",
- "expo-file-system": "~57.0.2",
- "expo-font": "~57.0.1",
- "expo-keep-awake": "~57.0.1",
- "expo-modules-autolinking": "~57.0.9",
- "expo-modules-core": "~57.0.10",
- "pretty-format": "^29.7.0",
- "react-refresh": "^0.14.2",
- "whatwg-url-minimum": "^0.1.2"
- },
- "bin": {
- "expo": "bin/cli",
- "expo-modules-autolinking": "bin/autolinking",
- "fingerprint": "bin/fingerprint"
- },
- "peerDependencies": {
- "@expo/dom-webview": "*",
- "@expo/metro-runtime": "*",
- "react": "*",
- "react-dom": "*",
- "react-native": "*",
- "react-native-web": "*",
- "react-native-webview": "*"
- },
- "peerDependenciesMeta": {
- "@expo/dom-webview": {
- "optional": true
- },
- "@expo/metro-runtime": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- },
- "react-native-web": {
- "optional": true
- },
- "react-native-webview": {
- "optional": true
- }
- }
- },
- "node_modules/expo-apple-authentication": {
- "version": "57.0.1",
- "resolved": "https://registry.npmjs.org/expo-apple-authentication/-/expo-apple-authentication-57.0.1.tgz",
- "integrity": "sha512-pqAIaiTa/ycNl+XqNg5UMVT5TBgl6q6djTtoIcUmDItjVBA1IDHsQEs+leo+8+fG5hhuempZLSqBVVn+RJKKWA==",
- "license": "MIT",
- "peerDependencies": {
- "expo": "*",
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/expo-constants": {
- "version": "57.0.9",
- "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-57.0.9.tgz",
- "integrity": "sha512-Y47sGiF+U8fwicUSPdJPjB27PuU+FgLK4Mpai0ksZF5hv8jNN3HBqKuDNxsiu70uHBKf80TaR4gwMPh0pmETiQ==",
- "license": "MIT",
- "dependencies": {
- "@expo/env": "~2.4.2"
- },
- "peerDependencies": {
- "expo": "*",
- "react-native": "*"
- }
- },
- "node_modules/expo-font": {
- "version": "57.0.1",
- "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-57.0.1.tgz",
- "integrity": "sha512-QyS9L1Kh9sKJg4gfU6rdbpxpmH+DyzBX8z6jVvXMUDoqLr1GqmkO/Wu379KCXjL///kWbhpNlbi7AgBuj4VdIQ==",
- "license": "MIT",
- "dependencies": {
- "fontfaceobserver": "^2.1.0"
- },
- "peerDependencies": {
- "expo": "*",
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/expo-glass-effect": {
- "version": "57.0.1",
- "resolved": "https://registry.npmjs.org/expo-glass-effect/-/expo-glass-effect-57.0.1.tgz",
- "integrity": "sha512-m/n8maxqNcHk6ZDhuqXBfD5Kt1Iz3M8xykVgdB0iSCIXvF70IqWXmQhX8Psswhrp8eZ+3r0mAD0Jh/2gFA3QaA==",
- "license": "MIT",
- "peerDependencies": {
- "expo": "*",
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/expo-linking": {
- "version": "57.0.5",
- "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-57.0.5.tgz",
- "integrity": "sha512-SmJI3wr0EVfeKPGf+Qgr9gUbrXk8mM0ATqYLvAX/EAzawDjohPzMJ5pTt7TYMX0Wknj4XCtyCQrGhnERMXT6cQ==",
- "license": "MIT",
- "dependencies": {
- "expo-constants": "~57.0.9",
- "invariant": "^2.2.4"
- },
- "peerDependencies": {
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/expo-modules-autolinking": {
- "version": "57.0.9",
- "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-57.0.9.tgz",
- "integrity": "sha512-lj2nsAKMMRLXSFnGgaaQrWJ2fdSpLPc/bca6Rkiw4g8zYPn7qX4MRUJgavvzm/hBrzvMnlhXVgJtidOGuwBh+w==",
- "license": "MIT",
- "dependencies": {
- "@expo/require-utils": "^57.0.4",
- "@expo/spawn-async": "^1.8.0",
- "chalk": "^4.1.0",
- "commander": "^7.2.0"
- },
- "bin": {
- "expo-modules-autolinking": "bin/expo-modules-autolinking.js"
- }
- },
- "node_modules/expo-modules-core": {
- "version": "57.0.10",
- "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-57.0.10.tgz",
- "integrity": "sha512-aRi3G8OctoyZl8x9CLTVpbPljClfKm2eqKRgBzhcGsrH3gS1t5Y2ye7+PIZK4XK2VVP5iGqygN2b1vtqRo3xVQ==",
- "license": "MIT",
- "dependencies": {
- "@expo/expo-modules-macros-plugin": "0.6.1",
- "expo-modules-jsi": "~57.0.4",
- "invariant": "^2.2.4"
- },
- "peerDependencies": {
- "react": "*",
- "react-native": "*",
- "react-native-worklets": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0"
- },
- "peerDependenciesMeta": {
- "react-native-worklets": {
- "optional": true
- }
- }
- },
- "node_modules/expo-modules-jsi": {
- "version": "57.0.4",
- "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-57.0.4.tgz",
- "integrity": "sha512-vt7FyqUqqFXiRVnBqYD7y+GSPTgeua5Ocoy0+SYt+RSHkZEA2Fyop7If3g1TYDzQObYybPRo7TG2Rle1XLaWFw==",
- "license": "MIT",
- "peerDependencies": {
- "react-native": "*"
- }
- },
- "node_modules/expo-router": {
- "version": "57.0.11",
- "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-57.0.11.tgz",
- "integrity": "sha512-kE2hz4lLkddZ94vN4nmbq5aXeo0t6FaZ8xJn/Hyn8/dQPsGlvDK0j4ZVayEUUdNmkNHsBVihgf1bl/2rCsYEzA==",
- "license": "MIT",
- "dependencies": {
- "@expo/log-box": "^57.0.2",
- "@expo/metro-runtime": "^57.0.8",
- "@expo/schema-utils": "^57.0.2",
- "@expo/ui": "^57.0.9",
- "@radix-ui/react-slot": "^1.2.0",
- "@radix-ui/react-tabs": "^1.1.12",
- "@react-native-masked-view/masked-view": "^0.3.2",
- "@testing-library/jest-dom": "^6.9.1",
- "@testing-library/user-event": "^14.6.1",
- "client-only": "^0.0.1",
- "color": "^4.2.3",
- "debug": "^4.3.4",
- "escape-string-regexp": "^4.0.0",
- "expo-glass-effect": "^57.0.1",
- "expo-server": "^57.0.1",
- "expo-symbols": "^57.0.2",
- "fast-deep-equal": "^3.1.3",
- "invariant": "^2.2.4",
- "nanoid": "^3.3.8",
- "query-string": "^7.1.3",
- "react-fast-compare": "^3.2.2",
- "react-is": "^19.1.0",
- "react-native-drawer-layout": "^4.2.2",
- "react-native-screens": "^4.26.0",
- "server-only": "^0.0.1",
- "sf-symbols-typescript": "^2.1.0",
- "shallowequal": "^1.1.0",
- "standard-navigation": "^0.0.5",
- "vaul": "^1.1.2"
- },
- "peerDependencies": {
- "@expo/log-box": "^57.0.2",
- "@expo/metro-runtime": "^57.0.8",
- "@testing-library/react-native": ">= 13.2.0",
- "expo": "*",
- "expo-constants": "^57.0.9",
- "expo-linking": "^57.0.5",
- "react": "*",
- "react-dom": "*",
- "react-native": "*",
- "react-native-gesture-handler": "*",
- "react-native-reanimated": "*",
- "react-native-safe-area-context": ">= 5.4.0",
- "react-native-screens": "^4.26.0",
- "react-native-web": "*",
- "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4"
- },
- "peerDependenciesMeta": {
- "@testing-library/react-native": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- },
- "react-native-gesture-handler": {
- "optional": true
- },
- "react-native-reanimated": {
- "optional": true
- },
- "react-native-web": {
- "optional": true
- },
- "react-server-dom-webpack": {
- "optional": true
- }
- }
- },
- "node_modules/expo-router/node_modules/@expo/metro-runtime": {
- "version": "57.0.8",
- "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-57.0.8.tgz",
- "integrity": "sha512-RrdehKXNtWpnm8nNs1QFhS0IauyMKR/nSQiry6dcUJs2T5EH8gYDMcMegUt9yI41K4nO3W8tr3O0xd/GZFObXQ==",
- "license": "MIT",
- "dependencies": {
- "@expo/log-box": "^57.0.2",
- "anser": "^1.4.9",
- "pretty-format": "^29.7.0",
- "stacktrace-parser": "^0.1.10",
- "whatwg-fetch": "^3.0.0"
- },
- "peerDependencies": {
- "@expo/log-box": "^57.0.2",
- "expo": "*",
- "react": "*",
- "react-dom": "*",
- "react-native": "*"
- },
- "peerDependenciesMeta": {
- "react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/expo-router/node_modules/@expo/ui": {
- "version": "57.0.9",
- "resolved": "https://registry.npmjs.org/@expo/ui/-/ui-57.0.9.tgz",
- "integrity": "sha512-VIxvk5ncgylBj2vrIP1iLaMc3XmYucKbf0hIcg3qx9l2anB9JzaYnH7cvVgNU3RfwV8R9m/tA7lX9BP7D8uMQw==",
- "license": "MIT",
- "dependencies": {
- "sf-symbols-typescript": "^2.1.0",
- "vaul": "^1.1.2"
- },
- "peerDependencies": {
- "@babel/core": "*",
- "expo": "*",
- "react": "*",
- "react-dom": "*",
- "react-native": "*",
- "react-native-worklets": "*"
- },
- "peerDependenciesMeta": {
- "@babel/core": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- },
- "react-native-worklets": {
- "optional": true
- }
- }
- },
- "node_modules/expo-router/node_modules/@radix-ui/react-tabs": {
- "version": "1.1.21",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.21.tgz",
- "integrity": "sha512-UKxJlZid7FVtsk/WTxj4i4uSEgj2Au+KBbS7SQyTlzMhhn+86Cz3tISZdTa87bfEfcuvZezf2ZsxD4xuEKtkog==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.7",
- "@radix-ui/react-context": "1.2.2",
- "@radix-ui/react-direction": "1.1.4",
- "@radix-ui/react-id": "1.1.4",
- "@radix-ui/react-presence": "1.1.10",
- "@radix-ui/react-primitive": "2.1.10",
- "@radix-ui/react-roving-focus": "1.1.19",
- "@radix-ui/react-use-controllable-state": "1.2.6"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/expo-router/node_modules/react-is": {
- "version": "19.2.8",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz",
- "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==",
- "license": "MIT"
- },
- "node_modules/expo-secure-store": {
- "version": "57.0.1",
- "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-57.0.1.tgz",
- "integrity": "sha512-tLa1VmSadOq19mA/dwkl99RbHyjLE0T1qqBYMY3/OsguZTI+rlrDy/DDJjupqlVtmr95hD7o1pYqx5aL+B4YMA==",
- "license": "MIT",
- "peerDependencies": {
- "expo": "*"
- }
- },
- "node_modules/expo-server": {
- "version": "57.0.1",
- "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-57.0.1.tgz",
- "integrity": "sha512-sBfVDH6dmKVHZxqUxbfkzS00PZELMZt1IpnHKxcOTMZtR/t7CtRAFrbXcisG+EyzeqHSVDacZT+1tbYfZt5D8w==",
- "license": "MIT",
- "engines": {
- "node": ">=20.16.0"
- }
- },
- "node_modules/expo-splash-screen": {
- "version": "57.0.5",
- "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-57.0.5.tgz",
- "integrity": "sha512-ZN0LDXlhHRNFjXTYZDojXk8IfaoUIu7qa3hhoBTXgyj1UB/iewGlH6+M3Nvhun2lY2d/+xhwqMhv0hIRoBo09Q==",
- "license": "MIT",
- "dependencies": {
- "@expo/config-plugins": "~57.0.6",
- "@expo/image-utils": "^0.11.4",
- "xml2js": "0.6.0"
- },
- "peerDependencies": {
- "expo": "*"
- }
- },
- "node_modules/expo-status-bar": {
- "version": "57.0.1",
- "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-57.0.1.tgz",
- "integrity": "sha512-Xwaq1gAoVRWx5dPG5VhT5RSbnI9OilhZnO5qoPBnUaBAa5VzRzfdS8q0/bsPt0jR2DKLtGuP0bQ6efMJ4RIMDg==",
- "license": "MIT",
- "peerDependencies": {
- "expo": "*",
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/expo-symbols": {
- "version": "57.0.2",
- "resolved": "https://registry.npmjs.org/expo-symbols/-/expo-symbols-57.0.2.tgz",
- "integrity": "sha512-qZ0iqOflm5lZGwRsQ5Y8sDksw3GAUKwHSX1bJBoocXf7gu14vafIXXYWte+JT9VfXAUGyKodJhLHP/GoOrcNWg==",
- "license": "MIT",
- "dependencies": {
- "@expo-google-fonts/material-symbols": "^0.4.1",
- "sf-symbols-typescript": "^2.0.0"
- },
- "peerDependencies": {
- "expo": "*",
- "expo-font": "*",
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/expo/node_modules/@expo/cli": {
- "version": "57.0.13",
- "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-57.0.13.tgz",
- "integrity": "sha512-8gjLMyx+s0dLeDHlcfjM9D9x5yrCU5C6516rmC7q/Wiyuj1fxgr/cbDSmjdpQKkjlvvfvNwtRyMk2zhvhPohiw==",
- "license": "MIT",
- "dependencies": {
- "@expo/code-signing-certificates": "^0.0.6",
- "@expo/config": "~57.0.6",
- "@expo/config-plugins": "~57.0.7",
- "@expo/devcert": "^1.2.1",
- "@expo/env": "~2.4.2",
- "@expo/image-utils": "^0.11.4",
- "@expo/inline-modules": "^0.1.4",
- "@expo/json-file": "^11.0.1",
- "@expo/log-box": "^57.0.2",
- "@expo/metro": "~56.0.0",
- "@expo/metro-config": "~57.0.7",
- "@expo/metro-file-map": "^57.0.1",
- "@expo/osascript": "^2.7.1",
- "@expo/package-manager": "^1.13.1",
- "@expo/plist": "^0.8.1",
- "@expo/prebuild-config": "^57.0.10",
- "@expo/require-utils": "^57.0.4",
- "@expo/router-server": "^57.0.5",
- "@expo/schema-utils": "^57.0.2",
- "@expo/spawn-async": "^1.8.0",
- "@expo/ws-tunnel": "^2.0.0",
- "@expo/xcpretty": "^4.4.4",
- "@react-native/dev-middleware": "0.86.2",
- "accepts": "^1.3.8",
- "agent-cli-detector": "^0.1.2",
- "arg": "^5.0.2",
- "bplist-creator": "0.1.0",
- "bplist-parser": "^0.3.1",
- "chalk": "^4.0.0",
- "ci-info": "^3.3.0",
- "compression": "^1.7.4",
- "connect": "^3.7.0",
- "debug": "^4.3.4",
- "dnssd-advertise": "^1.1.4",
- "expo-server": "^57.0.1",
- "fetch-nodeshim": "^0.4.10",
- "getenv": "^2.0.0",
- "glob": "^13.0.0",
- "lan-network": "^0.2.1",
- "multitars": "^1.0.0",
- "node-forge": "^1.3.3",
- "npm-package-arg": "^11.0.0",
- "ora": "^3.4.0",
- "picomatch": "^4.0.4",
- "pretty-format": "^29.7.0",
- "progress": "^2.0.3",
- "prompts": "^2.3.2",
- "resolve-from": "^5.0.0",
- "semver": "^7.6.0",
- "send": "^0.19.0",
- "slugify": "^1.3.4",
- "stacktrace-parser": "^0.1.10",
- "structured-headers": "^0.4.1",
- "terminal-link": "^2.1.1",
- "toqr": "^0.1.1",
- "wrap-ansi": "^7.0.0",
- "ws": "^8.12.1",
- "zod": "^3.25.76"
- },
- "bin": {
- "expo-internal": "main.js"
- },
- "peerDependencies": {
- "expo": "*",
- "expo-router": "*",
- "react-native": "*"
- },
- "peerDependenciesMeta": {
- "expo-router": {
- "optional": true
- },
- "react-native": {
- "optional": true
- }
- }
- },
- "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": {
- "version": "57.0.5",
- "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-57.0.5.tgz",
- "integrity": "sha512-vke39l0bo3H2q9JB/KXpAJ7HpscdTG3Mktbxanc8yn3riWzzSsnv0uxwZGZCrZrnDQzFxlLTXgbZrGkU26ng1w==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.3.4"
- },
- "peerDependencies": {
- "@expo/metro-runtime": "^57.0.8",
- "expo": "*",
- "expo-constants": "^57.0.9",
- "expo-font": "^57.0.1",
- "expo-router": "*",
- "expo-server": "^57.0.1",
- "react": "*",
- "react-dom": "*",
- "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1"
- },
- "peerDependenciesMeta": {
- "@expo/metro-runtime": {
- "optional": true
- },
- "expo-router": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- },
- "react-server-dom-webpack": {
- "optional": true
- }
- }
- },
- "node_modules/expo/node_modules/@expo/metro-config": {
- "version": "57.0.7",
- "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-57.0.7.tgz",
- "integrity": "sha512-bVfEkg4zF1cA62OqAdYXmFOooJ6TB/I+REi7Se6Ct+PbSC+89TwSqWXnYx34L08eIs4z+1ilgbATakTZpgefmQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.20.0",
- "@babel/core": "^7.20.0",
- "@babel/generator": "^7.20.5",
- "@expo/config": "~57.0.6",
- "@expo/env": "~2.4.2",
- "@expo/json-file": "~11.0.1",
- "@expo/metro": "~56.0.0",
- "@expo/require-utils": "^57.0.4",
- "@expo/spawn-async": "^1.8.0",
- "@jridgewell/gen-mapping": "^0.3.13",
- "@jridgewell/remapping": "^2.3.5",
- "@jridgewell/sourcemap-codec": "^1.5.5",
- "browserslist": "^4.25.0",
- "chalk": "^4.1.0",
- "debug": "^4.3.2",
- "getenv": "^2.0.0",
- "glob": "^13.0.0",
- "hermes-parser": "^0.36.0",
- "jsc-safe-url": "^0.2.4",
- "lightningcss": "^1.30.1",
- "picomatch": "^4.0.4",
- "postcss": "^8.5.14",
- "resolve-from": "^5.0.0"
- },
- "peerDependencies": {
- "expo": "*"
- },
- "peerDependenciesMeta": {
- "expo": {
- "optional": true
- }
- }
- },
- "node_modules/expo/node_modules/@expo/ws-tunnel": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-2.0.0.tgz",
- "integrity": "sha512-j+JfTRdCk820J9dU0sA2SqshQIKFOMo7ED84w9MJFcebfbNQgsLztEY/SABDkGnjatrW4xGqnUhVRxSBVyCkXw==",
- "license": "MIT",
- "peerDependencies": {
- "ws": "^8.0.0"
- }
- },
- "node_modules/expo/node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "license": "MIT",
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/expo/node_modules/babel-preset-expo": {
- "version": "57.0.6",
- "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-57.0.6.tgz",
- "integrity": "sha512-ASyy0iP7yPQtq2QaMEnZG4O7YQ/x4sTMguk7PZcow2OHFnWsBpX6v+UCmh/uwCzGfD1q93jDQEuACWwWx4kSrw==",
- "license": "MIT",
- "dependencies": {
- "@babel/generator": "^7.20.5",
- "@babel/helper-module-imports": "^7.25.9",
- "@babel/plugin-proposal-decorators": "^7.12.9",
- "@babel/plugin-proposal-export-default-from": "^7.24.7",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/plugin-syntax-export-default-from": "^7.24.7",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-transform-async-generator-functions": "^7.25.4",
- "@babel/plugin-transform-async-to-generator": "^7.24.7",
- "@babel/plugin-transform-block-scoping": "^7.25.0",
- "@babel/plugin-transform-class-properties": "^7.25.4",
- "@babel/plugin-transform-class-static-block": "^7.27.1",
- "@babel/plugin-transform-classes": "^7.25.4",
- "@babel/plugin-transform-destructuring": "^7.24.8",
- "@babel/plugin-transform-export-namespace-from": "^7.25.9",
- "@babel/plugin-transform-flow-strip-types": "^7.25.2",
- "@babel/plugin-transform-for-of": "^7.24.7",
- "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
- "@babel/plugin-transform-modules-commonjs": "^7.24.8",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
- "@babel/plugin-transform-object-rest-spread": "^7.24.7",
- "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
- "@babel/plugin-transform-optional-chaining": "^7.24.8",
- "@babel/plugin-transform-parameters": "^7.24.7",
- "@babel/plugin-transform-private-methods": "^7.24.7",
- "@babel/plugin-transform-private-property-in-object": "^7.24.7",
- "@babel/plugin-transform-react-display-name": "^7.24.7",
- "@babel/plugin-transform-react-jsx": "^7.28.6",
- "@babel/plugin-transform-react-jsx-development": "^7.27.1",
- "@babel/plugin-transform-react-pure-annotations": "^7.27.1",
- "@babel/plugin-transform-runtime": "^7.24.7",
- "@babel/plugin-transform-typescript": "^7.25.2",
- "@babel/plugin-transform-unicode-regex": "^7.24.7",
- "@babel/preset-typescript": "^7.23.0",
- "@react-native/babel-plugin-codegen": "0.86.2",
- "babel-plugin-react-compiler": "^1.0.0",
- "babel-plugin-react-native-web": "~0.21.0",
- "babel-plugin-syntax-hermes-parser": "^0.36.0",
- "babel-plugin-transform-flow-enums": "^0.0.2",
- "debug": "^4.3.4"
- },
- "peerDependencies": {
- "@babel/runtime": "^7.20.0",
- "expo": "*",
- "expo-widgets": "^57.0.8",
- "react-refresh": ">=0.14.0 <1.0.0"
- },
- "peerDependenciesMeta": {
- "@babel/runtime": {
- "optional": true
- },
- "expo": {
- "optional": true
- },
- "expo-widgets": {
- "optional": true
- }
- }
- },
- "node_modules/expo/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/expo/node_modules/expo-asset": {
- "version": "57.0.9",
- "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-57.0.9.tgz",
- "integrity": "sha512-FXlwwW5ThJ2kwXqVX0VcYcDrbmzPDUGPYJOuQZYfsdVB+TLA8LmOgU0Y5ykzLmLs5ONiqs/YjT6Uubv1NUQFzg==",
- "license": "MIT",
- "dependencies": {
- "@expo/image-utils": "^0.11.4",
- "expo-constants": "~57.0.9"
- },
- "peerDependencies": {
- "expo": "*",
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/expo/node_modules/expo-file-system": {
- "version": "57.0.2",
- "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-57.0.2.tgz",
- "integrity": "sha512-bPgzpaOJ3NWHZxV++Osj/1QoFzFe/QOo1jBF4EODJdiZgrrxyi2dv+7PLhKuut5QqPBuihUOITRh3s5jhRtA5A==",
- "license": "MIT",
- "peerDependencies": {
- "expo": "*",
- "react-native": "*"
- }
- },
- "node_modules/expo/node_modules/expo-keep-awake": {
- "version": "57.0.1",
- "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-57.0.1.tgz",
- "integrity": "sha512-28lkFImeXTS+bhAjuCFV7w7tW5bXg27BJVrxv+nC/nyYa86qEa0oFeHwqol6ha5k4pdVDQgBF09GM4A1k76Ssg==",
- "license": "MIT",
- "peerDependencies": {
- "expo": "*",
- "react": "*"
- }
- },
- "node_modules/expo/node_modules/hermes-estree": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.1.tgz",
- "integrity": "sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==",
- "license": "MIT"
- },
- "node_modules/expo/node_modules/hermes-parser": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.1.tgz",
- "integrity": "sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==",
- "license": "MIT",
- "dependencies": {
- "hermes-estree": "0.36.1"
- }
- },
- "node_modules/expo/node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/expo/node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "license": "MIT",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/expo/node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/expo/node_modules/picomatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
- "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/expo/node_modules/ws": {
- "version": "8.21.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.2.tgz",
- "integrity": "sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==",
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/exponential-backoff": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
- "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==",
- "license": "Apache-2.0"
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "license": "MIT"
- },
- "node_modules/fb-dotslash": {
- "version": "0.5.8",
- "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz",
- "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==",
- "license": "(MIT OR Apache-2.0)",
- "bin": {
- "dotslash": "bin/dotslash"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/fb-watchman": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
- "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
- "license": "Apache-2.0",
- "dependencies": {
- "bser": "2.1.1"
- }
- },
- "node_modules/fetch-nodeshim": {
- "version": "0.4.10",
- "resolved": "https://registry.npmjs.org/fetch-nodeshim/-/fetch-nodeshim-0.4.10.tgz",
- "integrity": "sha512-m6I8ALe4L4XpdETy7MJZWs6L1IVMbjs99bwbpIKphxX+0CTns4IKDWJY0LWfr4YsFjfg+z1TjzTMU8lKl8rG0w==",
- "license": "MIT"
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/filter-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
- "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
- "license": "MIT",
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "statuses": "~1.5.0",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/flow-enums-runtime": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz",
- "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==",
- "license": "MIT"
- },
- "node_modules/fontfaceobserver": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz",
- "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==",
- "license": "BSD-2-Clause"
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "license": "ISC",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-nonce": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
- "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/getenv": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz",
- "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/glob": {
- "version": "13.0.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
- "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "minimatch": "^10.2.2",
- "minipass": "^7.1.3",
- "path-scurry": "^2.0.2"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "license": "ISC"
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
- "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/hermes-compiler": {
- "version": "250829098.0.16",
- "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.16.tgz",
- "integrity": "sha512-xsgzk+mUyvt9t1nUbF8USBlYxajTUtPJhVZ86q85s/SEoMKCF+52YZcudb0ENSnV3T3lV9mgB3s6R7+pH90zgw==",
- "license": "MIT"
- },
- "node_modules/hermes-estree": {
- "version": "0.35.0",
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz",
- "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==",
- "license": "MIT"
- },
- "node_modules/hermes-parser": {
- "version": "0.35.0",
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz",
- "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==",
- "license": "MIT",
- "dependencies": {
- "hermes-estree": "0.35.0"
- }
- },
- "node_modules/hoist-non-react-statics": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "react-is": "^16.7.0"
- }
- },
- "node_modules/hoist-non-react-statics/node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
- "license": "MIT"
- },
- "node_modules/hosted-git-info": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
- "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^10.0.1"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/hosted-git-info/node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "license": "ISC"
- },
- "node_modules/http-errors": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
- "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
- "license": "MIT",
- "dependencies": {
- "depd": "~2.0.0",
- "inherits": "~2.0.4",
- "setprototypeof": "~1.2.0",
- "statuses": "~2.0.2",
- "toidentifier": "~1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
- "node_modules/http-errors/node_modules/statuses": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
- "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/https-proxy-agent": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
- "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/image-size": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz",
- "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==",
- "license": "MIT",
- "dependencies": {
- "queue": "6.0.2"
- },
- "bin": {
- "image-size": "bin/image-size.js"
- },
- "engines": {
- "node": ">=16.x"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "license": "ISC"
- },
- "node_modules/invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz",
- "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==",
- "license": "MIT"
- },
- "node_modules/is-core-module": {
- "version": "2.16.2",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
- "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "license": "MIT",
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "license": "MIT",
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "license": "ISC"
- },
- "node_modules/jest-get-type": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
- "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
- "license": "MIT",
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
- "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-util/node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-validate": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
- "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
- "license": "MIT",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "camelcase": "^6.2.0",
- "chalk": "^4.0.0",
- "jest-get-type": "^29.6.3",
- "leven": "^3.1.0",
- "pretty-format": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-worker": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
- "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "jest-util": "^29.7.0",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/jimp-compact": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz",
- "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==",
- "license": "MIT"
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "license": "MIT"
- },
- "node_modules/js-yaml": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz",
- "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/puzrin"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/nodeca"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsc-safe-url": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz",
- "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==",
- "license": "0BSD"
- },
- "node_modules/jsesc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/lan-network": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.2.1.tgz",
- "integrity": "sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A==",
- "license": "MIT",
- "bin": {
- "lan-network": "dist/lan-network-cli.js"
- }
- },
- "node_modules/leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/lighthouse-logger": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz",
- "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==",
- "license": "Apache-2.0",
- "dependencies": {
- "debug": "^2.6.9",
- "marky": "^1.2.2"
- }
- },
- "node_modules/lighthouse-logger/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/lighthouse-logger/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/lightningcss": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
- "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
- "license": "MPL-2.0",
- "dependencies": {
- "detect-libc": "^2.0.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "lightningcss-android-arm64": "1.33.0",
- "lightningcss-darwin-arm64": "1.33.0",
- "lightningcss-darwin-x64": "1.33.0",
- "lightningcss-freebsd-x64": "1.33.0",
- "lightningcss-linux-arm-gnueabihf": "1.33.0",
- "lightningcss-linux-arm64-gnu": "1.33.0",
- "lightningcss-linux-arm64-musl": "1.33.0",
- "lightningcss-linux-x64-gnu": "1.33.0",
- "lightningcss-linux-x64-musl": "1.33.0",
- "lightningcss-win32-arm64-msvc": "1.33.0",
- "lightningcss-win32-x64-msvc": "1.33.0"
- }
- },
- "node_modules/lightningcss-android-arm64": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
- "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-arm64": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
- "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-x64": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
- "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-freebsd-x64": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
- "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
- "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
- "cpu": [
- "arm"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
- "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
- "cpu": [
- "arm64"
- ],
- "libc": [
- "glibc"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
- "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
- "cpu": [
- "arm64"
- ],
- "libc": [
- "musl"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
- "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
- "cpu": [
- "x64"
- ],
- "libc": [
- "glibc"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-musl": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
- "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
- "cpu": [
- "x64"
- ],
- "libc": [
- "musl"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
- "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
- "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
- "license": "MIT"
- },
- "node_modules/lodash.throttle": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
- "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
- "license": "MIT"
- },
- "node_modules/log-symbols": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
- "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^2.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/log-symbols/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/log-symbols/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/log-symbols/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "license": "MIT",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/log-symbols/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "license": "MIT"
- },
- "node_modules/log-symbols/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/log-symbols/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/log-symbols/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "license": "MIT",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "license": "ISC",
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/makeerror": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
- "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "tmpl": "1.0.5"
- }
- },
- "node_modules/marky": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz",
- "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==",
- "license": "Apache-2.0"
- },
- "node_modules/memoize-one": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
- "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
- "license": "MIT"
- },
- "node_modules/merge-options": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz",
- "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==",
- "license": "MIT",
- "dependencies": {
- "is-plain-obj": "^2.1.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "license": "MIT"
- },
- "node_modules/metro": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro/-/metro-0.84.4.tgz",
- "integrity": "sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.29.0",
- "@babel/core": "^7.25.2",
- "@babel/generator": "^7.29.1",
- "@babel/parser": "^7.29.0",
- "@babel/template": "^7.28.6",
- "@babel/traverse": "^7.29.0",
- "@babel/types": "^7.29.0",
- "accepts": "^2.0.0",
- "ci-info": "^2.0.0",
- "connect": "^3.6.5",
- "debug": "^4.4.0",
- "error-stack-parser": "^2.0.6",
- "flow-enums-runtime": "^0.0.6",
- "graceful-fs": "^4.2.4",
- "hermes-parser": "0.35.0",
- "image-size": "^1.0.2",
- "invariant": "^2.2.4",
- "jest-worker": "^29.7.0",
- "jsc-safe-url": "^0.2.2",
- "lodash.throttle": "^4.1.1",
- "metro-babel-transformer": "0.84.4",
- "metro-cache": "0.84.4",
- "metro-cache-key": "0.84.4",
- "metro-config": "0.84.4",
- "metro-core": "0.84.4",
- "metro-file-map": "0.84.4",
- "metro-resolver": "0.84.4",
- "metro-runtime": "0.84.4",
- "metro-source-map": "0.84.4",
- "metro-symbolicate": "0.84.4",
- "metro-transform-plugins": "0.84.4",
- "metro-transform-worker": "0.84.4",
- "mime-types": "^3.0.1",
- "nullthrows": "^1.1.1",
- "serialize-error": "^2.1.0",
- "source-map": "^0.5.6",
- "throat": "^5.0.0",
- "ws": "^7.5.10",
- "yargs": "^17.6.2"
- },
- "bin": {
- "metro": "src/cli.js"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-babel-transformer": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.84.4.tgz",
- "integrity": "sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "flow-enums-runtime": "^0.0.6",
- "hermes-parser": "0.35.0",
- "metro-cache-key": "0.84.4",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-cache": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.84.4.tgz",
- "integrity": "sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==",
- "license": "MIT",
- "dependencies": {
- "exponential-backoff": "^3.1.1",
- "flow-enums-runtime": "^0.0.6",
- "https-proxy-agent": "^7.0.5",
- "metro-core": "0.84.4"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-cache-key": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.84.4.tgz",
- "integrity": "sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-config": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.84.4.tgz",
- "integrity": "sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==",
- "license": "MIT",
- "dependencies": {
- "connect": "^3.6.5",
- "flow-enums-runtime": "^0.0.6",
- "jest-validate": "^29.7.0",
- "metro": "0.84.4",
- "metro-cache": "0.84.4",
- "metro-core": "0.84.4",
- "metro-runtime": "0.84.4",
- "yaml": "^2.6.1"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-core": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.84.4.tgz",
- "integrity": "sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6",
- "lodash.throttle": "^4.1.1",
- "metro-resolver": "0.84.4"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-file-map": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.84.4.tgz",
- "integrity": "sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.4.0",
- "fb-watchman": "^2.0.0",
- "flow-enums-runtime": "^0.0.6",
- "graceful-fs": "^4.2.4",
- "invariant": "^2.2.4",
- "jest-worker": "^29.7.0",
- "micromatch": "^4.0.4",
- "nullthrows": "^1.1.1",
- "walker": "^1.0.7"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-minify-terser": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.84.4.tgz",
- "integrity": "sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6",
- "terser": "^5.15.0"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-resolver": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.84.4.tgz",
- "integrity": "sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-runtime": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.84.4.tgz",
- "integrity": "sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.25.0",
- "flow-enums-runtime": "^0.0.6"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-source-map": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.84.4.tgz",
- "integrity": "sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==",
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.29.0",
- "@babel/types": "^7.29.0",
- "flow-enums-runtime": "^0.0.6",
- "invariant": "^2.2.4",
- "metro-symbolicate": "0.84.4",
- "nullthrows": "^1.1.1",
- "ob1": "0.84.4",
- "source-map": "^0.5.6",
- "vlq": "^1.0.0"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-symbolicate": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.84.4.tgz",
- "integrity": "sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6",
- "invariant": "^2.2.4",
- "metro-source-map": "0.84.4",
- "nullthrows": "^1.1.1",
- "source-map": "^0.5.6",
- "vlq": "^1.0.0"
- },
- "bin": {
- "metro-symbolicate": "src/index.js"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-transform-plugins": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.84.4.tgz",
- "integrity": "sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "@babel/generator": "^7.29.1",
- "@babel/template": "^7.28.6",
- "@babel/traverse": "^7.29.0",
- "flow-enums-runtime": "^0.0.6",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/metro-transform-worker": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.84.4.tgz",
- "integrity": "sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "@babel/generator": "^7.29.1",
- "@babel/parser": "^7.29.0",
- "@babel/types": "^7.29.0",
- "flow-enums-runtime": "^0.0.6",
- "metro": "0.84.4",
- "metro-babel-transformer": "0.84.4",
- "metro-cache": "0.84.4",
- "metro-cache-key": "0.84.4",
- "metro-minify-terser": "0.84.4",
- "metro-source-map": "0.84.4",
- "metro-transform-plugins": "0.84.4",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "license": "MIT",
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "license": "MIT",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.54.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
- "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
- "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
- "license": "MIT",
- "dependencies": {
- "mime-db": "^1.54.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
- "node_modules/mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/minimatch": {
- "version": "10.2.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
- "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.8"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/minipass": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
- "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "license": "MIT",
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/multitars": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/multitars/-/multitars-1.0.1.tgz",
- "integrity": "sha512-Do9rHaSDfQ2Fk5Dpg2RjQ4M48Ol7rSq1gvKn/dXJYnhKEm8RRjjUvyiGDDEhJqb0hJPGjRaTB1kx6beqKO/i6Q==",
- "license": "MIT"
- },
- "node_modules/nanoid": {
- "version": "3.3.17",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz",
- "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/negotiator": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
- "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/node-forge": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz",
- "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==",
- "license": "(BSD-3-Clause OR GPL-2.0)",
- "engines": {
- "node": ">= 6.13.0"
- }
- },
- "node_modules/node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
- "license": "MIT"
- },
- "node_modules/node-releases": {
- "version": "2.0.53",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz",
- "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/npm-package-arg": {
- "version": "11.0.3",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz",
- "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==",
- "license": "ISC",
- "dependencies": {
- "hosted-git-info": "^7.0.0",
- "proc-log": "^4.0.0",
- "semver": "^7.3.5",
- "validate-npm-package-name": "^5.0.0"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/nullthrows": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
- "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==",
- "license": "MIT"
- },
- "node_modules/ob1": {
- "version": "0.84.4",
- "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.84.4.tgz",
- "integrity": "sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- }
- },
- "node_modules/on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
- "license": "MIT",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/on-headers": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
- "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==",
- "license": "MIT",
- "dependencies": {
- "mimic-fn": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/open": {
- "version": "7.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
- "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
- "license": "MIT",
- "dependencies": {
- "is-docker": "^2.0.0",
- "is-wsl": "^2.1.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ora": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz",
- "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==",
- "license": "MIT",
- "dependencies": {
- "chalk": "^2.4.2",
- "cli-cursor": "^2.1.0",
- "cli-spinners": "^2.0.0",
- "log-symbols": "^2.2.0",
- "strip-ansi": "^5.2.0",
- "wcwidth": "^1.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ora/node_modules/ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ora/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ora/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ora/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "license": "MIT",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/ora/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "license": "MIT"
- },
- "node_modules/ora/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/ora/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ora/node_modules/strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^4.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ora/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/parse-png": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz",
- "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==",
- "license": "MIT",
- "dependencies": {
- "pngjs": "^3.3.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "license": "MIT"
- },
- "node_modules/path-scurry": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
- "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "lru-cache": "^11.0.0",
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/path-scurry/node_modules/lru-cache": {
- "version": "11.5.2",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
- "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
- "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/plist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz",
- "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==",
- "license": "MIT",
- "dependencies": {
- "@xmldom/xmldom": "^0.9.10",
- "base64-js": "^1.5.1",
- "xmlbuilder": "^15.1.1"
- },
- "engines": {
- "node": ">=10.4.0"
- }
- },
- "node_modules/plist/node_modules/@xmldom/xmldom": {
- "version": "0.9.10",
- "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz",
- "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==",
- "license": "MIT",
- "engines": {
- "node": ">=14.6"
- }
- },
- "node_modules/pngjs": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
- "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
- "license": "MIT",
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.26",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
- "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.17",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/pretty-format": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
- "license": "MIT",
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "ansi-styles": "^5.0.0",
- "react-is": "^18.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/pretty-format/node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/proc-log": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz",
- "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==",
- "license": "ISC",
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/promise": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
- "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
- "license": "MIT",
- "dependencies": {
- "asap": "~2.0.6"
- }
- },
- "node_modules/prompts": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
- "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
- "license": "MIT",
- "dependencies": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.5"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/query-string": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
- "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
- "license": "MIT",
- "dependencies": {
- "decode-uri-component": "^0.2.2",
- "filter-obj": "^1.1.0",
- "split-on-first": "^1.0.0",
- "strict-uri-encode": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/queue": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
- "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
- "license": "MIT",
- "dependencies": {
- "inherits": "~2.0.3"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/react": {
- "version": "19.2.3",
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
- "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-devtools-core": {
- "version": "6.1.5",
- "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz",
- "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==",
- "license": "MIT",
- "dependencies": {
- "shell-quote": "^1.6.1",
- "ws": "^7"
- }
- },
- "node_modules/react-fast-compare": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
- "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==",
- "license": "MIT"
- },
- "node_modules/react-freeze": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.4.tgz",
- "integrity": "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "react": ">=17.0.0"
- }
- },
- "node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "license": "MIT"
- },
- "node_modules/react-native": {
- "version": "0.86.2",
- "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.86.2.tgz",
- "integrity": "sha512-zbJXGZpwfZGA79Z9ob6Atvfx4nAQL8yJBa35s58E4Oo+khPykfQP2sTeumkKbjwajFYfVayg8pj7Il9nIfTk7A==",
- "license": "MIT",
- "dependencies": {
- "@react-native/assets-registry": "0.86.2",
- "@react-native/codegen": "0.86.2",
- "@react-native/community-cli-plugin": "0.86.2",
- "@react-native/gradle-plugin": "0.86.2",
- "@react-native/js-polyfills": "0.86.2",
- "@react-native/normalize-colors": "0.86.2",
- "@react-native/virtualized-lists": "0.86.2",
- "abort-controller": "^3.0.0",
- "anser": "^1.4.9",
- "ansi-regex": "^5.0.0",
- "babel-plugin-syntax-hermes-parser": "0.36.0",
- "base64-js": "^1.5.1",
- "commander": "^12.0.0",
- "flow-enums-runtime": "^0.0.6",
- "hermes-compiler": "250829098.0.16",
- "invariant": "^2.2.4",
- "memoize-one": "^5.0.0",
- "metro-runtime": "^0.84.3",
- "metro-source-map": "^0.84.3",
- "nullthrows": "^1.1.1",
- "pretty-format": "^29.7.0",
- "promise": "^8.3.0",
- "react-devtools-core": "^6.1.5",
- "react-refresh": "^0.14.0",
- "regenerator-runtime": "^0.13.2",
- "scheduler": "0.27.0",
- "semver": "^7.1.3",
- "stacktrace-parser": "^0.1.10",
- "tinyglobby": "^0.2.15",
- "whatwg-fetch": "^3.0.0",
- "ws": "^7.5.10",
- "yargs": "^17.6.2"
- },
- "bin": {
- "react-native": "cli.js"
- },
- "engines": {
- "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
- },
- "peerDependencies": {
- "@react-native/jest-preset": "0.86.2",
- "@types/react": "^19.1.1",
- "react": "^19.2.3"
- },
- "peerDependenciesMeta": {
- "@react-native/jest-preset": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-native-drawer-layout": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/react-native-drawer-layout/-/react-native-drawer-layout-4.2.10.tgz",
- "integrity": "sha512-O6TQdZ5LSm3dqnuR4rX9KPtE+9dVg7jsezEYz1l01rkQTe4fQvYZIoPu2sZFl5X2N70uhRdjnPULySVR3sBUwA==",
- "license": "MIT",
- "dependencies": {
- "color": "^4.2.3",
- "use-latest-callback": "^0.2.4"
- },
- "peerDependencies": {
- "react": ">= 18.2.0",
- "react-native": "*",
- "react-native-gesture-handler": ">= 2.0.0",
- "react-native-reanimated": ">= 2.0.0"
- }
- },
- "node_modules/react-native-gesture-handler": {
- "version": "2.32.0",
- "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.32.0.tgz",
- "integrity": "sha512-uYIMOKlKENORq2SABE+jIjbPU+h5I/sQKcq2v16zRq848nwEp1fWRVwML4QWqijc8UcXJC25o54S8GQd4Mf2OA==",
- "license": "MIT",
- "dependencies": {
- "@egjs/hammerjs": "^2.0.17",
- "@types/react-test-renderer": "^19.1.0",
- "hoist-non-react-statics": "^3.3.0",
- "invariant": "^2.2.4"
- },
- "peerDependencies": {
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/react-native-is-edge-to-edge": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.3.1.tgz",
- "integrity": "sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==",
- "license": "MIT",
- "peerDependencies": {
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/react-native-reanimated": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.5.1.tgz",
- "integrity": "sha512-RnMvtDuR+68ig864gAvZCOdZehqhC5rFmMo0kn+ARfgVSTvFeF6IFLBVgMPUu0KwihaapEyW24WRi6nEyy1kSA==",
- "license": "MIT",
- "dependencies": {
- "react-native-is-edge-to-edge": "^1.3.1",
- "semver": "^7.7.3"
- },
- "peerDependencies": {
- "react": "*",
- "react-native": "0.83 - 0.86",
- "react-native-worklets": "0.10.x"
- }
- },
- "node_modules/react-native-safe-area-context": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.7.0.tgz",
- "integrity": "sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ==",
- "license": "MIT",
- "peerDependencies": {
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/react-native-screens": {
- "version": "4.26.2",
- "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.26.2.tgz",
- "integrity": "sha512-2XnWsZToKj76trGtEZzx5ELD/qOICFEprEeUntImmitQFVUkea27fiWdUSITArI356Y1qynpXZINW+Unbhky/A==",
- "license": "MIT",
- "dependencies": {
- "react-freeze": "^1.0.0",
- "warn-once": "^0.1.0"
- },
- "peerDependencies": {
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/react-native-worklets": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.10.1.tgz",
- "integrity": "sha512-62mRM19bDpfpdI8HLkEErcdOsrAPDtE9lA/sw+5lLRpzBHNhxaoj9QyY2KjXqUmirelxkX4zuPGTC3VdA0feJA==",
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-transform-arrow-functions": "^7.27.1",
- "@babel/plugin-transform-class-properties": "^7.28.6",
- "@babel/plugin-transform-classes": "^7.28.6",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6",
- "@babel/plugin-transform-optional-chaining": "^7.28.6",
- "@babel/plugin-transform-shorthand-properties": "^7.27.1",
- "@babel/plugin-transform-template-literals": "^7.27.1",
- "@babel/plugin-transform-unicode-regex": "^7.27.1",
- "@babel/preset-typescript": "^7.28.5",
- "@babel/types": "^7.27.1",
- "convert-source-map": "^2.0.0",
- "semver": "^7.7.4"
- },
- "peerDependencies": {
- "@babel/core": "*",
- "@react-native/metro-config": "*",
- "react": "*",
- "react-native": "0.83 - 0.86"
- }
- },
- "node_modules/react-native/node_modules/commander": {
- "version": "12.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
- "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/react-refresh": {
- "version": "0.14.2",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
- "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-remove-scroll": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
- "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
- "license": "MIT",
- "dependencies": {
- "react-remove-scroll-bar": "^2.3.7",
- "react-style-singleton": "^2.2.3",
- "tslib": "^2.1.0",
- "use-callback-ref": "^1.3.3",
- "use-sidecar": "^1.1.3"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-remove-scroll-bar": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
- "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
- "license": "MIT",
- "dependencies": {
- "react-style-singleton": "^2.2.2",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-style-singleton": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
- "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
- "license": "MIT",
- "dependencies": {
- "get-nonce": "^1.0.0",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "license": "MIT",
- "dependencies": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/regenerate": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
- "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
- "license": "MIT"
- },
- "node_modules/regenerate-unicode-properties": {
- "version": "10.2.2",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
- "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
- "license": "MIT",
- "dependencies": {
- "regenerate": "^1.4.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
- "license": "MIT"
- },
- "node_modules/regexpu-core": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
- "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==",
- "license": "MIT",
- "dependencies": {
- "regenerate": "^1.4.2",
- "regenerate-unicode-properties": "^10.2.2",
- "regjsgen": "^0.8.0",
- "regjsparser": "^0.13.0",
- "unicode-match-property-ecmascript": "^2.0.0",
- "unicode-match-property-value-ecmascript": "^2.2.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/regjsgen": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
- "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
- "license": "MIT"
- },
- "node_modules/regjsparser": {
- "version": "0.13.2",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz",
- "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "jsesc": "~3.1.0"
- },
- "bin": {
- "regjsparser": "bin/parser"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/resolve": {
- "version": "1.22.12",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
- "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "is-core-module": "^2.16.1",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-workspace-root": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz",
- "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==",
- "license": "MIT"
- },
- "node_modules/restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==",
- "license": "MIT",
- "dependencies": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/sax": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
- "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=11.0.0"
- }
- },
- "node_modules/scheduler": {
- "version": "0.27.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
- "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
- "license": "MIT"
- },
- "node_modules/semver": {
- "version": "7.8.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
- "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/send": {
- "version": "0.19.2",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
- "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
- "license": "MIT",
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "~0.5.2",
- "http-errors": "~2.0.1",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "~2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "~2.0.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/send/node_modules/debug/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/send/node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/send/node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "license": "MIT",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/send/node_modules/statuses": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
- "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/serialize-error": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
- "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/serve-static": {
- "version": "1.16.3",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
- "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
- "license": "MIT",
- "dependencies": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "~0.19.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/serve-static/node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/server-only": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz",
- "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==",
- "license": "MIT"
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "license": "ISC"
- },
- "node_modules/sf-symbols-typescript": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz",
- "integrity": "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/shallowequal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
- "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
- "license": "MIT"
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shell-quote": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz",
- "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "license": "ISC"
- },
- "node_modules/simple-plist": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz",
- "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==",
- "license": "MIT",
- "dependencies": {
- "bplist-creator": "0.1.0",
- "bplist-parser": "0.3.1",
- "plist": "^3.0.5"
- }
- },
- "node_modules/simple-swizzle": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz",
- "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==",
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.3.1"
- }
- },
- "node_modules/sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "license": "MIT"
- },
- "node_modules/slugify": {
- "version": "1.6.9",
- "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz",
- "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==",
- "license": "MIT",
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/source-map-support/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/split-on-first": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
- "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/stackframe": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
- "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
- "license": "MIT"
- },
- "node_modules/stacktrace-parser": {
- "version": "0.1.11",
- "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz",
- "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==",
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.7.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/standard-navigation": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/standard-navigation/-/standard-navigation-0.0.5.tgz",
- "integrity": "sha512-YAmzwAiiQVocZxO/VGPFiQHcu5pKiz09QIGC0MK6aRMoa3E0QkoTQgcqJr7ZZ3OMiNhu4DkaGElFI5htjOIDbw==",
- "license": "MIT"
- },
- "node_modules/statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/stream-buffers": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz",
- "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==",
- "license": "Unlicense",
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/strict-uri-encode": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
- "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "license": "MIT",
- "dependencies": {
- "min-indent": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/structured-headers": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz",
- "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==",
- "license": "MIT"
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-hyperlinks": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
- "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0",
- "supports-color": "^7.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/terminal-link": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
- "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-escapes": "^4.2.1",
- "supports-hyperlinks": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/terser": {
- "version": "5.49.2",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.2.tgz",
- "integrity": "sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.15.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "license": "MIT"
- },
- "node_modules/throat": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
- "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
- "license": "MIT"
- },
- "node_modules/tinyglobby": {
- "version": "0.2.17",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
- "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
- "license": "MIT",
- "dependencies": {
- "fdir": "^6.5.0",
- "picomatch": "^4.0.4"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/SuperchupuDev"
- }
- },
- "node_modules/tinyglobby/node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/tinyglobby/node_modules/picomatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
- "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/tmpl": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
- "license": "BSD-3-Clause"
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/toqr": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/toqr/-/toqr-0.1.1.tgz",
- "integrity": "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==",
- "license": "MIT"
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
- },
- "node_modules/type-fest": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
- "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/typescript": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
- "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/undici-types": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
- "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
- "license": "MIT"
- },
- "node_modules/unicode-canonical-property-names-ecmascript": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
- "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
- "license": "MIT",
- "dependencies": {
- "unicode-canonical-property-names-ecmascript": "^2.0.0",
- "unicode-property-aliases-ecmascript": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-value-ecmascript": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
- "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-property-aliases-ecmascript": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz",
- "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
- "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/use-callback-ref": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
- "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-latest-callback": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.6.tgz",
- "integrity": "sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==",
- "license": "MIT",
- "peerDependencies": {
- "react": ">=16.8"
- }
- },
- "node_modules/use-sidecar": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
- "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
- "license": "MIT",
- "dependencies": {
- "detect-node-es": "^1.1.0",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
- "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
- "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
- "license": "MIT",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/validate-npm-package-name": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz",
- "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==",
- "license": "ISC",
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/vaul": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz",
- "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-dialog": "^1.1.1"
- },
- "peerDependencies": {
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc"
- }
- },
- "node_modules/vlq": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz",
- "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==",
- "license": "MIT"
- },
- "node_modules/walker": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
- "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "makeerror": "1.0.12"
- }
- },
- "node_modules/warn-once": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz",
- "integrity": "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==",
- "license": "MIT"
- },
- "node_modules/wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
- "license": "MIT",
- "dependencies": {
- "defaults": "^1.0.3"
- }
- },
- "node_modules/whatwg-fetch": {
- "version": "3.6.20",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
- "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
- "license": "MIT"
- },
- "node_modules/whatwg-url-minimum": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.2.tgz",
- "integrity": "sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==",
- "license": "MIT"
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/ws": {
- "version": "7.5.13",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz",
- "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==",
- "license": "MIT",
- "engines": {
- "node": ">=8.3.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/xcode": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz",
- "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==",
- "license": "Apache-2.0",
- "dependencies": {
- "simple-plist": "^1.1.0",
- "uuid": "^7.0.3"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/xml2js": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz",
- "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==",
- "license": "MIT",
- "dependencies": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~11.0.0"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/xml2js/node_modules/xmlbuilder": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
- "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
- "license": "MIT",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/xmlbuilder": {
- "version": "15.1.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
- "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
- "license": "MIT",
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "license": "ISC"
- },
- "node_modules/yaml": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
- "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
- "license": "ISC",
- "bin": {
- "yaml": "bin.mjs"
- },
- "engines": {
- "node": ">= 14.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/eemeli"
- }
- },
- "node_modules/yargs": {
- "version": "17.7.3",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz",
- "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==",
- "license": "MIT",
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/zod": {
- "version": "3.25.76",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- }
- }
-}
diff --git a/govarbitrage/apps/mobile/package.json b/govarbitrage/apps/mobile/package.json
deleted file mode 100644
index 006b26f..0000000
--- a/govarbitrage/apps/mobile/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "name": "mobile",
- "version": "1.0.3",
- "main": "index.ts",
- "dependencies": {
- "@expo/vector-icons": "^15.0.2",
- "@react-native-async-storage/async-storage": "2.2.0",
- "expo": "~57.0.11",
- "expo-apple-authentication": "~57.0.1",
- "expo-constants": "~57.0.9",
- "expo-linking": "~57.0.5",
- "expo-router": "~57.0.11",
- "expo-secure-store": "~57.0.1",
- "expo-splash-screen": "~57.0.5",
- "expo-status-bar": "~57.0.1",
- "react": "19.2.3",
- "react-native": "0.86.2",
- "react-native-gesture-handler": "~2.32.0",
- "react-native-reanimated": "4.5.1",
- "react-native-safe-area-context": "~5.7.0",
- "react-native-screens": "~4.26.0",
- "react-native-worklets": "0.10.1"
- },
- "devDependencies": {
- "@types/react": "~19.2.2",
- "typescript": "~6.0.3"
- },
- "scripts": {
- "start": "expo start",
- "android": "expo run:android",
- "ios": "expo run:ios",
- "web": "expo start --web",
- "lint:fin": "node scripts/lint-financial-format.mjs",
- "test:unit": "node --test --experimental-strip-types tests/*.test.mjs"
- },
- "private": true
-}
diff --git a/govarbitrage/apps/mobile/scripts/lint-financial-format.mjs b/govarbitrage/apps/mobile/scripts/lint-financial-format.mjs
deleted file mode 100644
index dd200e7..0000000
--- a/govarbitrage/apps/mobile/scripts/lint-financial-format.mjs
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/usr/bin/env node
-/**
- * lint-financial-format — regression guard-rail (TK-10279, yoloforever Cycle 4).
- *
- * Financial + score values (roi, netProfit, annualizedReturn, probabilityOfSale,
- * currentBid, *Score sub-scores, …) MUST reach the UI only through the guarded
- * helpers — fmtUSD / fmtPct / fmtScore (lib/format.ts) and pnlColor / scoreColor
- * (lib/pnl.ts, ScoreBadge) — which return "—" / neutral for null|non-finite and
- * clamp implausible ratios. A backend garbage value (e.g. annualizedReturn
- * 23002764 → "2,300,276,400.0%"), null, or NaN must never render as an absurd
- * number, literal "NaN", or a misleading green/red.
- *
- * This script fails (exit 1) if a UI file under app/** or components/** does an
- * AD-HOC render/color of such a value that bypasses those helpers. Zero-dep,
- * read-only.
- *
- * Escape hatch: append // lint-financial-format-ok: <reason> to a reviewed
- * exception line (e.g. a boolean success color, not a raw number).
- *
- * KNOWN LIMITATIONS (line-regex scanner, no AST — do not mistake a pass for proof):
- * - Aliasing / cross-line data flow is invisible: `const r = row.roi;` then
- * `<Text>{r}</Text>` on the next line is NOT caught (the alias isn't a field
- * name). Reviewers must still catch indirection.
- * - Only the Colors.profit/Colors.loss token pair is checked for sign-color;
- * a new color family or a styles.profitText indirection driven by a raw sign
- * is not caught.
- * - Field matching is name-based (suffix Score/Bid/Profit/Return/Price + an
- * explicit list); a financial field that fits none of those is not tracked.
- *
- * Run: npm run lint:fin (or: node scripts/lint-financial-format.mjs [rootDir])
- */
-import { readFileSync, readdirSync, statSync } from "node:fs";
-import { join, relative } from "node:path";
-
-const APP_ROOT = process.argv[2] || join(import.meta.dirname, "..");
-const SCAN_DIRS = ["app", "components"];
-const EXT = /\.(tsx|ts)$/;
-
-// Name-based field detection: common financial/score suffixes (catches
-// arbitrageScore, recommendedMaxBid, expectedNetProfit, expectedSalePrice, …)
-// plus explicit fields that fit no suffix.
-const FIELD_SRC =
- "\\b(?:\\w*(?:Score|Bid|Profit|Return|Price)|roi|annualizedReturn|probabilityOfSale|daysUntilSold|liquidationValue|sellTodayValue|marketplaceFees|totalInvestment|expectedReturns)\\b";
-const FIELD_RE = new RegExp(FIELD_SRC);
-const GUARD_CALL = /\b(?:fmtUSD|fmtPct|fmtScore|pnlColor|scoreColor)\s*\([^)]*\)/g;
-const FINITE = /Number\.isFinite\s*\(/;
-const OK_MARK = /lint-financial-format-ok/;
-
-// Strip guarded-helper call spans + Number.isFinite spans so we only inspect the
-// UNGUARDED remainder of a line for a raw field.
-function residual(line) {
- return line.replace(GUARD_CALL, " ").replace(/Number\.isFinite\s*\([^)]*\)/g, " ");
-}
-
-const RULES = [
- { id: "adhoc-round",
- test: (l) => new RegExp(`Math\\.round\\s*\\([^)]*${FIELD_SRC}`).test(l),
- msg: "Math.round() on a financial/score field — use fmtScore()/fmtPct()" },
- { id: "adhoc-format",
- test: (l) => (/(\.toFixed|\.toLocaleString)\s*\(/.test(l) && FIELD_RE.test(l))
- || (/Intl\.NumberFormat/.test(l) && FIELD_RE.test(l)),
- msg: ".toFixed()/.toLocaleString()/Intl.NumberFormat on a field — use fmtUSD()/fmtPct()" },
- { id: "adhoc-pct100",
- test: (l) => /\*\s*100\b/.test(l) && (FIELD_RE.test(l) || /%/.test(l)),
- msg: "ad-hoc *100 percent conversion — use fmtPct()" },
- { id: "raw-sign-color",
- test: (l) => /\?\s*Colors\.(profit|loss)\s*:\s*Colors\.(profit|loss)/.test(l)
- && (/(>=|<=|<|>)\s*0/.test(l) || FIELD_RE.test(l)),
- msg: "profit/loss color from a raw number — use pnlColor(value)" },
- // A raw field reaching output as a BARE expression — `{row.currentBid}` or
- // `${row.currentBid}` — with no guarded helper wrapping it and no
- // Number.isFinite guard on the line. Only flags a bare field access (no
- // call/operator inside the braces), so conditional guards like
- // `{row.roi != null && (…)}` are not flagged. Catches the "delete the wrapper"
- // regression, the whole reason this guard exists.
- { id: "raw-field-render",
- test: (l) => {
- if (FINITE.test(l)) return false;
- if (/^\s*import\b/.test(l)) return false;
- const r = residual(l);
- // {obj.field} or `${obj.field}` where the FIELD is the last member segment
- // (a real data access), the object is not a style/theme namespace, and the
- // braces hold only that access (no call/operator). Catches the
- // "delete the fmt wrapper" regression; ignores style refs + component names.
- return /\$?\{\s*(?!(?:styles|Colors|Typography|Spacing|Radius|StyleSheet)\b)[\w.]*?\.(?:\w*(?:Score|Bid|Profit|Return|Price)|roi|annualizedReturn|probabilityOfSale|daysUntilSold|liquidationValue|sellTodayValue|marketplaceFees|totalInvestment|expectedReturns)\b\s*\}/.test(r);
- },
- msg: "raw {field} reaching output — wrap in fmtUSD()/fmtPct()/fmtScore() (or guard with Number.isFinite() for a plain count)" },
-];
-
-function walk(dir, out = []) {
- for (const name of readdirSync(dir)) {
- if (name === "node_modules" || name.startsWith(".")) continue;
- const p = join(dir, name);
- const st = statSync(p);
- if (st.isDirectory()) walk(p, out);
- else if (EXT.test(name)) out.push(p);
- }
- return out;
-}
-
-const violations = [];
-for (const sub of SCAN_DIRS) {
- const base = join(APP_ROOT, sub);
- let files;
- try { files = walk(base); } catch { continue; }
- for (const file of files) {
- const lines = readFileSync(file, "utf8").split("\n");
- lines.forEach((line, i) => {
- if (OK_MARK.test(line)) return;
- for (const rule of RULES) {
- if (rule.test(line)) {
- violations.push({ file: relative(APP_ROOT, file), line: i + 1, rule: rule.id, msg: rule.msg, snippet: line.trim().slice(0, 120) });
- }
- }
- });
- }
-}
-
-if (violations.length === 0) {
- console.log("✓ lint-financial-format: no ad-hoc financial/score rendering found.");
- process.exit(0);
-}
-console.error(`✗ lint-financial-format: ${violations.length} violation(s) — route through the guarded helpers (or add // lint-financial-format-ok: <reason>):\n`);
-for (const v of violations) {
- console.error(` ${v.file}:${v.line} [${v.rule}] ${v.msg}`);
- console.error(` ${v.snippet}`);
-}
-process.exit(1);
diff --git a/govarbitrage/apps/mobile/store-assets/privacy-label.md b/govarbitrage/apps/mobile/store-assets/privacy-label.md
deleted file mode 100644
index 56242be..0000000
--- a/govarbitrage/apps/mobile/store-assets/privacy-label.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# App Privacy label — GovArbitrage (draft)
-
-App Store Connect → GovArbitrage → App Privacy. Answer these to match what the NATIVE binary
-actually does (cross-checked against the code — see notes). Draft only.
-
-## Does this app collect data? → NO
-The native app collects no data for us or any third party.
-
-### Data types collected
-| Data type | Collected? | Notes |
-|---|---|---|
-| Everything | No | The app links no analytics/ads SDK and creates no account. |
-
-- The only values the app persists are the **API base URL** and an optional **access
- credential**, both typed by the user in Settings and stored **encrypted on-device**
- (`expo-secure-store`). They are sent only to the user's configured server; we never receive
- them. Per Apple's definition this is not "collection" (not sent off-device to the developer
- or a third party) → declare **Data Not Collected**.
-
-## Tracking → NONE
-- **Not** used to track you. No ATT prompt required, and no `NSUserTrackingUsageDescription`
- is (or should be) added.
-- Cross-check / evidence: no analytics or ad SDK appears in `package.json` or the source; all
- network calls are plain `fetch()` to the user's configured `/api/*` endpoints
- (`lib/api.ts`). There is no WebView (so no third-party script surface either).
-
-## Data NOT collected (declare "Not Collected")
-- Location, Contacts, Health, Financial info, Browsing history, Search history,
- Identifiers (IDFA), Usage Data, Diagnostics, Photos, Audio, User Content.
-
-## Account deletion (Guideline 5.1.1(v)) — N/A
-- The app creates **no user account**. The Settings "credentials" field is an optional API
- auth value for the user's own server, stored on-device — there is no account to delete.
- Do not describe the app as having "accounts" in the listing/review notes.
-
-## No permissions requested
-- The app touches no camera, location, photos, contacts, microphone, notifications, or
- tracking APIs — so there are NO `NS*UsageDescription` strings to add (a common binary
- rejection). This is a genuinely low-permission app.
-
-## Reviewer note (for the App Review "Notes" field)
-"Native app over the auctions.agentabrams.com JSON API — not a web wrapper, no WebView. Opens
-with real data against the default server; no sign-in needed. The app does no ad/analytics
-tracking and has no in-app purchase. The Settings credential field is an optional API auth
-value for the user's own server, stored encrypted on-device."
diff --git a/govarbitrage/apps/mobile/tests/auth-headers.test.mjs b/govarbitrage/apps/mobile/tests/auth-headers.test.mjs
deleted file mode 100644
index aebb95b..0000000
--- a/govarbitrage/apps/mobile/tests/auth-headers.test.mjs
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Regression tests for lib/auth-headers.ts — the app's auth-header policy after
- * the Guideline 5.6 fix (TK-10279). Zero-dependency: Node's built-in test runner
- * with TS type-stripping (auth-headers.ts is a pure module, no native imports).
- *
- * Run: npm run test:unit
- *
- * What these lock in:
- * • a fresh install (no Apple sign-in, no self-hosting creds) sends NO
- * Authorization header — byte-identical to what a browser/curl sends, which
- * is the whole point of the 5.6 fix (behavior can't vary by client).
- * • the removed "token:" x-import-token secret path stays removed — a password
- * that happens to start with "token:" is just a normal Basic password now.
- */
-import { test } from "node:test";
-import assert from "node:assert/strict";
-import { authHeadersFor, buildBasicAuthHeader } from "../lib/auth-headers.ts";
-
-test("fresh install → NO Authorization header (anonymous, identical to a browser)", () => {
- assert.deepEqual(authHeadersFor({}), {});
- assert.deepEqual(authHeadersFor({ appleToken: null, username: "", password: "" }), {});
- // A username with no password still sends nothing — nothing to authenticate.
- assert.deepEqual(authHeadersFor({ username: "admin", password: "" }), {});
-});
-
-test("Apple sign-in → Bearer, and it wins over any self-hosting creds", () => {
- assert.deepEqual(authHeadersFor({ appleToken: "jwt123" }), {
- Authorization: "Bearer jwt123",
- });
- assert.deepEqual(
- authHeadersFor({ appleToken: "jwt123", username: "u", password: "p" }),
- { Authorization: "Bearer jwt123" }
- );
-});
-
-test("self-hosting username+password → Basic", () => {
- assert.deepEqual(authHeadersFor({ username: "u", password: "p" }), {
- Authorization: buildBasicAuthHeader("u", "p"),
- });
- assert.equal(buildBasicAuthHeader("u", "p"), `Basic ${btoa("u:p")}`);
-});
-
-test("the 'token:' secret machine-token path is gone", () => {
- // Pre-fix, a password prefixed 'token:' became an x-import-token backdoor
- // header. Now it is treated as an ordinary Basic password — no special path.
- const headers = authHeadersFor({ username: "u", password: "token:SECRET" });
- assert.ok(!("x-import-token" in headers), "no x-import-token header is ever produced");
- assert.deepEqual(headers, { Authorization: buildBasicAuthHeader("u", "token:SECRET") });
-});
diff --git a/govarbitrage/apps/mobile/tests/format.test.mjs b/govarbitrage/apps/mobile/tests/format.test.mjs
deleted file mode 100644
index 8d2259e..0000000
--- a/govarbitrage/apps/mobile/tests/format.test.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * Regression tests for lib/format.ts — the guarded financial/score formatters
- * hardened across TK-10279 Cycles 1-3. Zero-dependency: runs on Node's built-in
- * test runner with TS type-stripping, no jest/babel needed (format.ts is a pure
- * module with no imports).
- *
- * Run: npm run test:unit (node --test --experimental-strip-types tests/*.test.mjs)
- */
-import { test } from "node:test";
-import assert from "node:assert/strict";
-import {
- fmtUSD, fmtPct, fmtScore,
- closingCountdown, isClosingSoon, fmtDateTime,
- conditionLabel, sourceLabel, dropShipLabel,
-} from "../lib/format.ts";
-
-const inMs = (ms) => new Date(Date.now() + ms).toISOString();
-const HOUR = 3_600_000;
-
-test("fmtPct clamps implausible + guards null/non-finite (Cycle 1 fix)", () => {
- assert.equal(fmtPct(23002764), "—", "the 2.3-billion-% backend value renders as a dash");
- assert.equal(fmtPct(6.83), "683.0%", "legit aggressive return survives");
- assert.equal(fmtPct(0.42), "42.0%");
- assert.equal(fmtPct(-0.15), "-15.0%");
- assert.equal(fmtPct(null), "—");
- assert.equal(fmtPct(undefined), "—");
- assert.equal(fmtPct(NaN), "—");
- assert.equal(fmtPct(Infinity), "—");
- assert.equal(fmtPct(1000), "100000.0%", "ceiling is exclusive: exactly 1000 ratio still renders");
- assert.equal(fmtPct(1000.01), "—", "just OVER the ceiling (>1000 ratio) → dash");
- assert.equal(fmtPct(999), "99900.0%", "under the ceiling renders");
-});
-
-test("fmtPct decimals option (Cycle 2 probabilityOfSale fix)", () => {
- assert.equal(fmtPct(0.85, { decimals: 0 }), "85%");
- assert.equal(fmtPct(0.333, { decimals: 0 }), "33%");
- assert.equal(fmtPct(1, { decimals: 0 }), "100%");
-});
-
-test("fmtUSD guards non-finite (Cycle 1 fix)", () => {
- assert.equal(fmtUSD(1234), "$1,234");
- assert.equal(fmtUSD(1234.5, 2), "$1,234.50");
- assert.equal(fmtUSD(null), "—");
- assert.equal(fmtUSD(undefined), "—");
- assert.equal(fmtUSD(NaN), "—");
- assert.equal(fmtUSD(Infinity), "—");
- assert.equal(fmtUSD(0), "$0");
- assert.equal(fmtUSD(-500), "-$500");
-});
-
-test("fmtScore rounds + guards non-finite (Cycle 3 fix)", () => {
- assert.equal(fmtScore(87.6), "88");
- assert.equal(fmtScore(40), "40");
- assert.equal(fmtScore(null), "—");
- assert.equal(fmtScore(NaN), "—");
- assert.equal(fmtScore(Infinity), "—");
-});
-
-test("fmtUSD decimals + negative edges", () => {
- assert.equal(fmtUSD(1234.5, 2), "$1,234.50");
- assert.equal(fmtUSD(1234.5), "$1,235", "default 0 decimals rounds");
- assert.equal(fmtUSD(-1234.5, 2), "-$1,234.50");
-});
-
-test("closingCountdown — auction-urgency logic (Cody Cycle-7 gap)", () => {
- assert.equal(closingCountdown(null), "—");
- assert.equal(closingCountdown(undefined), "—");
- assert.equal(closingCountdown(inMs(-HOUR)), "CLOSED", "past close");
- assert.equal(closingCountdown(inMs(0)), "CLOSED", "exactly now (ms<=0)");
- assert.match(closingCountdown(inMs(50 * HOUR)), /^\d+d \d+h$/, "multi-day → Nd Nh");
- assert.match(closingCountdown(inMs(3 * HOUR + 5 * 60_000)), /^\d+h \d+m$/, "hours → Nh Nm");
- assert.match(closingCountdown(inMs(30 * 60_000)), /^\d+m$/, "under an hour → Nm");
-});
-
-test("isClosingSoon — 24h boundary (Cody Cycle-7 gap)", () => {
- assert.equal(isClosingSoon(null), false);
- assert.equal(isClosingSoon(inMs(2 * HOUR)), true, "within 24h");
- assert.equal(isClosingSoon(inMs(48 * HOUR)), false, "beyond 24h");
- assert.equal(isClosingSoon(inMs(-HOUR)), false, "already closed is not 'soon'");
-});
-
-test("fmtDateTime — admin timestamp (Steve's hard rule)", () => {
- assert.equal(fmtDateTime(null), "—");
- assert.equal(fmtDateTime(undefined), "—");
- const s = fmtDateTime("2026-05-20T15:17:00Z");
- assert.equal(typeof s, "string");
- assert.notEqual(s, "—");
- assert.match(s, /2026/, "renders the year (locale-format, so assert the year not exact string)");
-});
-
-test("label lookups fall back to the raw code for unknown values", () => {
- assert.equal(conditionLabel("NEW"), "New");
- assert.equal(conditionLabel(null), "Unknown");
- assert.equal(conditionLabel("MYSTERY"), "MYSTERY", "unknown code passes through");
- assert.equal(sourceLabel("GOVDEALS"), "GovDeals");
- assert.equal(sourceLabel("WEIRD_SRC"), "WEIRD_SRC");
- assert.equal(dropShipLabel("EASY"), "Drop Ship: Easy");
- assert.equal(dropShipLabel("???"), "???");
-});
diff --git a/govarbitrage/apps/mobile/tsconfig.json b/govarbitrage/apps/mobile/tsconfig.json
deleted file mode 100644
index a74f665..0000000
--- a/govarbitrage/apps/mobile/tsconfig.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "extends": "expo/tsconfig.base",
- "compilerOptions": {
- "strict": true,
- "paths": {
- "@/*": [
- "./*"
- ]
- }
- },
- "include": [
- "**/*.ts",
- "**/*.tsx",
- ".expo/types/**/*.d.ts",
- "expo-env.d.ts",
- ".expo/types/**/*.ts"
- ]
-}
diff --git a/govarbitrage/docker-compose.yml b/govarbitrage/docker-compose.yml
deleted file mode 100644
index f056620..0000000
--- a/govarbitrage/docker-compose.yml
+++ /dev/null
@@ -1,57 +0,0 @@
-# GovArbitrage — local/dev stack.
-#
-# First run: bring up the db, then push the schema + seed it, e.g.:
-# docker compose up -d db
-# docker compose run --rm web npx prisma db push
-# docker compose run --rm web npm run db:seed
-# (i.e. run `npx prisma db push && npm run db:seed` against the db service),
-# then `docker compose up web`.
-
-services:
- db:
- image: postgres:16-alpine
- environment:
- POSTGRES_DB: govarbitrage
- POSTGRES_USER: govarbitrage
- POSTGRES_PASSWORD: govarbitrage
- ports:
- - "5432:5432"
- volumes:
- - db-data:/var/lib/postgresql/data
- healthcheck:
- test: ["CMD-SHELL", "pg_isready -U govarbitrage -d govarbitrage"]
- interval: 5s
- timeout: 5s
- retries: 10
-
- # Optional — only needed if you enable BullMQ background jobs (REDIS_URL set).
- redis:
- image: redis:7-alpine
- ports:
- - "6379:6379"
- volumes:
- - redis-data:/data
-
- web:
- build:
- context: .
- dockerfile: Dockerfile
- depends_on:
- db:
- condition: service_healthy
- environment:
- DATABASE_URL: "postgresql://govarbitrage:govarbitrage@db:5432/govarbitrage?schema=public"
- REDIS_URL: "redis://redis:6379"
- NODE_ENV: "production"
- # Local AI (Ollama) runs on the host; from inside the container reach it via
- # host.docker.internal. Leave AI opt-out to fall back to the heuristic.
- OLLAMA_BASE_URL: "http://host.docker.internal:11434"
- AI_PROVIDER: "ollama"
- AUTH_SECRET: "dev-only-change-me"
- ENCRYPTION_KEY: "0123456789abcdef0123456789abcdef"
- ports:
- - "3000:3000"
-
-volumes:
- db-data:
- redis-data:
diff --git a/govarbitrage/docs/API.md b/govarbitrage/docs/API.md
deleted file mode 100644
index 376f494..0000000
--- a/govarbitrage/docs/API.md
+++ /dev/null
@@ -1,155 +0,0 @@
-# GovArbitrage — HTTP API
-
-All endpoints live under the Next.js App Router (`src/app/api`) and are marked
-`dynamic = "force-dynamic"`. Responses are JSON. The base URL in local
-development is `http://localhost:3000`.
-
-The following endpoints exist today. Additional endpoints (listing **import**,
-**buyer** interest/lead capture) may be added.
-
----
-
-## `GET /api/listings`
-
-Returns a paginated, filtered, sorted page of listings flattened into
-`ListingRow` shape. Filtering, per-profile score selection, sorting, and
-pagination are handled by `queryListings()` in `src/lib/listings.ts`.
-
-### Query parameters
-
-| Param | Type | Default | Notes |
-| -------------------- | ----------------------------- | -------------------- | ------------------------------------------------------------------------------------- |
-| `search` | string | — | Case-insensitive contains-match across `title`, `manufacturer`, `model`, `sourceAuctionId`. |
-| `source` | `AuctionSource` enum | — | Exact match, e.g. `GOVDEALS`, `PUBLIC_SURPLUS`, `GSA_AUCTIONS`, `COUNTY`, `STATE_SURPLUS`, `UNIVERSITY_SURPLUS`, `MUNICIBID`, `BID4ASSETS`, `CSV`, `EXTENSION`, `OTHER`. |
-| `category` | string | — | Case-insensitive contains-match on `category`. |
-| `condition` | `Condition` enum | — | Exact match: `NEW`, `LIKE_NEW`, `USED_GOOD`, `USED_FAIR`, `FOR_PARTS`, `UNKNOWN`. |
-| `risk` | `LOW` \| `MEDIUM` \| `HIGH` | — | Post-filter on the selected profile's risk rating. |
-| `closingWithinHours` | number | — | Only listings whose `closingAt` is between now and now + N hours. |
-| `sort` | `keyof ListingRow` | `opportunityScore` | Any `ListingRow` field (see response fields below). |
-| `dir` | `asc` \| `desc` | `desc` | Sort direction. Numeric fields sort numerically; others by locale string compare. |
-| `page` | number | `1` | 1-based page index. |
-| `pageSize` | number | `50` | Rows per page. |
-| `profile` | `ScoreProfile` enum | `OVERALL_OPPORTUNITY`| Which score profile drives the score columns + `risk`/`dropShip`. One of `OVERALL_OPPORTUNITY`, `BEST_ARBITRAGE`, `QUICK_FLIP`, `COLLECTOR`, `LOCAL_PICKUP`, `EASY_FREIGHT`, `PARTS_ONLY`, `HIGH_CONFIDENCE`, `HIGH_PROFIT`. |
-
-### Response
-
-```json
-{
- "rows": [ /* ListingRow[] */ ],
- "total": 128,
- "page": 1,
- "pageSize": 50
-}
-```
-
-- `total` is the count **after** filtering (including the risk post-filter), before pagination.
-- `rows` is the current page slice.
-
-### `ListingRow` fields
-
-Each row is denormalized from `Listing + Research + CostBreakdown + chosen Score`
-by `flattenListing()`. Money fields are numbers (USD); score fields are 0..100;
-`roi` is a ratio (e.g. `0.42` = 42%). Fields typed `| null` are null when the
-underlying research/cost/score is absent.
-
-| Field | Type | Source |
-| -------------------------------------- | --------------- | ---------------------------------------------------------------- |
-| `id` | string | Listing id |
-| `source` | string | `AuctionSource` |
-| `sourceAuctionId` | string | Lot/auction number on the source site |
-| `sourceUrl` | string \| null | |
-| `title` | string | |
-| `category` | string \| null | |
-| `manufacturer` | string \| null | |
-| `model` | string \| null | |
-| `condition` | string | `Condition` |
-| `quantity` | number | |
-| `currentBid` | number | Live current bid |
-| `currentCost` | number | Acquisition-in: winning bid + buyer premium + sales tax |
-| `recommendedMaxBid` | number | Back-solved from target ROI (`CostBreakdown`) |
-| `retailLow` | number \| null | `avgRetail` |
-| `retailAverage` | number \| null | `avgRetail` |
-| `retailHigh` | number \| null | `newRetail` |
-| `usedLow` / `usedAverage` / `usedHigh` | number \| null | `usedLow` / `usedSoldPrice` / `usedHigh` |
-| `wholesale` | number \| null | `wholesaleValue` |
-| `liquidation` | number \| null | `liquidationValue` |
-| `sellNow` | number \| null | `sellTodayValue` |
-| `value7Day` / `value30Day` / `value90Day` | number \| null | Time-horizon values |
-| `expectedSale` | number \| null | `expectedSalePrice` |
-| `shipping` | number | Cost line item |
-| `freight` | number | Cost line item |
-| `repairs` | number | Cost line item |
-| `marketplaceFees` | number | Cost line item |
-| `netProfit` | number | `expectedNetProfit` |
-| `roi` | number | Ratio |
-| `risk` | string | Selected profile's risk (`LOW`/`MEDIUM`/`HIGH`) |
-| `confidence` | number \| null | `confidenceScore` 0..100 |
-| `opportunityScore` | number | Selected profile's `value` |
-| `arbitrageScore` | number | Component sub-score |
-| `demandScore` | number | Component sub-score |
-| `velocityScore` | number | Component sub-score |
-| `logisticsScore` | number | Component sub-score |
-| `conditionScore` | number | Component sub-score |
-| `competitionScore` | number | Component sub-score |
-| `buyerScore` | number | Component sub-score |
-| `dropShip` | string | Selected profile's drop-ship feasibility |
-| `closingAt` | string \| null | ISO 8601 |
-| `researchStatus` | string | `ResearchStatus` |
-| `imageUrl` | string \| null | First image URL |
-
-### Example
-
-```bash
-curl 'http://localhost:3000/api/listings?source=GOVDEALS&condition=USED_GOOD&profile=BEST_ARBITRAGE&sort=netProfit&dir=desc&closingWithinHours=48&page=1&pageSize=25'
-```
-
----
-
-## `GET /api/listings/[id]`
-
-Returns a single full listing with all relations, or `404`.
-
-### Path parameters
-
-| Param | Type | Notes |
-| ----- | ------ | ------------ |
-| `id` | string | Listing id. |
-
-### Response
-
-The raw Prisma `Listing` record including these relations:
-
-- `research` (1:1)
-- `costBreakdown` (1:1)
-- `scores` — ordered by `value` descending
-- `comparables` — ordered by `price` descending
-- `notes` — ordered by `createdAt` descending
-- `events` — ordered by `createdAt` descending, most recent **20**
-- `buyerLeads` — ordered by `createdAt` descending
-- `buyerPage` (1:1)
-- `outcome` (1:1)
-
-On a missing id:
-
-```json
-{ "error": "Not found" }
-```
-
-with HTTP status `404`.
-
-### Example
-
-```bash
-curl 'http://localhost:3000/api/listings/clx0abc123'
-```
-
----
-
-## Notes
-
-- Both endpoints are read-only `GET`s and force dynamic rendering (no caching).
-- `GET /api/listings` returns money as plain numbers (Prisma `Decimal` values are
- converted to `number` in `flattenListing()`); `GET /api/listings/[id]` returns
- the raw Prisma payload, where `Decimal` fields serialize as JSON strings.
-- Import and buyer-workflow write endpoints are not yet implemented and may be
- added.
diff --git a/govarbitrage/docs/ARCHITECTURE.md b/govarbitrage/docs/ARCHITECTURE.md
deleted file mode 100644
index 06fa598..0000000
--- a/govarbitrage/docs/ARCHITECTURE.md
+++ /dev/null
@@ -1,199 +0,0 @@
-# GovArbitrage — Architecture
-
-GovArbitrage is a Next.js 16 App-Router application over a Prisma/Postgres data
-model. Its core is a set of **deterministic engines** that turn a single
-AI-supplied retail anchor into a full valuation, cost, and scoring picture for
-each auction listing. AI is confined to product *identification*; everything else
-is reproducible math.
-
----
-
-## Data-flow diagram
-
-```
- ┌─────────────────────────────────────────────┐
- Import source │ GovDeals / Public Surplus / GSA / county / │
- (auction site, │ state / university / Municibid / Bid4Assets │
- CSV, extension)│ / CSV / browser extension │
- └───────────────────────┬─────────────────────┘
- │ create
- ▼
- ┌───────────────┐
- │ Listing row │ (Prisma)
- └───────┬───────┘
- │ runResearch(listingId)
- ▼
- ┌────────────────────────────────────────────────────────────┐
- │ Research pipeline (src/pipeline/research.ts) │
- │ │
- │ identify ──► value ──► cost ──► score ──► persist │
- │ │ │ │ │ │
- │ ai.ts valuation costs scoring │
- │ (Ollama- .ts .ts + .ts (+ freight.ts, │
- │ first) freight demand.ts heuristic) │
- └───────────────────────────┬────────────────────────────────┘
- │ upsert (single transaction)
- ▼
- ┌──────────────┬───────────────┬───────────────┬────────────────┐
- │ Research │ CostBreakdown │ Score[] (×9) │ Comparable[] │
- │ row │ row │ + ListingEvent│ │
- └──────┬───────┴───────┬───────┴───────┬────────┴────────────────┘
- │ │ │
- ▼ ▼ ▼
- ┌───────────────────────────────────────────────────────────────┐
- │ Read layer: src/lib/listings.ts (flatten) · dashboard.ts │
- └───────────────────────────┬───────────────────────────────────┘
- ▼
- ┌────────────────────────────────────────┐
- │ Dashboard (page.tsx + listings-table) │
- │ · API routes (/api/listings, /[id]) │
- │ · Listing detail (/listings/[id]) │
- └────────────────────────────────────────┘
-```
-
----
-
-## Layers
-
-### 1. Data model (`prisma/schema.prisma`)
-
-Money is stored as `Decimal(14,2)`; scores are `Float` 0..100; probabilities are
-`Float` 0..1.
-
-| Model | Role |
-| -------------------- | ---------------------------------------------------------------------------------------- |
-| **Listing** | The auction lot. Source + `sourceAuctionId` (unique together), title/description/category, AI-identified attributes (manufacturer, model, serial, sku, year), condition, quantity, weight/dimensions, location, live auction state (`currentBid`, `bidCount`, `closingAt`, `imageUrls`), `identifiedBy`/`identifyRaw`, and a `researchStatus`. Owns all the relations below. |
-| **Research** | 1:1 valuation output — retail estimates, used-market spread, channel values (wholesale/liquidation/sell-today), 7/30/90-day horizon values, expected sale price, probability of sale, days-until-sold, confidence, sources JSON, and a summary. |
-| **CostBreakdown** | 1:1 cost sheet — 20+ line items plus the rollups `expectedReturns`, `totalInvestment`, `expectedNetProfit`, `roi`, `annualizedReturn`, and `recommendedMaxBid`; `assumptions` JSON records the basis for each estimate. |
-| **Score** | One row **per scoring profile** (unique `[listingId, profile]`) — the profile `value`, the seven component sub-scores, `risk`, `dropShip`, a plain-English `explanation`, and structured `factors`. |
-| **Comparable** | Sold / active / retail comps backing a valuation (`kind`, title, price, url, source, soldAt). |
-| **BuyerInterestPage**| Compliant, contingent-only interest page for a listing (slug, headline, `contingent` default true, `published`, standing `disclaimer`). |
-| **BuyerLead** | A captured buyer lead with an optional **contingent** offer (never ownership). |
-| **AuctionOutcome** | Tracks the lifecycle: WATCHING → BID_PLACED → WON/LOST/ABANDONED, plus max bid set, won price, actual sale. |
-| **Note** | Freeform analyst notes on a listing. |
-| **ListingEvent** | Typed, append-only event log (IMPORTED, RESEARCH_STARTED/COMPLETED/FAILED, SCORED, PRICE_CHANGED, NOTE_ADDED, BUYER_LEAD_ADDED, OUTCOME_CHANGED, MANUAL_EDIT). |
-| **SavedView** | A persisted dashboard configuration (filters, sort, columns, pinned, grouping) as JSON. |
-| **User** | Auth principal (email, passwordHash, role ADMIN/ANALYST/VIEWER). |
-| **ApiCredential** | Per-user provider credential stored **AES-256-GCM encrypted at rest** (ciphertext/iv/authTag), never returned to the client. |
-| **AuditLog** | Privileged-action audit trail (action, entity, entityId, ip, meta). |
-
-### 2. Deterministic engines (`src/engines`)
-
-Constants for every engine live in `src/engines/constants.ts` (condition→retail
-factors, repair factors, per-source buyer premiums, fee rates, prep-cost
-assumptions, freight threshold, target ROI). Shared types live in
-`src/engines/types.ts`. Each engine has a colocated Vitest test
-(`*.test.ts`).
-
-- **`valuation.ts`** — `computeValuation()` derives the full price ladder from a
- single **retail anchor** (`newRetail`) plus item facts. Per-unit retail figures
- (new / replacement / average), a used-market spread anchored on
- `CONDITION_RETAIL_FACTOR`, channel values (wholesale = 0.6× used, liquidation =
- 0.42×, sell-today = 1.1× liquidation), demand-scaled time-horizon values
- (7/30/90-day), a demand-weighted **expected sale price** (scaled by quantity),
- **probability of sale** (demand + condition), **days-until-sold** (demand-driven),
- and a **confidence score** built from identification confidence + number of
- comparables.
-
-- **`costs.ts`** — `computeCosts()` computes 20+ line items split into
- bid-independent `fixedCosts()` (freight/shipping via `freight.ts`, insurance,
- packing, pickup labor, testing, repairs, certification, storage, photography,
- listing labor, plus resale-side marketplace + payment fees) and bid-dependent
- costs (buyer's premium by source, sales tax). Rolls up to `expectedReturns`,
- `totalInvestment`, `expectedNetProfit`, `roi`, and `annualizedReturn` (ROI
- compounded over the holding period). Then **back-solves `recommendedMaxBid`** —
- the highest bid that still clears `TARGET_ROI` given all bid-independent costs
- and resale fees — and records its `assumptions`.
-
-- **`scoring.ts`** — `computeScores()` first computes **seven component
- sub-scores** via `computeComponents()` (arbitrage from ROI with diminishing
- returns, demand, velocity, logistics, condition, competition, buyer readiness),
- plus `computeRisk()` (LOW/MEDIUM/HIGH) and `computeDropShip()`
- (EASY/MODERATE/DIFFICULT/INFEASIBLE). It then produces **nine named profiles**
- (`OVERALL_OPPORTUNITY`, `BEST_ARBITRAGE`, `QUICK_FLIP`, `COLLECTOR`,
- `LOCAL_PICKUP`, `EASY_FREIGHT`, `PARTS_ONLY`, `HIGH_CONFIDENCE`, `HIGH_PROFIT`),
- each a weighted blend of the components plus profile-specific adjustments, and
- each carrying a **plain-English `explanation`** naming its top drivers, ROI,
- time-to-sell, risk, and drop-ship rating.
-
-- **`freight.ts`** — `estimateFreight()` maps total lot weight to a logistics
- cost: parcel tiers below `FREIGHT_THRESHOLD_LBS` (150 lb), LTL freight (base +
- per-hundredweight) above it. Returns whether the item ships as freight and a
- human-readable `basis`.
-
-- **`demand.ts`** — a deterministic, keyword-driven demand + retail-floor
- heuristic. Matches listing text against category signals (electronics, medical,
- lab, industrial, office/furniture, cameras, networking, tools, vehicles) and a
- premium-brand list. Used both as the **fallback when no AI model is reachable**
- and as a sanity floor for AI estimates.
-
-### 3. Research pipeline (`src/pipeline/research.ts`)
-
-`runResearch(listingId, opts)` orchestrates the whole flow and is **idempotent**
-(all writes are upserts, safe to re-run):
-
-1. Marks the listing `IN_PROGRESS`.
-2. Runs the demand heuristic on the listing text.
-3. **Identity + anchor resolution** with priority *overrides → AI → heuristic*.
- When `opts.useAI` is set, calls `identifyProduct()`; AI's `estimatedNewRetail`
- is blended against the heuristic floor and its demand/confidence are clamped.
-4. **Valuation** → `computeValuation()`.
-5. **Costs** → `computeCosts()` (winning bid modeled as the current bid; local
- pickup inferred from weight + auction terms via `inferLocalPickup()`).
-6. **Scores** → `computeScores()`.
-7. **Persist** in a single `prisma.$transaction`: upserts `Research`,
- `CostBreakdown`, replaces `Comparable[]`, upserts all nine `Score` rows,
- updates the listing to `COMPLETE` (optionally writing back identity), and
- appends a `RESEARCH_COMPLETED` `ListingEvent`.
-
-Returns a compact summary (`expectedNetProfit`, `roi`, `overallScore`,
-`identifiedBy`). The seeder (`prisma/seed.ts`) drives this pipeline with
-deterministic anchors + comparables to produce realistic sample data.
-
-### 4. AI layer (`src/lib/ai.ts`)
-
-Local-first product identification. `identifyProduct()` tries the Ollama vision
-model (when images are supplied), then the Ollama text model, then — only if
-`AI_PROVIDER=anthropic` and `ANTHROPIC_API_KEY` is set — an Anthropic Claude
-fallback. All calls fail soft (return `null`), letting the pipeline fall back to
-the heuristic. `ollamaReachable()` powers health checks. See the README's
-["How the AI layer works"](../README.md#how-the-ai-layer-works) section.
-
-### 5. API routes (`src/app/api/listings`)
-
-- **`route.ts`** — `GET /api/listings`, parses query params into `QueryParams`
- and delegates to `queryListings()`; `dynamic = "force-dynamic"`.
-- **`[id]/route.ts`** — `GET /api/listings/[id]`, returns the full listing with
- all relations (research, costBreakdown, scores, comparables, notes, events,
- buyerLeads, buyerPage, outcome) or 404.
-
-The read/query logic lives in `src/lib/listings.ts`: `flattenListing()`
-denormalizes `Listing + Research + CostBreakdown + chosen Score` into a flat
-`ListingRow`, and `queryListings()` applies filtering (source/condition/category/
-search/closing-soon), per-profile score selection, risk post-filtering, sorting,
-and pagination. See [API.md](./API.md).
-
-### 6. UI (`src/app`, `src/components`)
-
-- **`src/app/page.tsx`** — the dashboard. Server component: fetches
- `getDashboardStats()` (`src/lib/dashboard.ts`) for the summary cards
- (`DashboardCards`) and renders the client `ListingsTable`.
-- **`src/components/listings-table.tsx`** — the dense **TanStack Table**. ~40
- sortable/hideable columns, a profile selector that re-ranks server-side,
- server-side search + source/condition/risk filters (debounced fetch to
- `/api/listings`), column-visibility menu, CSV export, sticky first column, and
- row-click into the detail view.
-- **`src/app/listings/[id]/page.tsx`** — the listing detail. Server component
- rendering the image gallery, headline metrics, the full valuation ladder, the
- line-item cost breakdown + profit rollup, per-profile score **explanations**,
- comparables, auction terms + risk, the compliant buyer-interest section, and
- event history.
-- **`src/components/ui/*`** — shadcn/ui-style primitives (`card`, `badge`,
- `button`, `input`) built on `class-variance-authority` + `tailwind-merge`.
-
-### Configuration notes
-
-`next.config.ts` pins the Turbopack workspace root, marks `@prisma/client`,
-`bullmq`, and `ioredis` as `serverExternalPackages`, and allows remote images
-from any host. Tailwind v4 is wired via `postcss.config.mjs`
-(`@tailwindcss/postcss`).
diff --git a/govarbitrage/eslint.config.mjs b/govarbitrage/eslint.config.mjs
deleted file mode 100644
index 0549540..0000000
--- a/govarbitrage/eslint.config.mjs
+++ /dev/null
@@ -1,11 +0,0 @@
-import next from "eslint-config-next";
-
-/** Flat ESLint config for Next.js 16 (native flat export). */
-const eslintConfig = [
- {
- ignores: ["node_modules/**", ".next/**", "extension/**", "prisma/seed.ts"],
- },
- ...next,
-];
-
-export default eslintConfig;
diff --git a/govarbitrage/extension/README.md b/govarbitrage/extension/README.md
deleted file mode 100644
index 7925211..0000000
--- a/govarbitrage/extension/README.md
+++ /dev/null
@@ -1,92 +0,0 @@
-# GovArbitrage Capture — Chrome Extension
-
-A standalone Manifest V3 Chrome extension that scrapes the government-surplus
-auction page you're viewing (GovDeals, Public Surplus, GSA Auctions, or any
-generic auction page) and POSTs the extracted listing into the GovArbitrage app.
-
-No build step, no npm — it's plain vanilla JS and loads directly as an unpacked
-extension.
-
-## Load it (unpacked)
-
-1. Open `chrome://extensions` in Chrome (or any Chromium browser).
-2. Toggle **Developer mode** on (top-right).
-3. Click **Load unpacked**.
-4. Select this `extension/` folder.
-5. The **GovArbitrage Capture** icon appears in the toolbar. Pin it for easy
- access.
-
-After editing any file, click the **↻ reload** icon on the extension card in
-`chrome://extensions` to pick up changes.
-
-## Use it
-
-1. Navigate to an auction/item page on GovDeals, Public Surplus, or GSA
- Auctions (or any other auction page — it falls back to generic extraction).
-2. Click the extension icon to open the popup.
-3. Confirm the **API base URL** (defaults to `http://localhost:3000`; your
- choice is saved to `chrome.storage.local` and persists).
-4. Click **Capture this page** — the extracted JSON appears in the preview.
-5. Review it, then click **Send to GovArbitrage** to POST it to the app.
-
-## How it works
-
-- **`popup.js`** uses `chrome.scripting.executeScript` to inject
- **`content.js`** into the active tab, then calls its
- `extractGovArbitrageListing()` function and displays the returned object.
- Extraction is done programmatically (no persistent content script) so the
- extension only touches a page when you explicitly ask it to.
-- **`content.js`** detects the source from `location.hostname`, parses the
- auction/lot id from the URL (query string first, then path, then visible
- label), and pulls title, description, category, current bid, bid count,
- closing date, location, images, and terms with site-specific selectors plus
- defensive fallbacks. It never throws — every access is guarded — so a partial
- page still yields a valid (partial) object.
-- **`background.js`** is a near-empty MV3 service worker (logs install,
- optionally relays a `PING`/`PONG` message).
-
-## App endpoint
-
-The popup POSTs the captured JSON to:
-
-```
-POST {apiBase}/api/import/extension
-Content-Type: application/json
-```
-
-**Note:** this import endpoint is being added on the GovArbitrage app side. The
-extension does not depend on the app internals — it just sends the JSON shape
-below. On success it looks for `{ id }` or `{ listing: { id } }` in the
-response and shows the listing id; any non-2xx response is surfaced as an error.
-
-## Captured JSON shape
-
-The object `content.js` emits (field names deliberately match the app's Prisma
-`Listing` model; `source` uses the `AuctionSource` enum, and the extension's
-values are `EXTENSION`-origin listings):
-
-```json
-{
- "source": "GOVDEALS | PUBLIC_SURPLUS | GSA_AUCTIONS | OTHER",
- "sourceAuctionId": "string (auction/lot number)",
- "sourceUrl": "string (full page URL)",
- "title": "string",
- "description": "string",
- "category": "string",
- "currentBid": 0,
- "bidCount": 0,
- "closingAt": "ISO-8601 string | null",
- "locationCity": "string",
- "locationState": "string",
- "locationZip": "string",
- "imageUrls": ["string", "..."],
- "auctionTerms": "string",
- "capturedAt": "ISO-8601 string"
-}
-```
-
-Types: `currentBid` and `bidCount` are numbers; `closingAt` is an ISO string or
-`null`; `imageUrls` is an array of absolute URL strings; all other fields are
-strings (possibly empty). The app should map `source` into the `AuctionSource`
-enum, store the values as an `EXTENSION`-origin `Listing`, and enforce the
-`@@unique([source, sourceAuctionId])` constraint (upsert on re-capture).
diff --git a/govarbitrage/extension/background.js b/govarbitrage/extension/background.js
deleted file mode 100644
index 378e426..0000000
--- a/govarbitrage/extension/background.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * GovArbitrage Capture — MV3 service worker.
- *
- * Intentionally minimal. The extension does its real work from the popup
- * (chrome.scripting + fetch), so this worker only:
- * - logs install/update for debugging
- * - optionally relays messages (kept for future content-script → app hooks)
- *
- * Service workers in MV3 are ephemeral; do not hold long-lived state here.
- */
-
-chrome.runtime.onInstalled.addListener((details) => {
- console.log('[GovArbitrage Capture] installed/updated:', details.reason);
-});
-
-// Optional message relay. Not required for the current popup-driven flow, but
-// lets a future content script ping the worker without breaking anything.
-chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
- try {
- if (message && message.type === 'PING') {
- sendResponse({ type: 'PONG', ts: Date.now() });
- return true; // keep the channel open for the async response
- }
- } catch (e) {
- console.warn('[GovArbitrage Capture] message handler error:', e);
- }
- return false;
-});
diff --git a/govarbitrage/extension/content.js b/govarbitrage/extension/content.js
deleted file mode 100644
index c71fd96..0000000
--- a/govarbitrage/extension/content.js
+++ /dev/null
@@ -1,422 +0,0 @@
-/**
- * GovArbitrage Capture — page extractor.
- *
- * This file exposes a single function, extractGovArbitrageListing(), that is
- * injected into the active tab via chrome.scripting.executeScript and returns
- * a structured listing object. It must be entirely self-contained (no imports,
- * no closure over popup state) because it runs in the page's isolated world.
- *
- * It is written to NEVER throw — every DOM access is wrapped in try/catch or
- * guarded with optional chaining, so a partial page still yields a partial (but
- * valid) object.
- *
- * Emitted shape (matches the app's Prisma Listing model / EXTENSION source):
- * {
- * source: "GOVDEALS" | "PUBLIC_SURPLUS" | "GSA_AUCTIONS" | "OTHER",
- * sourceAuctionId: string,
- * sourceUrl: string,
- * title: string,
- * description: string,
- * category: string,
- * currentBid: number, // dollars, e.g. 125.5
- * bidCount: number,
- * closingAt: string | null, // ISO 8601
- * locationCity: string,
- * locationState: string,
- * locationZip: string,
- * imageUrls: string[],
- * auctionTerms: string,
- * capturedAt: string // ISO 8601, when the extension scraped it
- * }
- */
-function extractGovArbitrageListing() {
- 'use strict';
-
- // ----------------------------------------------------------------- helpers
- const safe = (fn, fallback) => {
- try {
- const v = fn();
- return v === undefined || v === null ? fallback : v;
- } catch (_e) {
- return fallback;
- }
- };
-
- const text = (el) => {
- try {
- return (el && (el.textContent || el.innerText) || '').replace(/\s+/g, ' ').trim();
- } catch (_e) {
- return '';
- }
- };
-
- const q = (sel, root) => safe(() => (root || document).querySelector(sel), null);
- const qa = (sel, root) => safe(() => Array.from((root || document).querySelectorAll(sel)), []);
-
- const meta = (prop) =>
- safe(
- () =>
- (
- q(`meta[property="${prop}"]`) ||
- q(`meta[name="${prop}"]`)
- )?.getAttribute('content') || '',
- ''
- );
-
- // Parse a currency-ish string ("$1,250.00", "USD 1250") into a number.
- const parseMoney = (str) => {
- if (str === null || str === undefined) return 0;
- try {
- const m = String(str).replace(/[^0-9.,]/g, '');
- if (!m) return 0;
- // Strip thousands separators, keep the last dot as decimal.
- const cleaned = m.replace(/,(?=\d{3}(\D|$))/g, '').replace(/,/g, '');
- const n = parseFloat(cleaned);
- return Number.isFinite(n) ? n : 0;
- } catch (_e) {
- return 0;
- }
- };
-
- const parseInt10 = (str) => {
- try {
- const n = parseInt(String(str).replace(/[^0-9]/g, ''), 10);
- return Number.isFinite(n) ? n : 0;
- } catch (_e) {
- return 0;
- }
- };
-
- const toISO = (str) => {
- if (!str) return null;
- try {
- const d = new Date(str);
- if (!isNaN(d.getTime())) return d.toISOString();
- } catch (_e) {
- /* fall through */
- }
- return null;
- };
-
- const absUrl = (u) => {
- if (!u) return '';
- try {
- return new URL(u, location.href).href;
- } catch (_e) {
- return u;
- }
- };
-
- const params = safe(() => new URLSearchParams(location.search), new URLSearchParams());
- const host = safe(() => location.hostname.toLowerCase(), '');
-
- // ------------------------------------------------------------------ source
- let source = 'OTHER';
- if (host.includes('govdeals.com')) source = 'GOVDEALS';
- else if (host.includes('publicsurplus.com')) source = 'PUBLIC_SURPLUS';
- else if (host.includes('gsaauctions.gov')) source = 'GSA_AUCTIONS';
-
- // ---------------------------------------------------- source auction / lot id
- const idFromQuery = () => {
- const keys = [
- 'index',
- 'itemid',
- 'itemId',
- 'assetId',
- 'assetid',
- 'auctionId',
- 'auctionid',
- 'id',
- 'lotId',
- 'lotid',
- 'sku',
- 'a',
- ];
- for (const k of keys) {
- const v = params.get(k);
- if (v) return v;
- }
- return '';
- };
-
- const idFromPath = () => {
- const path = safe(() => location.pathname, '') || '';
- // common patterns: /asset/12345, /item/12345, /auction/98765, /.../12345
- const patterns = [
- /\/(?:asset|item|items|auction|auctions|lot|lots|listing|listings)\/([A-Za-z0-9_-]+)/i,
- /\/(\d{4,})(?:[/?#]|$)/,
- ];
- for (const re of patterns) {
- const m = path.match(re);
- if (m && m[1]) return m[1];
- }
- return '';
- };
-
- let sourceAuctionId = idFromQuery() || idFromPath();
- if (!sourceAuctionId) {
- // Last resort: look for a visible "Item #" / "Auction #" label on the page.
- const bodyText = safe(() => document.body.innerText, '') || '';
- const m =
- bodyText.match(/(?:item|auction|lot|asset)\s*(?:#|no\.?|number)?\s*:?\s*([A-Za-z0-9-]{3,})/i) || null;
- if (m && m[1]) sourceAuctionId = m[1];
- }
- sourceAuctionId = String(sourceAuctionId || '').trim();
-
- // ------------------------------------------------------------------- title
- let title =
- meta('og:title') ||
- text(q('h1')) ||
- safe(() => document.title, '') ||
- '';
- // Trim trailing " | GovDeals" style site suffixes.
- title = title.replace(/\s*[|\-–—]\s*(GovDeals|Public Surplus|GSA Auctions).*$/i, '').trim();
-
- // ------------------------------------------------------------- description
- let description =
- meta('og:description') ||
- meta('description') ||
- '';
- if (!description) {
- // Try common description containers.
- const descEl =
- q('#description') ||
- q('.description') ||
- q('[class*="description" i]') ||
- q('[id*="description" i]') ||
- q('[class*="itemDetail" i]');
- description = text(descEl);
- }
-
- // --------------------------------------------------------------- category
- let category =
- meta('og:category') ||
- meta('article:section') ||
- '';
- if (!category) {
- // Breadcrumb trail is the most reliable category signal.
- const crumbs = qa('[class*="breadcrumb" i] a, nav[aria-label*="breadcrumb" i] a, .breadcrumbs a');
- const parts = crumbs.map(text).filter(Boolean);
- if (parts.length) {
- // Drop a leading "Home" crumb, take the deepest meaningful one.
- const filtered = parts.filter((p) => !/^home$/i.test(p));
- category = (filtered[filtered.length - 1] || '').trim();
- }
- }
-
- // -------------------------------------------------------------- current bid
- const findBid = () => {
- // 1. Site-specific selectors first.
- const bidSelectors = [
- '#currentBidAmount',
- '.current-bid',
- '.currentBid',
- '[class*="currentBid" i]',
- '[class*="current-bid" i]',
- '[id*="currentBid" i]',
- '[data-testid*="bid" i]',
- ];
- for (const sel of bidSelectors) {
- const el = q(sel);
- if (el) {
- const v = parseMoney(text(el));
- if (v > 0) return v;
- }
- }
- // 2. Label-adjacent scan: find a "Current Bid" / "High Bid" label, read
- // the nearest dollar amount after it.
- const labelRe = /(current\s*bid|high\s*bid|winning\s*bid|current\s*price|bid\s*amount)/i;
- const candidates = qa('td, th, span, div, p, li, dt, dd, label, strong, b');
- for (let i = 0; i < candidates.length; i++) {
- const t = text(candidates[i]);
- if (!labelRe.test(t)) continue;
- // dollar value may be inside the same node...
- const inline = t.match(/\$[\s]*([0-9][0-9.,]*)/);
- if (inline) {
- const v = parseMoney(inline[0]);
- if (v > 0) return v;
- }
- // ...or in a sibling / parent's next cell.
- const sib = candidates[i].nextElementSibling;
- if (sib) {
- const v = parseMoney(text(sib));
- if (v > 0) return v;
- }
- }
- // 3. Global fallback: first plausible dollar figure on the page.
- const body = safe(() => document.body.innerText, '') || '';
- const m = body.match(/\$[\s]*([0-9][0-9.,]*)/);
- return m ? parseMoney(m[0]) : 0;
- };
- const currentBid = safe(findBid, 0);
-
- // ---------------------------------------------------------------- bid count
- const findBidCount = () => {
- const sels = ['[class*="bidCount" i]', '[class*="bid-count" i]', '[id*="bidCount" i]', '.bids'];
- for (const sel of sels) {
- const el = q(sel);
- if (el) {
- const v = parseInt10(text(el));
- if (v > 0) return v;
- }
- }
- const body = safe(() => document.body.innerText, '') || '';
- const m = body.match(/(\d+)\s*bids?\b/i) || body.match(/bids?\s*[:#]?\s*(\d+)/i);
- return m ? parseInt10(m[1]) : 0;
- };
- const bidCount = safe(findBidCount, 0);
-
- // ---------------------------------------------------------------- closing at
- const findClosing = () => {
- // Prefer machine-readable <time datetime="...">.
- const timeEls = qa('time[datetime]');
- for (const el of timeEls) {
- const iso = toISO(el.getAttribute('datetime'));
- if (iso) return iso;
- }
- // Labelled selectors.
- const sels = [
- '[class*="closingDate" i]',
- '[class*="closing-date" i]',
- '[class*="endDate" i]',
- '[class*="end-date" i]',
- '[class*="timeLeft" i]',
- '[id*="closing" i]',
- '[id*="endDate" i]',
- ];
- for (const sel of sels) {
- const el = q(sel);
- const iso = toISO(el?.getAttribute?.('datetime') || text(el));
- if (iso) return iso;
- }
- // Label-adjacent text scan.
- const labelRe = /(closing|close|ends?|end\s*date|end\s*time|auction\s*ends?)/i;
- const nodes = qa('td, th, span, div, p, li, dt, dd, label, strong, b');
- for (let i = 0; i < nodes.length; i++) {
- const t = text(nodes[i]);
- if (!labelRe.test(t)) continue;
- const iso = toISO(t.replace(labelRe, '').replace(/[:#-]/g, ' ').trim());
- if (iso) return iso;
- const sib = nodes[i].nextElementSibling;
- if (sib) {
- const iso2 = toISO(text(sib));
- if (iso2) return iso2;
- }
- }
- return null;
- };
- const closingAt = safe(findClosing, null);
-
- // --------------------------------------------------------------- location
- const findLocation = () => {
- let city = '';
- let state = '';
- let zip = '';
-
- // Look for an explicit location label / container.
- const locEl =
- q('[class*="location" i]') ||
- q('[id*="location" i]') ||
- q('[class*="itemLocation" i]');
- let locText = text(locEl);
-
- if (!locText) {
- const labelRe = /(location|located\s*in|city\/state|item\s*location)/i;
- const nodes = qa('td, th, span, div, p, li, dt, dd, label, strong, b');
- for (let i = 0; i < nodes.length; i++) {
- const t = text(nodes[i]);
- if (labelRe.test(t)) {
- const sib = nodes[i].nextElementSibling;
- locText = (sib ? text(sib) : t.replace(labelRe, '').trim()) || '';
- if (locText) break;
- }
- }
- }
-
- // Zip.
- const zipM = locText.match(/\b(\d{5})(?:-\d{4})?\b/);
- if (zipM) zip = zipM[1];
-
- // "City, ST 12345" or "City, ST".
- const csM = locText.match(/([A-Za-z .'-]+),\s*([A-Z]{2})\b/);
- if (csM) {
- city = csM[1].trim();
- state = csM[2].trim();
- }
-
- return { locationCity: city, locationState: state, locationZip: zip };
- };
- const loc = safe(findLocation, { locationCity: '', locationState: '', locationZip: '' });
-
- // ---------------------------------------------------------------- images
- const findImages = () => {
- const urls = new Set();
-
- const og = meta('og:image');
- if (og) urls.add(absUrl(og));
-
- // Gallery / prominent images. Prefer larger images and skip obvious icons.
- const imgs = qa('img');
- for (const img of imgs) {
- const raw =
- img.getAttribute('data-src') ||
- img.getAttribute('data-lazy') ||
- img.currentSrc ||
- img.src ||
- '';
- if (!raw) continue;
- const u = absUrl(raw);
- if (!/^https?:/i.test(u)) continue;
- // Skip sprites / icons / tracking pixels / tiny thumbs by name or size.
- if (/(sprite|icon|logo|pixel|blank|spacer|placeholder)/i.test(u)) continue;
- const w = img.naturalWidth || img.width || 0;
- const h = img.naturalHeight || img.height || 0;
- if ((w && w < 80) || (h && h < 80)) continue;
- urls.add(u);
- }
-
- return Array.from(urls).slice(0, 24);
- };
- const imageUrls = safe(findImages, []);
-
- // ------------------------------------------------------------ auction terms
- const findTerms = () => {
- const sels = [
- '[class*="terms" i]',
- '[id*="terms" i]',
- '[class*="paymentTerms" i]',
- '[class*="removalTerms" i]',
- '[class*="specialInstructions" i]',
- ];
- const chunks = [];
- for (const sel of sels) {
- for (const el of qa(sel)) {
- const t = text(el);
- if (t && t.length > 10) chunks.push(t);
- }
- }
- // De-dup and cap length.
- const joined = Array.from(new Set(chunks)).join('\n\n');
- return joined.slice(0, 5000);
- };
- const auctionTerms = safe(findTerms, '');
-
- // ------------------------------------------------------------------ result
- return {
- source,
- sourceAuctionId,
- sourceUrl: safe(() => location.href, ''),
- title: (title || '').slice(0, 500),
- description: (description || '').slice(0, 20000),
- category: (category || '').slice(0, 200),
- currentBid,
- bidCount,
- closingAt,
- locationCity: loc.locationCity || '',
- locationState: loc.locationState || '',
- locationZip: loc.locationZip || '',
- imageUrls,
- auctionTerms,
- capturedAt: new Date().toISOString(),
- };
-}
diff --git a/govarbitrage/extension/manifest.json b/govarbitrage/extension/manifest.json
deleted file mode 100644
index 70bf2ea..0000000
--- a/govarbitrage/extension/manifest.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "manifest_version": 3,
- "name": "GovArbitrage Capture",
- "version": "0.1.0",
- "description": "Capture a government-surplus auction page (GovDeals, Public Surplus, GSA Auctions, or generic) and send the extracted listing into the GovArbitrage app.",
- "permissions": ["activeTab", "scripting", "storage"],
- "host_permissions": [
- "https://www.govdeals.com/*",
- "https://www.publicsurplus.com/*",
- "https://gsaauctions.gov/*"
- ],
- "action": {
- "default_popup": "popup.html",
- "default_title": "GovArbitrage Capture"
- },
- "background": {
- "service_worker": "background.js"
- }
-}
diff --git a/govarbitrage/extension/popup.js b/govarbitrage/extension/popup.js
deleted file mode 100644
index 1354a5f..0000000
--- a/govarbitrage/extension/popup.js
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
- * GovArbitrage Capture — popup controller.
- *
- * Responsibilities:
- * - load/save the API base URL to chrome.storage.local
- * - on "Capture", inject content.js's extractor into the active tab and show
- * the returned object
- * - on "Send", POST the captured object to `${apiBase}/api/import/extension`
- *
- * All async paths are guarded so a failure surfaces as readable status text
- * rather than an unhandled rejection.
- */
-
-const DEFAULT_API_BASE = 'http://localhost:3000';
-const STORAGE_KEY = 'govarbitrage_api_base';
-const IMPORT_PATH = '/api/import/extension';
-
-const els = {
- apiBase: document.getElementById('apiBase'),
- captureBtn: document.getElementById('captureBtn'),
- sendBtn: document.getElementById('sendBtn'),
- preview: document.getElementById('preview'),
- summary: document.getElementById('summary'),
- status: document.getElementById('status'),
-};
-
-/** Last successfully captured listing object (or null). */
-let captured = null;
-
-// ------------------------------------------------------------------ status
-function setStatus(msg, kind = 'info') {
- els.status.textContent = msg || '';
- els.status.className = kind;
-}
-
-// ------------------------------------------------------------- storage load
-function loadApiBase() {
- try {
- chrome.storage.local.get([STORAGE_KEY], (res) => {
- const val = (res && res[STORAGE_KEY]) || DEFAULT_API_BASE;
- els.apiBase.value = val;
- });
- } catch (_e) {
- els.apiBase.value = DEFAULT_API_BASE;
- }
-}
-
-function saveApiBase() {
- const val = normalizeBase(els.apiBase.value);
- try {
- chrome.storage.local.set({ [STORAGE_KEY]: val });
- } catch (_e) {
- /* non-fatal */
- }
-}
-
-function normalizeBase(v) {
- let base = (v || '').trim() || DEFAULT_API_BASE;
- // strip trailing slashes
- base = base.replace(/\/+$/, '');
- return base;
-}
-
-// ------------------------------------------------------------- active tab
-function getActiveTab() {
- return new Promise((resolve, reject) => {
- try {
- chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
- if (chrome.runtime.lastError) return reject(new Error(chrome.runtime.lastError.message));
- const tab = tabs && tabs[0];
- if (!tab) return reject(new Error('No active tab found.'));
- resolve(tab);
- });
- } catch (e) {
- reject(e);
- }
- });
-}
-
-// ------------------------------------------------------------------ capture
-async function onCapture() {
- setStatus('Capturing…', 'info');
- els.sendBtn.disabled = true;
- captured = null;
-
- let tab;
- try {
- tab = await getActiveTab();
- } catch (e) {
- setStatus('Could not read the active tab: ' + e.message, 'err');
- return;
- }
-
- if (!tab.id || !/^https?:/i.test(tab.url || '')) {
- setStatus('This page cannot be captured (only http/https pages).', 'err');
- return;
- }
-
- try {
- const results = await chrome.scripting.executeScript({
- target: { tabId: tab.id },
- // The extractor is defined in content.js; injecting the file makes
- // extractGovArbitrageListing available in the page, then we call it.
- files: ['content.js'],
- });
-
- // File injection returns undefined results, so run the call in a second
- // pass now that the function is defined in the page.
- const callResults = await chrome.scripting.executeScript({
- target: { tabId: tab.id },
- func: () =>
- typeof extractGovArbitrageListing === 'function'
- ? extractGovArbitrageListing()
- : null,
- });
-
- const data = callResults && callResults[0] && callResults[0].result;
- if (!data) {
- setStatus('Extraction returned no data on this page.', 'err');
- els.preview.textContent = '';
- els.summary.textContent = '';
- return;
- }
-
- captured = data;
- renderPreview(data);
- els.sendBtn.disabled = false;
- setStatus('Captured. Review, then send.', 'ok');
- } catch (e) {
- setStatus('Capture failed: ' + (e && e.message ? e.message : String(e)), 'err');
- els.preview.textContent = '';
- els.summary.textContent = '';
- }
-}
-
-function renderPreview(data) {
- try {
- els.preview.textContent = JSON.stringify(data, null, 2);
- } catch (_e) {
- els.preview.textContent = String(data);
- }
- const imgCount = Array.isArray(data.imageUrls) ? data.imageUrls.length : 0;
- els.summary.textContent = `${data.source} · #${data.sourceAuctionId || '—'} · ${imgCount} img`;
-}
-
-// --------------------------------------------------------------------- send
-async function onSend() {
- if (!captured) {
- setStatus('Nothing captured yet.', 'err');
- return;
- }
- const base = normalizeBase(els.apiBase.value);
- saveApiBase();
- const endpoint = base + IMPORT_PATH;
-
- setStatus('Sending to ' + endpoint + ' …', 'info');
- els.sendBtn.disabled = true;
-
- try {
- const resp = await fetch(endpoint, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify(captured),
- });
-
- let payload = null;
- const raw = await resp.text();
- try {
- payload = raw ? JSON.parse(raw) : null;
- } catch (_e) {
- payload = { raw };
- }
-
- if (resp.ok) {
- const id = payload && (payload.id || (payload.listing && payload.listing.id));
- setStatus('Sent ✓' + (id ? ' — listing ' + id : ' (HTTP ' + resp.status + ')'), 'ok');
- } else {
- const detail =
- (payload && (payload.error || payload.message)) || 'HTTP ' + resp.status;
- setStatus('Server rejected it: ' + detail, 'err');
- els.sendBtn.disabled = false;
- }
- } catch (e) {
- setStatus(
- 'Network error — is the app running at ' + base + '? (' + (e && e.message ? e.message : e) + ')',
- 'err'
- );
- els.sendBtn.disabled = false;
- }
-}
-
-// -------------------------------------------------------------------- wiring
-els.captureBtn.addEventListener('click', onCapture);
-els.sendBtn.addEventListener('click', onSend);
-els.apiBase.addEventListener('change', saveApiBase);
-els.apiBase.addEventListener('blur', saveApiBase);
-
-loadApiBase();
diff --git a/govarbitrage/logs/digest.log b/govarbitrage/logs/digest.log
deleted file mode 100644
index 094a289..0000000
--- a/govarbitrage/logs/digest.log
+++ /dev/null
@@ -1,35 +0,0 @@
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f4c1d26cabd427","threadId":"19f4c1d26cabd427","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f4e7953154d42d","threadId":"19f4e7953154d42d","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f514375b6ab1b5","threadId":"19f514375b6ab1b5","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f539fc3fd1fec4","threadId":"19f539fc3fd1fec4","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f5669e0563538e","threadId":"19f5669e0563538e","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f58c61fc96fe7b","threadId":"19f58c61fc96fe7b","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f5b90307cffe32","threadId":"19f5b90307cffe32","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f5dec7a3b2e9e1","threadId":"19f5dec7a3b2e9e1","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f60b691b5c9777","threadId":"19f60b691b5c9777","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f6312c67982801","threadId":"19f6312c67982801","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f65dcf45bcdf27","threadId":"19f65dcf45bcdf27","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f683934fb57840","threadId":"19f683934fb57840","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f6b0350c5720a6","threadId":"19f6b0350c5720a6","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f6d5f8e2d20e9d","threadId":"19f6d5f8e2d20e9d","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f7029abc070ec3","threadId":"19f7029abc070ec3","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f7285e528f1bdd","threadId":"19f7285e528f1bdd","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f7550052e814d8","threadId":"19f7550052e814d8","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f77ac43b6b2a15","threadId":"19f77ac43b6b2a15","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f7a7663ac78b6c","threadId":"19f7a7663ac78b6c","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f7cd299faf6ebf","threadId":"19f7cd299faf6ebf","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f7f9cb6fe084ab","threadId":"19f7f9cb6fe084ab","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f81f8ff394058e","threadId":"19f81f8ff394058e","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f84c32763615fa","threadId":"19f84c32763615fa","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f871f5bfabc783","threadId":"19f871f5bfabc783","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f89e96ef3d490c","threadId":"19f89e96ef3d490c","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f8c45bbd38ff28","threadId":"19f8c45bbd38ff28","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f8f0fcb301616b","threadId":"19f8f0fcb301616b","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f916c0dce8a461","threadId":"19f916c0dce8a461","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f943632afbeb4e","threadId":"19f943632afbeb4e","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f96926b3a08993","threadId":"19f96926b3a08993","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f995c90028d79a","threadId":"19f995c90028d79a","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f9bb8c6ec11752","threadId":"19f9bb8c6ec11752","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19f9e82df7fa27e3","threadId":"19f9e82df7fa27e3","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Evening)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19fa0df1a7ec3ac4","threadId":"19fa0df1a7ec3ac4","account":"steve-office","source":"node","inThread":false}
-Sent "GovArbitrage — Top 10 Opportunities (Morning)" to steve@designerwallcoverings.com: {"success":true,"messageId":"19fa3a94a413179b","threadId":"19fa3a94a413179b","account":"steve-office","source":"node","inThread":false}
diff --git a/govarbitrage/logs/govdeals-free.log b/govarbitrage/logs/govdeals-free.log
deleted file mode 100644
index 64198a3..0000000
--- a/govarbitrage/logs/govdeals-free.log
+++ /dev/null
@@ -1,71 +0,0 @@
-[2026-07-10T11:40:05.432Z] Fetching 120 newest GovDeals listings (FREE maestro API)…
-Fetched 120 listings. Ingesting…
-Done: 5 created, 115 updated, 0 failed. Cost: $0 (free API).
-[2026-07-11T11:40:04.798Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-11T11:40:08.223Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-11T11:40:10.713Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 203, 191 created, 12 updated, 0 failed. Cost: $0 (free API).
-[2026-07-12T11:40:00.659Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-12T11:40:06.089Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-12T11:40:06.522Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 121, 113 created, 8 updated, 0 failed. Cost: $0 (free API).
-[2026-07-13T11:40:05.287Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-13T11:40:07.681Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-13T11:40:08.987Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 160, 159 created, 1 updated, 0 failed. Cost: $0 (free API).
-[2026-07-14T11:40:04.589Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-14T11:40:06.982Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-14T11:40:07.961Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 234, 234 created, 0 updated, 0 failed. Cost: $0 (free API).
-[2026-07-15T11:40:06.504Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-15T11:40:08.579Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-15T11:40:09.568Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 182, 182 created, 0 updated, 0 failed. Cost: $0 (free API).
-[2026-07-16T11:40:06.675Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-16T11:40:08.697Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-16T11:40:09.990Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 226, 212 created, 14 updated, 0 failed. Cost: $0 (free API).
-[2026-07-17T11:40:03.437Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-17T11:40:05.617Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-17T11:40:06.743Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 192, 185 created, 7 updated, 0 failed. Cost: $0 (free API).
-[2026-07-18T11:40:01.689Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-18T11:40:03.465Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-18T11:40:05.503Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 183, 159 created, 24 updated, 0 failed. Cost: $0 (free API).
-[2026-07-19T11:40:05.183Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-19T11:40:06.827Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-19T11:40:07.335Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 125, 123 created, 2 updated, 0 failed. Cost: $0 (free API).
-[2026-07-20T11:40:03.118Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-20T11:40:05.232Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-20T11:40:05.471Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 120, 109 created, 11 updated, 0 failed. Cost: $0 (free API).
-[2026-07-21T11:40:05.730Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-21T11:40:11.344Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-21T11:40:14.732Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 240, 201 created, 39 updated, 0 failed. Cost: $0 (free API).
-[2026-07-22T11:40:04.674Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-22T11:40:08.550Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-22T11:40:10.988Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 181, 164 created, 17 updated, 0 failed. Cost: $0 (free API).
-[2026-07-23T11:40:04.901Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-23T11:40:06.853Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-23T11:40:08.404Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 240, 191 created, 49 updated, 0 failed. Cost: $0 (free API).
-[2026-07-24T11:40:05.182Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-24T11:40:06.932Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-24T11:40:09.344Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 202, 194 created, 8 updated, 0 failed. Cost: $0 (free API).
-[2026-07-25T11:40:04.338Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-25T11:40:06.904Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-25T11:40:09.106Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 195, 193 created, 2 updated, 0 failed. Cost: $0 (free API).
-[2026-07-26T11:40:05.002Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-26T11:40:08.216Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-26T11:40:08.435Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 120, 118 created, 2 updated, 0 failed. Cost: $0 (free API).
-[2026-07-27T11:40:03.844Z] Fetching 120 newest GD listings (FREE maestro API)…
-[2026-07-27T11:40:05.818Z] Fetching 60 newest GI listings (FREE maestro API)…
-[2026-07-27T11:40:06.603Z] Fetching 60 newest NI listings (FREE maestro API)…
-Done: fetched 158, 154 created, 4 updated, 0 failed. Cost: $0 (free API).
diff --git a/govarbitrage/logs/gsa-import.log b/govarbitrage/logs/gsa-import.log
deleted file mode 100644
index b6084ed..0000000
--- a/govarbitrage/logs/gsa-import.log
+++ /dev/null
@@ -1,52 +0,0 @@
-Fetching live GSA auctions (limit 200)…
-[import-gsa] ERROR: fetch failed
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 1 created, 199 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 0 created, 200 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 0 created, 200 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 73 created, 127 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 190 created, 10 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 118 created, 82 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 135 created, 65 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 135 created, 65 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 0 created, 200 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 0 created, 200 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 139 created, 61 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 5 created, 195 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-[import-gsa] ERROR: fetch failed
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 81 created, 119 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 116 created, 84 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 0 created, 200 updated, 0 failed.
-Fetching live GSA auctions (limit 200)…
-Fetched 200 listings. Ingesting + scoring…
-Done: 0 created, 200 updated, 0 failed.
diff --git a/govarbitrage/logs/hot-deals.log b/govarbitrage/logs/hot-deals.log
deleted file mode 100644
index 043a546..0000000
--- a/govarbitrage/logs/hot-deals.log
+++ /dev/null
@@ -1,34 +0,0 @@
-[2026-07-10T19:20:02.831Z] No new hot deals. No alert sent.
-[2026-07-11T12:15:02.168Z] No new hot deals. No alert sent.
-[2026-07-11T19:20:05.829Z] No new hot deals. No alert sent.
-[2026-07-12T12:15:05.349Z] No new hot deals. No alert sent.
-[2026-07-12T19:20:02.378Z] No new hot deals. No alert sent.
-[2026-07-13T12:15:03.530Z] No new hot deals. No alert sent.
-[2026-07-13T19:20:05.675Z] No new hot deals. No alert sent.
-[2026-07-14T12:15:05.372Z] No new hot deals. No alert sent.
-[2026-07-14T19:20:05.637Z] No new hot deals. No alert sent.
-[2026-07-15T12:15:06.348Z] No new hot deals. No alert sent.
-[2026-07-15T19:20:06.361Z] No new hot deals. No alert sent.
-[2026-07-16T12:15:05.507Z] No new hot deals. No alert sent.
-[2026-07-16T19:20:05.845Z] No new hot deals. No alert sent.
-[2026-07-17T12:15:04.179Z] No new hot deals. No alert sent.
-[2026-07-17T19:20:05.507Z] No new hot deals. No alert sent.
-[2026-07-18T12:15:02.752Z] No new hot deals. No alert sent.
-[2026-07-18T19:20:05.044Z] No new hot deals. No alert sent.
-[2026-07-19T12:15:02.936Z] No new hot deals. No alert sent.
-[2026-07-19T19:20:05.325Z] No new hot deals. No alert sent.
-[2026-07-20T12:15:05.299Z] No new hot deals. No alert sent.
-[2026-07-20T19:20:06.300Z] No new hot deals. No alert sent.
-[2026-07-21T12:15:05.929Z] No new hot deals. No alert sent.
-[2026-07-21T19:20:05.656Z] No new hot deals. No alert sent.
-[2026-07-22T12:15:01.823Z] No new hot deals. No alert sent.
-[2026-07-22T19:20:05.998Z] No new hot deals. No alert sent.
-[2026-07-23T12:15:02.163Z] No new hot deals. No alert sent.
-[2026-07-23T19:20:05.505Z] No new hot deals. No alert sent.
-[2026-07-24T12:15:04.265Z] No new hot deals. No alert sent.
-[2026-07-24T19:20:04.611Z] No new hot deals. No alert sent.
-[2026-07-25T12:15:04.816Z] No new hot deals. No alert sent.
-[2026-07-25T19:20:05.512Z] No new hot deals. No alert sent.
-[2026-07-26T12:15:03.997Z] No new hot deals. No alert sent.
-[2026-07-26T19:20:04.628Z] No new hot deals. No alert sent.
-[2026-07-27T12:15:03.841Z] No new hot deals. No alert sent.
diff --git a/govarbitrage/logs/liveness.log b/govarbitrage/logs/liveness.log
deleted file mode 100644
index 6824988..0000000
--- a/govarbitrage/logs/liveness.log
+++ /dev/null
@@ -1,7346 +0,0 @@
-[2026-07-10T19:08:46.151Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9984ms). Cost: $0.
-[2026-07-10T19:23:56.676Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10005ms). Cost: $0.
-[2026-07-10T19:39:07.441Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-07-10T19:54:18.428Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10343ms). Cost: $0.
-[2026-07-10T20:09:29.284Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10290ms). Cost: $0.
-[2026-07-10T20:24:40.040Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10163ms). Cost: $0.
-[2026-07-10T20:39:50.639Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-07-10T20:55:01.791Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10570ms). Cost: $0.
-[2026-07-10T21:10:12.773Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10416ms). Cost: $0.
-[2026-07-10T21:25:23.439Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10086ms). Cost: $0.
-[2026-07-10T21:40:34.364Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10356ms). Cost: $0.
-[2026-07-10T21:55:45.271Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10320ms). Cost: $0.
-[2026-07-10T22:10:56.100Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10216ms). Cost: $0.
-[2026-07-10T22:26:07.098Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10417ms). Cost: $0.
-[2026-07-10T22:41:17.694Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10059ms). Cost: $0.
-[2026-07-10T22:56:28.347Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10139ms). Cost: $0.
-[2026-07-10T23:11:39.352Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10468ms). Cost: $0.
-[2026-07-10T23:26:50.043Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-07-10T23:42:00.855Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10258ms). Cost: $0.
-[2026-07-10T23:57:11.563Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-07-11T00:12:22.711Z] liveness: tier1 expired=45, tier2 checked=40 removed=0 (10326ms). Cost: $0.
-[2026-07-11T00:27:33.700Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10378ms). Cost: $0.
-[2026-07-11T00:42:44.681Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10344ms). Cost: $0.
-[2026-07-11T00:57:55.131Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-07-11T01:13:06.054Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10546ms). Cost: $0.
-[2026-07-11T01:28:16.435Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-07-11T01:43:26.980Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10180ms). Cost: $0.
-[2026-07-11T01:58:37.743Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10418ms). Cost: $0.
-[2026-07-11T02:13:48.199Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-07-11T02:28:59.019Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10438ms). Cost: $0.
-[2026-07-11T02:44:09.779Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10260ms). Cost: $0.
-[2026-07-11T02:59:20.479Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10329ms). Cost: $0.
-[2026-07-11T03:14:31.582Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10748ms). Cost: $0.
-[2026-07-11T03:29:42.645Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10668ms). Cost: $0.
-[2026-07-11T03:44:52.999Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-07-11T04:00:03.473Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10100ms). Cost: $0.
-[2026-07-11T04:15:14.606Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10759ms). Cost: $0.
-[2026-07-11T04:30:25.326Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10185ms). Cost: $0.
-[2026-07-11T04:45:36.154Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10363ms). Cost: $0.
-[2026-07-11T05:00:46.607Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-07-11T05:15:57.123Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-07-11T05:31:07.513Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-07-11T05:46:18.476Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-07-11T06:01:29.035Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10187ms). Cost: $0.
-[2026-07-11T06:16:39.816Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10416ms). Cost: $0.
-[2026-07-11T06:31:50.799Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10414ms). Cost: $0.
-[2026-07-11T06:47:02.093Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10757ms). Cost: $0.
-[2026-07-11T07:02:12.823Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10262ms). Cost: $0.
-[2026-07-11T07:17:23.531Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10350ms). Cost: $0.
-[2026-07-11T07:32:34.594Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10712ms). Cost: $0.
-[2026-07-11T07:47:45.030Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10036ms). Cost: $0.
-[2026-07-11T08:02:55.403Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10012ms). Cost: $0.
-[2026-07-11T08:18:05.788Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-07-11T08:33:16.309Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10163ms). Cost: $0.
-[2026-07-11T08:48:26.817Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10149ms). Cost: $0.
-[2026-07-11T09:03:37.163Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-07-11T09:18:47.827Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10362ms). Cost: $0.
-[2026-07-11T09:33:58.253Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-07-11T09:49:09.038Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10175ms). Cost: $0.
-[2026-07-11T10:04:19.421Z] liveness: tier1 expired=36, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-07-11T10:19:30.122Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10394ms). Cost: $0.
-[2026-07-11T10:34:40.534Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10040ms). Cost: $0.
-[2026-07-11T10:49:50.854Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-07-11T11:05:01.330Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-07-11T11:20:12.079Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10378ms). Cost: $0.
-[2026-07-11T11:35:22.497Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-07-11T11:50:32.934Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-07-11T12:05:43.525Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10167ms). Cost: $0.
-[2026-07-11T12:20:53.988Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10103ms). Cost: $0.
-[2026-07-11T12:36:04.843Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10498ms). Cost: $0.
-[2026-07-11T12:51:15.138Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9930ms). Cost: $0.
-[2026-07-11T13:06:25.556Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-07-11T13:21:36.172Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10264ms). Cost: $0.
-[2026-07-11T13:36:46.946Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10386ms). Cost: $0.
-[2026-07-11T13:51:57.978Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10436ms). Cost: $0.
-[2026-07-11T14:07:08.354Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10035ms). Cost: $0.
-[2026-07-11T14:22:18.790Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-07-11T14:37:29.549Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10406ms). Cost: $0.
-[2026-07-11T14:52:40.327Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10228ms). Cost: $0.
-[2026-07-11T15:07:51.069Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10162ms). Cost: $0.
-[2026-07-11T15:23:03.776Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (12063ms). Cost: $0.
-[2026-07-11T15:38:14.058Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9924ms). Cost: $0.
-[2026-07-11T15:53:24.756Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10270ms). Cost: $0.
-[2026-07-11T16:08:35.510Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10300ms). Cost: $0.
-[2026-07-11T16:23:46.457Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10446ms). Cost: $0.
-[2026-07-11T16:38:57.222Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10388ms). Cost: $0.
-[2026-07-11T16:54:07.760Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-07-11T17:09:18.367Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10222ms). Cost: $0.
-[2026-07-11T17:24:29.198Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10372ms). Cost: $0.
-[2026-07-11T17:39:39.707Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-07-11T17:54:50.963Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10699ms). Cost: $0.
-[2026-07-11T18:10:01.514Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10195ms). Cost: $0.
-[2026-07-11T18:25:12.470Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10580ms). Cost: $0.
-[2026-07-11T18:40:23.131Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10214ms). Cost: $0.
-[2026-07-11T18:55:33.973Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10342ms). Cost: $0.
-[2026-07-11T19:10:44.828Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (10321ms). Cost: $0.
-[2026-07-11T19:25:55.360Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10189ms). Cost: $0.
-[2026-07-11T19:41:05.838Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-07-11T19:56:16.455Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10124ms). Cost: $0.
-[2026-07-11T20:11:27.419Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10341ms). Cost: $0.
-[2026-07-11T20:26:38.188Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10330ms). Cost: $0.
-[2026-07-11T20:41:48.872Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10334ms). Cost: $0.
-[2026-07-11T20:56:59.399Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10147ms). Cost: $0.
-[2026-07-11T21:12:10.058Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10345ms). Cost: $0.
-[2026-07-11T21:27:20.654Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10144ms). Cost: $0.
-[2026-07-11T21:42:31.487Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10343ms). Cost: $0.
-[2026-07-11T21:57:42.189Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10141ms). Cost: $0.
-[2026-07-11T22:12:52.575Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-07-11T22:28:03.044Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10102ms). Cost: $0.
-[2026-07-11T22:43:13.578Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10211ms). Cost: $0.
-[2026-07-11T22:58:24.357Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10326ms). Cost: $0.
-[2026-07-11T23:13:34.814Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-07-11T23:28:46.089Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10729ms). Cost: $0.
-[2026-07-11T23:43:56.762Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10251ms). Cost: $0.
-[2026-07-11T23:59:07.465Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10289ms). Cost: $0.
-[2026-07-12T00:14:18.539Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10710ms). Cost: $0.
-[2026-07-12T00:29:29.525Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10566ms). Cost: $0.
-[2026-07-12T00:44:40.219Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10164ms). Cost: $0.
-[2026-07-12T00:59:50.644Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-07-12T01:15:01.290Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10117ms). Cost: $0.
-[2026-07-12T01:30:11.945Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10285ms). Cost: $0.
-[2026-07-12T01:45:22.581Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10277ms). Cost: $0.
-[2026-07-12T02:00:33.186Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-07-12T02:15:43.793Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10119ms). Cost: $0.
-[2026-07-12T02:30:54.374Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10064ms). Cost: $0.
-[2026-07-12T02:46:05.512Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10688ms). Cost: $0.
-[2026-07-12T03:01:16.579Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10678ms). Cost: $0.
-[2026-07-12T03:16:27.099Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10116ms). Cost: $0.
-[2026-07-12T03:31:37.872Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10201ms). Cost: $0.
-[2026-07-12T03:46:48.414Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10215ms). Cost: $0.
-[2026-07-12T04:01:59.210Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10408ms). Cost: $0.
-[2026-07-12T04:17:09.870Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10269ms). Cost: $0.
-[2026-07-12T04:32:21.119Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10680ms). Cost: $0.
-[2026-07-12T04:47:31.707Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10240ms). Cost: $0.
-[2026-07-12T05:02:42.281Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10175ms). Cost: $0.
-[2026-07-12T05:17:52.587Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9954ms). Cost: $0.
-[2026-07-12T05:33:03.681Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10750ms). Cost: $0.
-[2026-07-12T05:48:14.444Z] liveness: tier1 expired=32, tier2 checked=40 removed=0 (10264ms). Cost: $0.
-[2026-07-12T06:03:25.238Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10227ms). Cost: $0.
-[2026-07-12T06:18:36.248Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10655ms). Cost: $0.
-[2026-07-12T06:33:47.041Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10413ms). Cost: $0.
-[2026-07-12T06:48:57.489Z] liveness: tier1 expired=34, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-07-12T07:04:08.573Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10572ms). Cost: $0.
-[2026-07-12T07:19:19.656Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10722ms). Cost: $0.
-[2026-07-12T07:34:30.420Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10382ms). Cost: $0.
-[2026-07-12T07:49:41.674Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10735ms). Cost: $0.
-[2026-07-12T08:04:52.216Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10181ms). Cost: $0.
-[2026-07-12T08:20:02.809Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10207ms). Cost: $0.
-[2026-07-12T08:35:13.254Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-07-12T08:50:24.015Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-07-12T09:05:34.767Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10382ms). Cost: $0.
-[2026-07-12T09:20:45.648Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10523ms). Cost: $0.
-[2026-07-12T09:35:56.022Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-07-12T09:51:06.762Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10169ms). Cost: $0.
-[2026-07-12T10:06:17.318Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10189ms). Cost: $0.
-[2026-07-12T10:21:27.981Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10366ms). Cost: $0.
-[2026-07-12T10:36:38.441Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-07-12T10:51:48.929Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10131ms). Cost: $0.
-[2026-07-12T11:06:59.407Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10109ms). Cost: $0.
-[2026-07-12T11:22:09.815Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-07-12T11:37:20.372Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10201ms). Cost: $0.
-[2026-07-12T11:52:30.917Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10097ms). Cost: $0.
-[2026-07-12T12:07:41.391Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-07-12T12:22:51.772Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-07-12T12:38:02.151Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-07-12T12:53:13.263Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10725ms). Cost: $0.
-[2026-07-12T13:08:23.719Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-07-12T13:23:34.733Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10647ms). Cost: $0.
-[2026-07-12T13:38:45.191Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-07-12T13:53:55.988Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10247ms). Cost: $0.
-[2026-07-12T14:09:06.879Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10455ms). Cost: $0.
-[2026-07-12T14:24:17.551Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10299ms). Cost: $0.
-[2026-07-12T14:39:28.202Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10278ms). Cost: $0.
-[2026-07-12T14:54:39.283Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10466ms). Cost: $0.
-[2026-07-12T15:09:49.952Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10204ms). Cost: $0.
-[2026-07-12T15:25:00.620Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-07-12T15:40:11.066Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9966ms). Cost: $0.
-[2026-07-12T15:55:22.528Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10183ms). Cost: $0.
-[2026-07-12T16:10:33.278Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10158ms). Cost: $0.
-[2026-07-12T16:25:44.093Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10222ms). Cost: $0.
-[2026-07-12T16:40:55.754Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10102ms). Cost: $0.
-[2026-07-12T16:56:07.062Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10322ms). Cost: $0.
-[2026-07-12T17:11:19.411Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10568ms). Cost: $0.
-[2026-07-12T17:26:30.477Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10588ms). Cost: $0.
-[2026-07-12T17:41:41.428Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10277ms). Cost: $0.
-[2026-07-12T17:56:52.995Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10452ms). Cost: $0.
-[2026-07-12T18:12:03.818Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10194ms). Cost: $0.
-[2026-07-12T18:27:14.426Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10237ms). Cost: $0.
-[2026-07-12T18:42:25.943Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10899ms). Cost: $0.
-[2026-07-12T18:57:37.113Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10458ms). Cost: $0.
-[2026-07-12T19:12:47.772Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10283ms). Cost: $0.
-[2026-07-12T19:27:58.365Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-07-12T19:43:09.295Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10579ms). Cost: $0.
-[2026-07-12T19:58:20.320Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10674ms). Cost: $0.
-[2026-07-12T20:13:30.971Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10042ms). Cost: $0.
-[2026-07-12T20:28:41.719Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10178ms). Cost: $0.
-[2026-07-12T20:43:52.933Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10530ms). Cost: $0.
-[2026-07-12T20:59:03.492Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10137ms). Cost: $0.
-[2026-07-12T21:14:14.464Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10528ms). Cost: $0.
-[2026-07-12T21:29:24.915Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-07-12T21:44:35.458Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-07-12T21:59:46.192Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10167ms). Cost: $0.
-[2026-07-12T22:14:56.676Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-07-12T22:30:07.816Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10570ms). Cost: $0.
-[2026-07-12T22:45:20.638Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10765ms). Cost: $0.
-[2026-07-12T23:00:31.232Z] liveness: tier1 expired=93, tier2 checked=40 removed=0 (10233ms). Cost: $0.
-[2026-07-12T23:15:41.716Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-07-12T23:30:52.377Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10142ms). Cost: $0.
-[2026-07-12T23:46:03.153Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10252ms). Cost: $0.
-[2026-07-13T00:01:13.958Z] liveness: tier1 expired=74, tier2 checked=40 removed=0 (10482ms). Cost: $0.
-[2026-07-13T00:16:24.605Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10298ms). Cost: $0.
-[2026-07-13T00:31:35.885Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10699ms). Cost: $0.
-[2026-07-13T00:46:46.893Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10310ms). Cost: $0.
-[2026-07-13T01:02:00.449Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10554ms). Cost: $0.
-[2026-07-13T01:17:12.877Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (12035ms). Cost: $0.
-[2026-07-13T01:32:23.375Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-07-13T01:47:33.793Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-07-13T02:02:44.421Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-07-13T02:17:54.950Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10181ms). Cost: $0.
-[2026-07-13T02:33:05.471Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10085ms). Cost: $0.
-[2026-07-13T02:48:15.944Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10125ms). Cost: $0.
-[2026-07-13T03:03:28.588Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (12233ms). Cost: $0.
-[2026-07-13T03:18:39.104Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10124ms). Cost: $0.
-[2026-07-13T03:33:49.743Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-07-13T03:49:00.269Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-07-13T04:04:10.849Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10172ms). Cost: $0.
-[2026-07-13T04:19:21.547Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10345ms). Cost: $0.
-[2026-07-13T04:34:32.680Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10767ms). Cost: $0.
-[2026-07-13T04:49:43.437Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10177ms). Cost: $0.
-[2026-07-13T05:04:54.039Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10217ms). Cost: $0.
-[2026-07-13T05:20:04.967Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10521ms). Cost: $0.
-[2026-07-13T05:35:15.373Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10067ms). Cost: $0.
-[2026-07-13T05:50:26.676Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10378ms). Cost: $0.
-[2026-07-13T06:05:41.836Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10873ms). Cost: $0.
-[2026-07-13T06:20:53.683Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10131ms). Cost: $0.
-[2026-07-13T06:36:07.391Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10314ms). Cost: $0.
-[2026-07-13T06:51:19.330Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10633ms). Cost: $0.
-[2026-07-13T07:06:30.474Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10322ms). Cost: $0.
-[2026-07-13T07:21:41.473Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10400ms). Cost: $0.
-[2026-07-13T07:36:52.044Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10100ms). Cost: $0.
-[2026-07-13T07:52:03.094Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10294ms). Cost: $0.
-[2026-07-13T08:07:14.158Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10655ms). Cost: $0.
-[2026-07-13T08:22:25.334Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10438ms). Cost: $0.
-[2026-07-13T08:37:35.876Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10212ms). Cost: $0.
-[2026-07-13T08:52:46.606Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10097ms). Cost: $0.
-[2026-07-13T09:07:57.405Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10401ms). Cost: $0.
-[2026-07-13T09:23:07.904Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10120ms). Cost: $0.
-[2026-07-13T09:38:18.338Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-07-13T09:53:29.122Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10388ms). Cost: $0.
-[2026-07-13T10:08:39.693Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10205ms). Cost: $0.
-[2026-07-13T10:23:50.260Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10193ms). Cost: $0.
-[2026-07-13T10:39:00.650Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10079ms). Cost: $0.
-[2026-07-13T10:54:11.540Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10447ms). Cost: $0.
-[2026-07-13T11:09:22.190Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10232ms). Cost: $0.
-[2026-07-13T11:24:32.660Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-07-13T11:39:43.303Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10227ms). Cost: $0.
-[2026-07-13T11:54:53.792Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10111ms). Cost: $0.
-[2026-07-13T12:10:04.536Z] liveness: tier1 expired=73, tier2 checked=40 removed=0 (10370ms). Cost: $0.
-[2026-07-13T12:25:15.025Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10109ms). Cost: $0.
-[2026-07-13T12:40:25.459Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-07-13T12:55:36.691Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10670ms). Cost: $0.
-[2026-07-13T13:10:47.037Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-07-13T13:25:58.001Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10461ms). Cost: $0.
-[2026-07-13T13:41:08.807Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10186ms). Cost: $0.
-[2026-07-13T13:56:19.546Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10364ms). Cost: $0.
-[2026-07-13T14:11:30.742Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10760ms). Cost: $0.
-[2026-07-13T14:26:41.124Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-07-13T14:41:52.000Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10528ms). Cost: $0.
-[2026-07-13T14:57:02.798Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10238ms). Cost: $0.
-[2026-07-13T15:12:13.561Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-07-13T15:27:24.425Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10248ms). Cost: $0.
-[2026-07-13T15:42:35.375Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10393ms). Cost: $0.
-[2026-07-13T15:57:46.033Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-07-13T16:12:57.324Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10662ms). Cost: $0.
-[2026-07-13T16:28:08.314Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10388ms). Cost: $0.
-[2026-07-13T16:43:19.121Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10206ms). Cost: $0.
-[2026-07-13T16:58:29.754Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-07-13T17:13:40.495Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10100ms). Cost: $0.
-[2026-07-13T17:28:51.155Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-07-13T17:44:02.071Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10336ms). Cost: $0.
-[2026-07-13T17:59:13.508Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (11032ms). Cost: $0.
-[2026-07-13T18:14:24.575Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10441ms). Cost: $0.
-[2026-07-13T18:29:35.375Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10370ms). Cost: $0.
-[2026-07-13T18:44:46.180Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10364ms). Cost: $0.
-[2026-07-13T18:59:56.765Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10134ms). Cost: $0.
-[2026-07-13T19:15:07.589Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10229ms). Cost: $0.
-[2026-07-13T19:30:18.024Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10005ms). Cost: $0.
-[2026-07-13T19:45:28.421Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-07-13T20:00:39.147Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10349ms). Cost: $0.
-[2026-07-13T20:15:49.637Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-07-13T20:31:00.948Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10906ms). Cost: $0.
-[2026-07-13T20:46:11.642Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10300ms). Cost: $0.
-[2026-07-13T21:01:22.071Z] liveness: tier1 expired=23, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-07-13T21:16:33.211Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10755ms). Cost: $0.
-[2026-07-13T21:31:43.838Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10077ms). Cost: $0.
-[2026-07-13T21:46:54.755Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10283ms). Cost: $0.
-[2026-07-13T22:02:12.117Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (13817ms). Cost: $0.
-[2026-07-13T22:17:22.904Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10002ms). Cost: $0.
-[2026-07-13T22:32:33.491Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-07-13T22:47:44.296Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10386ms). Cost: $0.
-[2026-07-13T23:02:55.199Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10452ms). Cost: $0.
-[2026-07-13T23:18:05.765Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10146ms). Cost: $0.
-[2026-07-13T23:33:16.807Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10434ms). Cost: $0.
-[2026-07-13T23:48:27.242Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-07-14T00:03:37.758Z] liveness: tier1 expired=125, tier2 checked=40 removed=0 (10132ms). Cost: $0.
-[2026-07-14T00:18:48.708Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10573ms). Cost: $0.
-[2026-07-14T00:33:59.191Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-07-14T00:49:09.795Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10087ms). Cost: $0.
-[2026-07-14T01:04:20.194Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10040ms). Cost: $0.
-[2026-07-14T01:19:30.710Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-07-14T01:34:43.245Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (12116ms). Cost: $0.
-[2026-07-14T01:49:53.840Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10232ms). Cost: $0.
-[2026-07-14T02:05:04.250Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10040ms). Cost: $0.
-[2026-07-14T02:20:15.106Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10475ms). Cost: $0.
-[2026-07-14T02:35:25.996Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10491ms). Cost: $0.
-[2026-07-14T02:50:36.858Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10524ms). Cost: $0.
-[2026-07-14T03:05:47.320Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-07-14T03:20:57.849Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10149ms). Cost: $0.
-[2026-07-14T03:36:08.671Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10421ms). Cost: $0.
-[2026-07-14T03:51:19.425Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10356ms). Cost: $0.
-[2026-07-14T04:06:30.061Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10275ms). Cost: $0.
-[2026-07-14T04:21:40.911Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10443ms). Cost: $0.
-[2026-07-14T04:36:51.412Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-07-14T04:52:02.184Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10433ms). Cost: $0.
-[2026-07-14T05:07:12.703Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10135ms). Cost: $0.
-[2026-07-14T05:22:23.525Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10437ms). Cost: $0.
-[2026-07-14T05:37:34.074Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10141ms). Cost: $0.
-[2026-07-14T05:52:44.668Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10201ms). Cost: $0.
-[2026-07-14T06:07:55.562Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10513ms). Cost: $0.
-[2026-07-14T06:23:06.218Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-07-14T06:38:16.623Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-07-14T06:53:27.062Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-07-14T07:08:37.643Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10204ms). Cost: $0.
-[2026-07-14T07:23:48.249Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10239ms). Cost: $0.
-[2026-07-14T07:38:58.747Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10080ms). Cost: $0.
-[2026-07-14T07:54:09.200Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-07-14T08:09:20.100Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10499ms). Cost: $0.
-[2026-07-14T08:24:30.551Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10093ms). Cost: $0.
-[2026-07-14T08:39:41.040Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-07-14T08:54:51.492Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-07-14T09:10:02.131Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10241ms). Cost: $0.
-[2026-07-14T09:25:12.571Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10057ms). Cost: $0.
-[2026-07-14T09:40:23.093Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10149ms). Cost: $0.
-[2026-07-14T09:55:33.514Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-07-14T10:10:43.954Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-07-14T10:25:54.521Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10236ms). Cost: $0.
-[2026-07-14T10:41:04.955Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9958ms). Cost: $0.
-[2026-07-14T10:56:15.374Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10073ms). Cost: $0.
-[2026-07-14T11:11:26.196Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10467ms). Cost: $0.
-[2026-07-14T11:26:36.843Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10240ms). Cost: $0.
-[2026-07-14T11:41:47.437Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10242ms). Cost: $0.
-[2026-07-14T11:56:58.117Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10314ms). Cost: $0.
-[2026-07-14T12:12:08.549Z] liveness: tier1 expired=190, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-07-14T12:27:18.916Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-07-14T12:42:29.338Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-07-14T12:57:40.119Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10452ms). Cost: $0.
-[2026-07-14T13:12:50.567Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10093ms). Cost: $0.
-[2026-07-14T13:28:01.260Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10302ms). Cost: $0.
-[2026-07-14T13:43:11.762Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10093ms). Cost: $0.
-[2026-07-14T13:58:22.274Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-07-14T14:13:32.794Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-07-14T14:28:43.257Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10067ms). Cost: $0.
-[2026-07-14T14:43:54.401Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10752ms). Cost: $0.
-[2026-07-14T14:59:05.018Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10208ms). Cost: $0.
-[2026-07-14T15:14:15.524Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-07-14T15:29:26.193Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10278ms). Cost: $0.
-[2026-07-14T15:44:36.758Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-07-14T15:59:47.429Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10156ms). Cost: $0.
-[2026-07-14T16:14:58.509Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10662ms). Cost: $0.
-[2026-07-14T16:30:08.934Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10058ms). Cost: $0.
-[2026-07-14T16:45:19.525Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10203ms). Cost: $0.
-[2026-07-14T17:00:29.959Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10033ms). Cost: $0.
-[2026-07-14T17:15:40.475Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-07-14T17:30:50.928Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-07-14T17:46:01.392Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10085ms). Cost: $0.
-[2026-07-14T18:01:12.092Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-07-14T18:16:22.536Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-07-14T18:31:33.658Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10285ms). Cost: $0.
-[2026-07-14T18:46:44.206Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10143ms). Cost: $0.
-[2026-07-14T19:01:54.674Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-07-14T19:17:05.120Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10018ms). Cost: $0.
-[2026-07-14T19:32:16.965Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10200ms). Cost: $0.
-[2026-07-14T19:47:27.450Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-07-14T20:02:38.399Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10565ms). Cost: $0.
-[2026-07-14T20:17:48.814Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-07-14T20:32:59.196Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-07-14T20:48:10.225Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10557ms). Cost: $0.
-[2026-07-14T21:03:20.648Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10017ms). Cost: $0.
-[2026-07-14T21:18:31.102Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-07-14T21:33:42.023Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10202ms). Cost: $0.
-[2026-07-14T21:48:52.669Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10234ms). Cost: $0.
-[2026-07-14T22:04:03.504Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10445ms). Cost: $0.
-[2026-07-14T22:19:13.945Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-07-14T22:34:24.304Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10017ms). Cost: $0.
-[2026-07-14T22:49:36.758Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10620ms). Cost: $0.
-[2026-07-14T23:04:47.342Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (9991ms). Cost: $0.
-[2026-07-14T23:19:57.876Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10133ms). Cost: $0.
-[2026-07-14T23:35:08.352Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-07-14T23:50:18.881Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10170ms). Cost: $0.
-[2026-07-15T00:05:29.285Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-07-15T00:20:40.631Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10716ms). Cost: $0.
-[2026-07-15T00:35:51.413Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10222ms). Cost: $0.
-[2026-07-15T00:51:02.572Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10775ms). Cost: $0.
-[2026-07-15T01:06:13.564Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10630ms). Cost: $0.
-[2026-07-15T01:21:24.323Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10412ms). Cost: $0.
-[2026-07-15T01:36:35.016Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10350ms). Cost: $0.
-[2026-07-15T01:51:45.568Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-07-15T02:06:56.054Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-07-15T02:22:06.942Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10518ms). Cost: $0.
-[2026-07-15T02:37:17.423Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10123ms). Cost: $0.
-[2026-07-15T02:52:28.130Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10295ms). Cost: $0.
-[2026-07-15T03:07:38.575Z] liveness: tier1 expired=54, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-07-15T03:22:49.531Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10584ms). Cost: $0.
-[2026-07-15T03:38:00.125Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-07-15T03:53:10.698Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10227ms). Cost: $0.
-[2026-07-15T04:08:21.200Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10201ms). Cost: $0.
-[2026-07-15T04:23:31.664Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10090ms). Cost: $0.
-[2026-07-15T04:38:42.379Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-07-15T04:53:53.090Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10337ms). Cost: $0.
-[2026-07-15T05:09:03.882Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10461ms). Cost: $0.
-[2026-07-15T05:24:14.282Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10030ms). Cost: $0.
-[2026-07-15T05:39:24.830Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-07-15T05:54:35.235Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10058ms). Cost: $0.
-[2026-07-15T06:09:45.760Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10135ms). Cost: $0.
-[2026-07-15T06:24:56.252Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-07-15T06:40:06.747Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10123ms). Cost: $0.
-[2026-07-15T06:55:17.734Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10600ms). Cost: $0.
-[2026-07-15T07:10:28.674Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10541ms). Cost: $0.
-[2026-07-15T07:25:39.091Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-07-15T07:40:49.834Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10178ms). Cost: $0.
-[2026-07-15T07:56:01.145Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10919ms). Cost: $0.
-[2026-07-15T08:11:12.332Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10804ms). Cost: $0.
-[2026-07-15T08:26:22.779Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10117ms). Cost: $0.
-[2026-07-15T08:41:33.200Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-07-15T08:56:43.852Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10119ms). Cost: $0.
-[2026-07-15T09:11:54.914Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10699ms). Cost: $0.
-[2026-07-15T09:27:05.621Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10307ms). Cost: $0.
-[2026-07-15T09:42:16.007Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-07-15T09:57:26.460Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10055ms). Cost: $0.
-[2026-07-15T10:12:36.912Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-07-15T10:27:47.258Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-07-15T10:42:57.934Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10369ms). Cost: $0.
-[2026-07-15T10:58:08.318Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-07-15T11:13:19.313Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10410ms). Cost: $0.
-[2026-07-15T11:28:30.225Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10536ms). Cost: $0.
-[2026-07-15T11:43:40.940Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10318ms). Cost: $0.
-[2026-07-15T11:58:52.107Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10816ms). Cost: $0.
-[2026-07-15T12:14:03.004Z] liveness: tier1 expired=118, tier2 checked=40 removed=0 (10496ms). Cost: $0.
-[2026-07-15T12:29:14.122Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10695ms). Cost: $0.
-[2026-07-15T12:44:24.719Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10191ms). Cost: $0.
-[2026-07-15T12:59:35.646Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10239ms). Cost: $0.
-[2026-07-15T13:14:46.578Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10558ms). Cost: $0.
-[2026-07-15T13:29:57.295Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10351ms). Cost: $0.
-[2026-07-15T13:45:07.713Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-07-15T14:00:18.204Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-07-15T14:15:28.628Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10058ms). Cost: $0.
-[2026-07-15T14:30:39.283Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10253ms). Cost: $0.
-[2026-07-15T14:45:50.128Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10457ms). Cost: $0.
-[2026-07-15T15:01:00.763Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10318ms). Cost: $0.
-[2026-07-15T15:16:11.173Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-07-15T15:31:21.641Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-07-15T15:46:32.375Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10345ms). Cost: $0.
-[2026-07-15T16:01:43.073Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10147ms). Cost: $0.
-[2026-07-15T16:16:53.559Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10110ms). Cost: $0.
-[2026-07-15T16:32:04.272Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10064ms). Cost: $0.
-[2026-07-15T16:47:14.824Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10160ms). Cost: $0.
-[2026-07-15T17:02:25.648Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10197ms). Cost: $0.
-[2026-07-15T17:17:36.377Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10134ms). Cost: $0.
-[2026-07-15T17:32:46.939Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-07-15T17:47:57.624Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-07-15T18:03:08.745Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10384ms). Cost: $0.
-[2026-07-15T18:18:20.032Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10014ms). Cost: $0.
-[2026-07-15T18:33:30.796Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10212ms). Cost: $0.
-[2026-07-15T18:48:41.344Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-07-15T19:03:51.762Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10032ms). Cost: $0.
-[2026-07-15T19:19:03.644Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-07-15T19:34:14.199Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-07-15T19:49:24.871Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10029ms). Cost: $0.
-[2026-07-15T20:04:35.811Z] liveness: tier1 expired=23, tier2 checked=40 removed=0 (10271ms). Cost: $0.
-[2026-07-15T20:19:46.791Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10186ms). Cost: $0.
-[2026-07-15T20:34:57.240Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-07-15T20:50:07.928Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-07-15T21:05:20.722Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (12164ms). Cost: $0.
-[2026-07-15T21:20:35.532Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10769ms). Cost: $0.
-[2026-07-15T21:35:50.039Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10862ms). Cost: $0.
-[2026-07-15T21:51:03.089Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10394ms). Cost: $0.
-[2026-07-15T22:06:13.797Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10053ms). Cost: $0.
-[2026-07-15T22:21:24.497Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-07-15T22:36:35.151Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-07-15T22:51:45.592Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-07-15T23:06:55.983Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-07-15T23:22:07.476Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10478ms). Cost: $0.
-[2026-07-15T23:37:18.257Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-07-15T23:52:29.324Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10685ms). Cost: $0.
-[2026-07-16T00:07:39.757Z] liveness: tier1 expired=66, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-07-16T00:22:50.499Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9998ms). Cost: $0.
-[2026-07-16T00:38:01.283Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10119ms). Cost: $0.
-[2026-07-16T00:53:12.049Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10446ms). Cost: $0.
-[2026-07-16T01:08:22.599Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10106ms). Cost: $0.
-[2026-07-16T01:23:33.083Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-07-16T01:38:44.430Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10881ms). Cost: $0.
-[2026-07-16T01:53:55.275Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10402ms). Cost: $0.
-[2026-07-16T02:09:05.714Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-07-16T02:24:16.578Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10484ms). Cost: $0.
-[2026-07-16T02:39:27.167Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-07-16T02:54:37.862Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10256ms). Cost: $0.
-[2026-07-16T03:09:48.359Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-07-16T03:24:58.737Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9962ms). Cost: $0.
-[2026-07-16T03:40:09.699Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10457ms). Cost: $0.
-[2026-07-16T03:55:20.368Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-07-16T04:10:31.009Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10297ms). Cost: $0.
-[2026-07-16T04:25:41.840Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10173ms). Cost: $0.
-[2026-07-16T04:40:53.013Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10593ms). Cost: $0.
-[2026-07-16T04:56:03.694Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10316ms). Cost: $0.
-[2026-07-16T05:11:14.565Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10477ms). Cost: $0.
-[2026-07-16T05:26:24.879Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-07-16T05:41:36.405Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10799ms). Cost: $0.
-[2026-07-16T05:56:47.349Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10528ms). Cost: $0.
-[2026-07-16T06:11:58.013Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10243ms). Cost: $0.
-[2026-07-16T06:27:08.920Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10554ms). Cost: $0.
-[2026-07-16T06:42:19.582Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10348ms). Cost: $0.
-[2026-07-16T06:57:30.087Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-07-16T07:12:40.857Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10305ms). Cost: $0.
-[2026-07-16T07:27:51.918Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10692ms). Cost: $0.
-[2026-07-16T07:43:02.713Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10228ms). Cost: $0.
-[2026-07-16T07:58:13.930Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10652ms). Cost: $0.
-[2026-07-16T08:13:24.813Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10526ms). Cost: $0.
-[2026-07-16T08:28:35.807Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10595ms). Cost: $0.
-[2026-07-16T08:43:46.821Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10452ms). Cost: $0.
-[2026-07-16T08:58:57.208Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-07-16T09:14:07.586Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10017ms). Cost: $0.
-[2026-07-16T09:29:18.212Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10281ms). Cost: $0.
-[2026-07-16T09:44:28.618Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-07-16T09:59:39.513Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10506ms). Cost: $0.
-[2026-07-16T10:14:50.138Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-07-16T10:30:00.743Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10254ms). Cost: $0.
-[2026-07-16T10:45:11.604Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10508ms). Cost: $0.
-[2026-07-16T11:00:21.995Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-07-16T11:15:32.759Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10347ms). Cost: $0.
-[2026-07-16T11:30:43.150Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10019ms). Cost: $0.
-[2026-07-16T11:45:54.061Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10320ms). Cost: $0.
-[2026-07-16T12:01:04.626Z] liveness: tier1 expired=135, tier2 checked=40 removed=0 (10208ms). Cost: $0.
-[2026-07-16T12:16:15.333Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10383ms). Cost: $0.
-[2026-07-16T12:31:26.179Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10300ms). Cost: $0.
-[2026-07-16T12:46:37.438Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10641ms). Cost: $0.
-[2026-07-16T13:01:47.852Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10064ms). Cost: $0.
-[2026-07-16T13:16:58.477Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-07-16T13:32:08.869Z] liveness: tier1 expired=26, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-07-16T13:47:19.425Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10197ms). Cost: $0.
-[2026-07-16T14:02:29.777Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-07-16T14:17:40.403Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-07-16T14:32:51.047Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10008ms). Cost: $0.
-[2026-07-16T14:48:01.711Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10042ms). Cost: $0.
-[2026-07-16T15:03:12.467Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-07-16T15:18:23.057Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-07-16T15:33:33.429Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-07-16T15:48:44.114Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-07-16T16:03:54.932Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10183ms). Cost: $0.
-[2026-07-16T16:19:05.511Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9977ms). Cost: $0.
-[2026-07-16T16:34:16.078Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10005ms). Cost: $0.
-[2026-07-16T16:49:27.171Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10488ms). Cost: $0.
-[2026-07-16T17:04:37.888Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10135ms). Cost: $0.
-[2026-07-16T17:19:49.029Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10516ms). Cost: $0.
-[2026-07-16T17:34:59.968Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10358ms). Cost: $0.
-[2026-07-16T17:50:10.543Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10131ms). Cost: $0.
-[2026-07-16T18:05:21.286Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10106ms). Cost: $0.
-[2026-07-16T18:20:32.281Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10233ms). Cost: $0.
-[2026-07-16T18:35:43.407Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10392ms). Cost: $0.
-[2026-07-16T18:50:54.320Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10237ms). Cost: $0.
-[2026-07-16T19:06:05.436Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10699ms). Cost: $0.
-[2026-07-16T19:21:15.901Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-07-16T19:36:26.338Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-07-16T19:51:37.287Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10409ms). Cost: $0.
-[2026-07-16T20:06:47.997Z] liveness: tier1 expired=74, tier2 checked=40 removed=0 (10149ms). Cost: $0.
-[2026-07-16T20:21:58.412Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10009ms). Cost: $0.
-[2026-07-16T20:37:09.016Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10204ms). Cost: $0.
-[2026-07-16T20:52:19.543Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-07-16T21:07:30.049Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10150ms). Cost: $0.
-[2026-07-16T21:22:40.428Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-07-16T21:37:50.842Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-07-16T21:53:01.431Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10193ms). Cost: $0.
-[2026-07-16T22:08:12.329Z] liveness: tier1 expired=42, tier2 checked=40 removed=0 (10563ms). Cost: $0.
-[2026-07-16T22:23:23.183Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10512ms). Cost: $0.
-[2026-07-16T22:38:34.052Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10505ms). Cost: $0.
-[2026-07-16T22:53:44.793Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10132ms). Cost: $0.
-[2026-07-16T23:08:55.678Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10302ms). Cost: $0.
-[2026-07-16T23:24:06.422Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10167ms). Cost: $0.
-[2026-07-16T23:39:17.373Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10483ms). Cost: $0.
-[2026-07-16T23:54:28.651Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10703ms). Cost: $0.
-[2026-07-17T00:09:39.133Z] liveness: tier1 expired=63, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-07-17T00:24:49.907Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10317ms). Cost: $0.
-[2026-07-17T00:40:00.695Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10107ms). Cost: $0.
-[2026-07-17T00:55:11.521Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10207ms). Cost: $0.
-[2026-07-17T01:10:22.655Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10559ms). Cost: $0.
-[2026-07-17T01:25:33.402Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10159ms). Cost: $0.
-[2026-07-17T01:40:43.804Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10053ms). Cost: $0.
-[2026-07-17T01:55:54.971Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10659ms). Cost: $0.
-[2026-07-17T02:11:05.560Z] liveness: tier1 expired=25, tier2 checked=40 removed=0 (10210ms). Cost: $0.
-[2026-07-17T02:26:15.984Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-07-17T02:41:26.926Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10352ms). Cost: $0.
-[2026-07-17T02:56:37.604Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10137ms). Cost: $0.
-[2026-07-17T03:11:48.671Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10499ms). Cost: $0.
-[2026-07-17T03:26:59.715Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10421ms). Cost: $0.
-[2026-07-17T03:42:10.880Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10594ms). Cost: $0.
-[2026-07-17T03:57:21.671Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10220ms). Cost: $0.
-[2026-07-17T04:12:32.096Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10066ms). Cost: $0.
-[2026-07-17T04:27:42.609Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10150ms). Cost: $0.
-[2026-07-17T04:42:53.013Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9987ms). Cost: $0.
-[2026-07-17T04:58:03.468Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-07-17T05:13:13.799Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9976ms). Cost: $0.
-[2026-07-17T05:28:24.297Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10135ms). Cost: $0.
-[2026-07-17T05:43:35.033Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10210ms). Cost: $0.
-[2026-07-17T05:58:45.883Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10452ms). Cost: $0.
-[2026-07-17T06:13:56.796Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10561ms). Cost: $0.
-[2026-07-17T06:29:07.360Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10222ms). Cost: $0.
-[2026-07-17T06:44:18.155Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10144ms). Cost: $0.
-[2026-07-17T06:59:28.892Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-07-17T07:14:39.847Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10407ms). Cost: $0.
-[2026-07-17T07:30:32.322Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (51968ms). Cost: $0.
-[2026-07-17T07:45:43.508Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10564ms). Cost: $0.
-[2026-07-17T08:00:54.187Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10106ms). Cost: $0.
-[2026-07-17T08:16:04.621Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-07-17T08:31:15.293Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10309ms). Cost: $0.
-[2026-07-17T08:46:25.764Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-07-17T09:01:36.874Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10736ms). Cost: $0.
-[2026-07-17T09:16:47.481Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10243ms). Cost: $0.
-[2026-07-17T09:31:57.908Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-07-17T09:47:08.901Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10559ms). Cost: $0.
-[2026-07-17T10:02:19.390Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10111ms). Cost: $0.
-[2026-07-17T10:17:29.823Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10041ms). Cost: $0.
-[2026-07-17T10:32:40.405Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10220ms). Cost: $0.
-[2026-07-17T10:47:50.977Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10200ms). Cost: $0.
-[2026-07-17T11:03:01.430Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10097ms). Cost: $0.
-[2026-07-17T11:18:12.075Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-07-17T11:33:22.482Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9970ms). Cost: $0.
-[2026-07-17T11:48:33.241Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-07-17T12:03:43.507Z] liveness: tier1 expired=137, tier2 checked=40 removed=0 (9926ms). Cost: $0.
-[2026-07-17T12:18:54.184Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10339ms). Cost: $0.
-[2026-07-17T12:34:05.244Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10668ms). Cost: $0.
-[2026-07-17T12:49:15.710Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10102ms). Cost: $0.
-[2026-07-17T13:04:27.679Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10545ms). Cost: $0.
-[2026-07-17T13:19:38.873Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10802ms). Cost: $0.
-[2026-07-17T13:34:49.592Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10378ms). Cost: $0.
-[2026-07-17T13:50:00.115Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10173ms). Cost: $0.
-[2026-07-17T14:05:11.037Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10408ms). Cost: $0.
-[2026-07-17T14:20:21.884Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10245ms). Cost: $0.
-[2026-07-17T14:35:33.108Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10674ms). Cost: $0.
-[2026-07-17T14:50:49.663Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (12554ms). Cost: $0.
-[2026-07-17T15:06:00.378Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10120ms). Cost: $0.
-[2026-07-17T15:21:11.191Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10424ms). Cost: $0.
-[2026-07-17T15:36:22.127Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10543ms). Cost: $0.
-[2026-07-17T15:51:33.453Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10569ms). Cost: $0.
-[2026-07-17T16:06:44.170Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-07-17T16:21:55.282Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10738ms). Cost: $0.
-[2026-07-17T16:37:06.576Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10752ms). Cost: $0.
-[2026-07-17T16:52:17.227Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10055ms). Cost: $0.
-[2026-07-17T17:07:28.613Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10754ms). Cost: $0.
-[2026-07-17T17:22:39.556Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10462ms). Cost: $0.
-[2026-07-17T17:37:50.524Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10400ms). Cost: $0.
-[2026-07-17T17:53:01.192Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-07-17T18:08:11.794Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-07-17T18:23:22.675Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10327ms). Cost: $0.
-[2026-07-17T18:38:33.975Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10605ms). Cost: $0.
-[2026-07-17T18:53:44.828Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10235ms). Cost: $0.
-[2026-07-17T19:08:55.438Z] liveness: tier1 expired=39, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-07-17T19:24:06.101Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10267ms). Cost: $0.
-[2026-07-17T19:39:16.555Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10110ms). Cost: $0.
-[2026-07-17T19:54:27.293Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10158ms). Cost: $0.
-[2026-07-17T20:09:38.091Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10187ms). Cost: $0.
-[2026-07-17T20:24:49.128Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10436ms). Cost: $0.
-[2026-07-17T20:39:59.911Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10273ms). Cost: $0.
-[2026-07-17T20:55:10.850Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10565ms). Cost: $0.
-[2026-07-17T21:10:21.871Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10634ms). Cost: $0.
-[2026-07-17T21:25:32.431Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10201ms). Cost: $0.
-[2026-07-17T21:40:43.343Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10560ms). Cost: $0.
-[2026-07-17T21:55:54.017Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-07-17T22:11:04.763Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (10222ms). Cost: $0.
-[2026-07-17T22:26:15.343Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10216ms). Cost: $0.
-[2026-07-17T22:41:25.893Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10122ms). Cost: $0.
-[2026-07-17T22:56:36.518Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10210ms). Cost: $0.
-[2026-07-17T23:11:47.033Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-07-17T23:26:57.562Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10141ms). Cost: $0.
-[2026-07-17T23:42:08.168Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10217ms). Cost: $0.
-[2026-07-17T23:57:18.720Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-07-18T00:12:29.304Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10211ms). Cost: $0.
-[2026-07-18T00:27:39.979Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-07-18T00:42:50.361Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-07-18T00:58:00.819Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-07-18T01:13:11.292Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10098ms). Cost: $0.
-[2026-07-18T01:28:22.095Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10467ms). Cost: $0.
-[2026-07-18T01:43:32.732Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10237ms). Cost: $0.
-[2026-07-18T01:58:43.482Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10135ms). Cost: $0.
-[2026-07-18T02:13:54.199Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10192ms). Cost: $0.
-[2026-07-18T02:29:04.785Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10205ms). Cost: $0.
-[2026-07-18T02:44:15.311Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10150ms). Cost: $0.
-[2026-07-18T02:59:25.839Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10010ms). Cost: $0.
-[2026-07-18T03:14:36.873Z] liveness: tier1 expired=29, tier2 checked=40 removed=0 (10656ms). Cost: $0.
-[2026-07-18T03:29:48.017Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10550ms). Cost: $0.
-[2026-07-18T03:44:58.435Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-07-18T04:00:09.195Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-07-18T04:15:19.828Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10077ms). Cost: $0.
-[2026-07-18T04:30:30.633Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-07-18T04:45:41.906Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10733ms). Cost: $0.
-[2026-07-18T05:00:52.722Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10464ms). Cost: $0.
-[2026-07-18T05:16:03.296Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10215ms). Cost: $0.
-[2026-07-18T05:31:13.886Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10152ms). Cost: $0.
-[2026-07-18T05:46:24.648Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-07-18T06:01:35.069Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10036ms). Cost: $0.
-[2026-07-18T06:16:45.854Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10185ms). Cost: $0.
-[2026-07-18T06:31:56.683Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10441ms). Cost: $0.
-[2026-07-18T06:47:07.210Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10143ms). Cost: $0.
-[2026-07-18T07:02:18.087Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10480ms). Cost: $0.
-[2026-07-18T07:17:28.440Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-07-18T07:32:38.855Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-07-18T07:47:49.222Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9996ms). Cost: $0.
-[2026-07-18T08:03:00.423Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10624ms). Cost: $0.
-[2026-07-18T08:18:10.823Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10055ms). Cost: $0.
-[2026-07-18T08:33:21.656Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10398ms). Cost: $0.
-[2026-07-18T08:48:32.234Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-07-18T09:03:43.069Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10458ms). Cost: $0.
-[2026-07-18T09:18:53.659Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10266ms). Cost: $0.
-[2026-07-18T09:34:04.210Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10190ms). Cost: $0.
-[2026-07-18T09:49:15.340Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10752ms). Cost: $0.
-[2026-07-18T10:04:26.041Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10280ms). Cost: $0.
-[2026-07-18T10:19:36.653Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-07-18T10:34:47.341Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10275ms). Cost: $0.
-[2026-07-18T10:49:58.402Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10586ms). Cost: $0.
-[2026-07-18T11:05:09.594Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10733ms). Cost: $0.
-[2026-07-18T11:20:20.239Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-07-18T11:35:30.785Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10143ms). Cost: $0.
-[2026-07-18T11:50:41.709Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10445ms). Cost: $0.
-[2026-07-18T12:05:52.843Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10681ms). Cost: $0.
-[2026-07-18T12:21:03.417Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10121ms). Cost: $0.
-[2026-07-18T12:36:14.062Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10237ms). Cost: $0.
-[2026-07-18T12:51:25.090Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10523ms). Cost: $0.
-[2026-07-18T13:06:35.903Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10245ms). Cost: $0.
-[2026-07-18T13:21:46.831Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10303ms). Cost: $0.
-[2026-07-18T13:36:57.316Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10109ms). Cost: $0.
-[2026-07-18T13:52:08.195Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10390ms). Cost: $0.
-[2026-07-18T14:07:18.983Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10204ms). Cost: $0.
-[2026-07-18T14:22:30.138Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10492ms). Cost: $0.
-[2026-07-18T14:37:40.932Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10146ms). Cost: $0.
-[2026-07-18T14:52:51.538Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-07-18T15:08:02.103Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-07-18T15:23:12.603Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-07-18T15:38:22.889Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9965ms). Cost: $0.
-[2026-07-18T15:53:33.424Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-07-18T16:08:44.283Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10436ms). Cost: $0.
-[2026-07-18T16:23:54.885Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-07-18T16:39:05.438Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-07-18T16:54:16.363Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10479ms). Cost: $0.
-[2026-07-18T17:09:27.022Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10190ms). Cost: $0.
-[2026-07-18T17:24:37.671Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-07-18T17:39:48.566Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10330ms). Cost: $0.
-[2026-07-18T17:54:59.633Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10501ms). Cost: $0.
-[2026-07-18T18:10:10.586Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10524ms). Cost: $0.
-[2026-07-18T18:25:21.608Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10401ms). Cost: $0.
-[2026-07-18T18:40:32.297Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-07-18T18:55:42.866Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10201ms). Cost: $0.
-[2026-07-18T19:10:53.337Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10108ms). Cost: $0.
-[2026-07-18T19:26:03.863Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10123ms). Cost: $0.
-[2026-07-18T19:41:14.602Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10351ms). Cost: $0.
-[2026-07-18T19:56:25.033Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-07-18T20:11:35.482Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10083ms). Cost: $0.
-[2026-07-18T20:26:46.698Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10804ms). Cost: $0.
-[2026-07-18T20:41:57.201Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10137ms). Cost: $0.
-[2026-07-18T20:57:07.917Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10310ms). Cost: $0.
-[2026-07-18T21:12:18.368Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-07-18T21:27:29.000Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10090ms). Cost: $0.
-[2026-07-18T21:42:39.346Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-07-18T21:57:49.842Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10167ms). Cost: $0.
-[2026-07-18T22:13:00.439Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10231ms). Cost: $0.
-[2026-07-18T22:28:11.023Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10221ms). Cost: $0.
-[2026-07-18T22:43:21.744Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10223ms). Cost: $0.
-[2026-07-18T22:58:32.137Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9996ms). Cost: $0.
-[2026-07-18T23:13:42.642Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10146ms). Cost: $0.
-[2026-07-18T23:28:53.364Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10352ms). Cost: $0.
-[2026-07-18T23:44:03.866Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10145ms). Cost: $0.
-[2026-07-18T23:59:14.622Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10171ms). Cost: $0.
-[2026-07-19T00:14:25.578Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10383ms). Cost: $0.
-[2026-07-19T00:29:36.324Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10193ms). Cost: $0.
-[2026-07-19T00:44:47.267Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10326ms). Cost: $0.
-[2026-07-19T00:59:57.966Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10125ms). Cost: $0.
-[2026-07-19T01:15:08.718Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10166ms). Cost: $0.
-[2026-07-19T01:30:19.261Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-07-19T01:45:30.122Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10292ms). Cost: $0.
-[2026-07-19T02:00:40.650Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-07-19T02:15:51.243Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10267ms). Cost: $0.
-[2026-07-19T02:31:01.735Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10102ms). Cost: $0.
-[2026-07-19T02:46:12.366Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-07-19T03:01:23.167Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10246ms). Cost: $0.
-[2026-07-19T03:16:33.827Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10252ms). Cost: $0.
-[2026-07-19T03:31:44.824Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10620ms). Cost: $0.
-[2026-07-19T03:46:55.597Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10400ms). Cost: $0.
-[2026-07-19T04:02:06.609Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10434ms). Cost: $0.
-[2026-07-19T04:17:17.500Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10270ms). Cost: $0.
-[2026-07-19T04:32:28.397Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10355ms). Cost: $0.
-[2026-07-19T04:47:39.254Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10525ms). Cost: $0.
-[2026-07-19T05:02:49.715Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10077ms). Cost: $0.
-[2026-07-19T05:18:00.030Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-07-19T05:33:10.561Z] liveness: tier1 expired=71, tier2 checked=40 removed=0 (10130ms). Cost: $0.
-[2026-07-19T05:48:21.752Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10574ms). Cost: $0.
-[2026-07-19T06:03:32.452Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-07-19T06:18:42.862Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-07-19T06:33:53.474Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10275ms). Cost: $0.
-[2026-07-19T06:49:04.437Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10426ms). Cost: $0.
-[2026-07-19T07:04:15.952Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10842ms). Cost: $0.
-[2026-07-19T07:19:26.452Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-07-19T07:34:36.922Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10093ms). Cost: $0.
-[2026-07-19T07:49:47.386Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10059ms). Cost: $0.
-[2026-07-19T08:04:57.993Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10103ms). Cost: $0.
-[2026-07-19T08:20:08.712Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10355ms). Cost: $0.
-[2026-07-19T08:35:19.186Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10073ms). Cost: $0.
-[2026-07-19T08:50:30.018Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10459ms). Cost: $0.
-[2026-07-19T09:05:40.827Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10439ms). Cost: $0.
-[2026-07-19T09:20:51.713Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10506ms). Cost: $0.
-[2026-07-19T09:36:02.883Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10744ms). Cost: $0.
-[2026-07-19T09:51:13.854Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10407ms). Cost: $0.
-[2026-07-19T10:06:24.505Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-07-19T10:21:35.507Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10478ms). Cost: $0.
-[2026-07-19T10:36:46.276Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10376ms). Cost: $0.
-[2026-07-19T10:51:57.387Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10516ms). Cost: $0.
-[2026-07-19T11:07:08.696Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10751ms). Cost: $0.
-[2026-07-19T11:22:19.802Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10536ms). Cost: $0.
-[2026-07-19T11:37:30.318Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-07-19T11:52:41.550Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10851ms). Cost: $0.
-[2026-07-19T12:07:52.320Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10397ms). Cost: $0.
-[2026-07-19T12:23:02.831Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10166ms). Cost: $0.
-[2026-07-19T12:38:13.703Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10311ms). Cost: $0.
-[2026-07-19T12:53:24.532Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10508ms). Cost: $0.
-[2026-07-19T13:08:34.874Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-07-19T13:23:45.594Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10098ms). Cost: $0.
-[2026-07-19T13:38:56.019Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10041ms). Cost: $0.
-[2026-07-19T13:54:06.554Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10123ms). Cost: $0.
-[2026-07-19T14:09:17.046Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10093ms). Cost: $0.
-[2026-07-19T14:24:27.529Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10014ms). Cost: $0.
-[2026-07-19T14:39:38.559Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10479ms). Cost: $0.
-[2026-07-19T14:54:48.920Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-07-19T15:09:59.671Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-07-19T15:25:10.327Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-07-19T15:40:21.070Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10177ms). Cost: $0.
-[2026-07-19T15:55:32.178Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10664ms). Cost: $0.
-[2026-07-19T16:10:42.903Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-07-19T16:25:53.507Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-07-19T16:41:03.899Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-07-19T16:56:14.321Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-07-19T17:11:24.930Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10059ms). Cost: $0.
-[2026-07-19T17:26:35.802Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10291ms). Cost: $0.
-[2026-07-19T17:41:46.258Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10073ms). Cost: $0.
-[2026-07-19T17:56:56.998Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10344ms). Cost: $0.
-[2026-07-19T18:12:07.555Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10216ms). Cost: $0.
-[2026-07-19T18:27:18.636Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10551ms). Cost: $0.
-[2026-07-19T18:42:29.264Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10012ms). Cost: $0.
-[2026-07-19T18:57:39.649Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9962ms). Cost: $0.
-[2026-07-19T19:12:50.052Z] liveness: tier1 expired=30, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-07-19T19:28:00.495Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-07-19T19:43:11.191Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10403ms). Cost: $0.
-[2026-07-19T19:58:21.944Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10269ms). Cost: $0.
-[2026-07-19T20:13:32.536Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-07-19T20:28:43.257Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10077ms). Cost: $0.
-[2026-07-19T20:43:54.159Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10540ms). Cost: $0.
-[2026-07-19T20:59:04.780Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10154ms). Cost: $0.
-[2026-07-19T21:14:15.299Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10145ms). Cost: $0.
-[2026-07-19T21:29:26.174Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10408ms). Cost: $0.
-[2026-07-19T21:44:37.170Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10568ms). Cost: $0.
-[2026-07-19T21:59:48.079Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10412ms). Cost: $0.
-[2026-07-19T22:14:58.770Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10107ms). Cost: $0.
-[2026-07-19T22:30:09.627Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10164ms). Cost: $0.
-[2026-07-19T22:45:20.468Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10255ms). Cost: $0.
-[2026-07-19T23:00:31.587Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10552ms). Cost: $0.
-[2026-07-19T23:15:42.113Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-07-19T23:30:52.693Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-07-19T23:46:03.330Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10147ms). Cost: $0.
-[2026-07-20T00:01:13.905Z] liveness: tier1 expired=143, tier2 checked=40 removed=0 (10208ms). Cost: $0.
-[2026-07-20T00:16:24.371Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10073ms). Cost: $0.
-[2026-07-20T00:31:35.232Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10492ms). Cost: $0.
-[2026-07-20T00:46:45.894Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10248ms). Cost: $0.
-[2026-07-20T01:01:56.343Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-07-20T01:17:07.141Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10392ms). Cost: $0.
-[2026-07-20T01:32:17.784Z] liveness: tier1 expired=26, tier2 checked=40 removed=0 (10246ms). Cost: $0.
-[2026-07-20T01:47:28.240Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-07-20T02:02:38.665Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-07-20T02:17:49.053Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10019ms). Cost: $0.
-[2026-07-20T02:32:59.510Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-07-20T02:48:09.941Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-07-20T03:03:20.896Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10313ms). Cost: $0.
-[2026-07-20T03:18:31.955Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10441ms). Cost: $0.
-[2026-07-20T03:33:42.701Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-07-20T03:48:53.943Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10677ms). Cost: $0.
-[2026-07-20T04:04:04.673Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-07-20T04:19:15.600Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10426ms). Cost: $0.
-[2026-07-20T04:34:26.239Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10293ms). Cost: $0.
-[2026-07-20T04:49:36.640Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10035ms). Cost: $0.
-[2026-07-20T05:04:47.147Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-07-20T05:19:57.736Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10229ms). Cost: $0.
-[2026-07-20T05:35:08.788Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10610ms). Cost: $0.
-[2026-07-20T05:50:19.202Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-07-20T06:05:29.730Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10097ms). Cost: $0.
-[2026-07-20T06:20:40.471Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10171ms). Cost: $0.
-[2026-07-20T06:35:51.143Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10108ms). Cost: $0.
-[2026-07-20T06:51:02.342Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10649ms). Cost: $0.
-[2026-07-20T07:06:13.276Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10333ms). Cost: $0.
-[2026-07-20T07:21:24.234Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10115ms). Cost: $0.
-[2026-07-20T07:36:34.789Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-07-20T07:51:45.657Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10307ms). Cost: $0.
-[2026-07-20T08:06:56.978Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10771ms). Cost: $0.
-[2026-07-20T08:22:08.173Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10619ms). Cost: $0.
-[2026-07-20T08:37:18.617Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-07-20T08:52:29.330Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10255ms). Cost: $0.
-[2026-07-20T09:07:40.135Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10438ms). Cost: $0.
-[2026-07-20T09:22:50.731Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10223ms). Cost: $0.
-[2026-07-20T09:38:01.380Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10274ms). Cost: $0.
-[2026-07-20T09:53:12.197Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10436ms). Cost: $0.
-[2026-07-20T10:08:22.519Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9954ms). Cost: $0.
-[2026-07-20T10:23:33.457Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10402ms). Cost: $0.
-[2026-07-20T10:38:44.378Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10353ms). Cost: $0.
-[2026-07-20T10:53:55.199Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10240ms). Cost: $0.
-[2026-07-20T11:09:06.040Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10250ms). Cost: $0.
-[2026-07-20T11:24:17.133Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10479ms). Cost: $0.
-[2026-07-20T11:39:28.427Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10539ms). Cost: $0.
-[2026-07-20T11:54:39.274Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10285ms). Cost: $0.
-[2026-07-20T12:09:49.893Z] liveness: tier1 expired=139, tier2 checked=40 removed=0 (10233ms). Cost: $0.
-[2026-07-20T12:25:00.289Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10025ms). Cost: $0.
-[2026-07-20T12:40:10.722Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-07-20T12:55:21.459Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10325ms). Cost: $0.
-[2026-07-20T13:10:32.009Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10009ms). Cost: $0.
-[2026-07-20T13:25:42.876Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10504ms). Cost: $0.
-[2026-07-20T13:40:53.538Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-07-20T13:56:03.988Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-07-20T14:11:15.120Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10771ms). Cost: $0.
-[2026-07-20T14:26:25.772Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10086ms). Cost: $0.
-[2026-07-20T14:41:36.525Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10234ms). Cost: $0.
-[2026-07-20T14:56:47.104Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10205ms). Cost: $0.
-[2026-07-20T15:11:57.673Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (10036ms). Cost: $0.
-[2026-07-20T15:27:08.224Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9998ms). Cost: $0.
-[2026-07-20T15:42:18.854Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10124ms). Cost: $0.
-[2026-07-20T15:57:30.282Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10801ms). Cost: $0.
-[2026-07-20T16:12:40.918Z] liveness: tier1 expired=18, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-07-20T16:27:51.523Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10036ms). Cost: $0.
-[2026-07-20T16:43:01.985Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-07-20T16:58:13.018Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10442ms). Cost: $0.
-[2026-07-20T17:13:24.005Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10401ms). Cost: $0.
-[2026-07-20T17:28:35.129Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10421ms). Cost: $0.
-[2026-07-20T17:43:45.574Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-07-20T17:58:56.281Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10142ms). Cost: $0.
-[2026-07-20T18:14:08.531Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (10283ms). Cost: $0.
-[2026-07-20T18:29:19.277Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10221ms). Cost: $0.
-[2026-07-20T18:44:30.149Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10236ms). Cost: $0.
-[2026-07-20T18:59:41.173Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (10450ms). Cost: $0.
-[2026-07-20T19:14:52.058Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10295ms). Cost: $0.
-[2026-07-20T19:30:03.229Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10469ms). Cost: $0.
-[2026-07-20T19:45:13.964Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-07-20T20:00:24.471Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10105ms). Cost: $0.
-[2026-07-20T20:15:35.771Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10621ms). Cost: $0.
-[2026-07-20T20:30:46.573Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10173ms). Cost: $0.
-[2026-07-20T20:45:57.172Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-07-20T21:01:08.191Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10650ms). Cost: $0.
-[2026-07-20T21:16:18.982Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10231ms). Cost: $0.
-[2026-07-20T21:31:29.585Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-07-20T21:46:40.636Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10495ms). Cost: $0.
-[2026-07-20T22:01:51.327Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-07-20T22:17:02.554Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10527ms). Cost: $0.
-[2026-07-20T22:32:13.645Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10451ms). Cost: $0.
-[2026-07-20T22:47:24.524Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10302ms). Cost: $0.
-[2026-07-20T23:02:35.641Z] liveness: tier1 expired=22, tier2 checked=40 removed=0 (10462ms). Cost: $0.
-[2026-07-20T23:17:46.348Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10144ms). Cost: $0.
-[2026-07-20T23:32:57.403Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10502ms). Cost: $0.
-[2026-07-20T23:48:08.372Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10316ms). Cost: $0.
-[2026-07-21T00:03:19.295Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10368ms). Cost: $0.
-[2026-07-21T00:18:29.997Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-07-21T00:33:41.303Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10665ms). Cost: $0.
-[2026-07-21T00:48:52.457Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10585ms). Cost: $0.
-[2026-07-21T01:04:02.936Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-07-21T01:19:13.430Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10136ms). Cost: $0.
-[2026-07-21T01:34:24.003Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10203ms). Cost: $0.
-[2026-07-21T01:49:34.508Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10161ms). Cost: $0.
-[2026-07-21T02:04:45.342Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10463ms). Cost: $0.
-[2026-07-21T02:19:55.897Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10177ms). Cost: $0.
-[2026-07-21T02:35:06.323Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10066ms). Cost: $0.
-[2026-07-21T02:50:16.938Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10191ms). Cost: $0.
-[2026-07-21T03:05:27.891Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10372ms). Cost: $0.
-[2026-07-21T03:20:38.718Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10258ms). Cost: $0.
-[2026-07-21T03:35:49.622Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10333ms). Cost: $0.
-[2026-07-21T03:51:00.298Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10113ms). Cost: $0.
-[2026-07-21T04:06:11.139Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10304ms). Cost: $0.
-[2026-07-21T04:21:21.927Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10213ms). Cost: $0.
-[2026-07-21T04:36:32.909Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10363ms). Cost: $0.
-[2026-07-21T04:51:43.667Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10169ms). Cost: $0.
-[2026-07-21T05:06:54.315Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10098ms). Cost: $0.
-[2026-07-21T05:22:04.942Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10240ms). Cost: $0.
-[2026-07-21T05:37:15.539Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10209ms). Cost: $0.
-[2026-07-21T05:52:26.347Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10419ms). Cost: $0.
-[2026-07-21T06:07:36.849Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10057ms). Cost: $0.
-[2026-07-21T06:22:47.319Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10086ms). Cost: $0.
-[2026-07-21T06:37:57.565Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9890ms). Cost: $0.
-[2026-07-21T06:53:08.085Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10172ms). Cost: $0.
-[2026-07-21T07:08:18.772Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10305ms). Cost: $0.
-[2026-07-21T07:23:29.240Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10096ms). Cost: $0.
-[2026-07-21T07:38:40.053Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10476ms). Cost: $0.
-[2026-07-21T07:53:50.415Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-07-21T08:09:01.032Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10022ms). Cost: $0.
-[2026-07-21T08:24:11.756Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10146ms). Cost: $0.
-[2026-07-21T08:39:22.659Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10555ms). Cost: $0.
-[2026-07-21T08:54:33.380Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-07-21T09:09:44.119Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10329ms). Cost: $0.
-[2026-07-21T09:24:54.603Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10179ms). Cost: $0.
-[2026-07-21T09:40:05.212Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10265ms). Cost: $0.
-[2026-07-21T09:55:16.098Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10484ms). Cost: $0.
-[2026-07-21T10:10:26.654Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10177ms). Cost: $0.
-[2026-07-21T10:25:37.208Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10149ms). Cost: $0.
-[2026-07-21T10:40:47.657Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-07-21T10:55:58.172Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10174ms). Cost: $0.
-[2026-07-21T11:11:09.203Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10585ms). Cost: $0.
-[2026-07-21T11:26:19.636Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10026ms). Cost: $0.
-[2026-07-21T11:41:30.142Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10147ms). Cost: $0.
-[2026-07-21T11:56:40.646Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-07-21T12:11:51.283Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-07-21T12:27:02.460Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10624ms). Cost: $0.
-[2026-07-21T12:42:12.901Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10009ms). Cost: $0.
-[2026-07-21T12:57:23.641Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10335ms). Cost: $0.
-[2026-07-21T13:12:34.250Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-07-21T13:27:44.975Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10162ms). Cost: $0.
-[2026-07-21T13:42:55.461Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10121ms). Cost: $0.
-[2026-07-21T13:58:06.002Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-07-21T14:13:16.768Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10261ms). Cost: $0.
-[2026-07-21T14:28:27.237Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-07-21T14:43:38.395Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10619ms). Cost: $0.
-[2026-07-21T14:58:49.113Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10309ms). Cost: $0.
-[2026-07-21T15:14:00.198Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (10487ms). Cost: $0.
-[2026-07-21T15:29:11.103Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10331ms). Cost: $0.
-[2026-07-21T15:44:21.724Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10111ms). Cost: $0.
-[2026-07-21T15:59:32.393Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10086ms). Cost: $0.
-[2026-07-21T16:14:43.282Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10316ms). Cost: $0.
-[2026-07-21T16:29:54.062Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10206ms). Cost: $0.
-[2026-07-21T16:45:04.701Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-07-21T17:00:15.369Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10056ms). Cost: $0.
-[2026-07-21T17:15:26.079Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10165ms). Cost: $0.
-[2026-07-21T17:30:36.693Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-07-21T17:45:47.549Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10244ms). Cost: $0.
-[2026-07-21T18:00:58.174Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-07-21T18:16:08.778Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10241ms). Cost: $0.
-[2026-07-21T18:31:19.312Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10159ms). Cost: $0.
-[2026-07-21T18:46:29.883Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10206ms). Cost: $0.
-[2026-07-21T19:01:40.970Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10544ms). Cost: $0.
-[2026-07-21T19:16:52.522Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10459ms). Cost: $0.
-[2026-07-21T19:32:03.197Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-npm notice
-npm notice New major version of npm available! 11.17.0 -> 12.0.1
-npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.0.1
-npm notice To update run: npm install -g npm@12.0.1
-npm notice
-[2026-07-21T19:47:14.160Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-07-21T20:02:24.796Z] liveness: tier1 expired=31, tier2 checked=40 removed=0 (10084ms). Cost: $0.
-[2026-07-21T20:17:35.843Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10441ms). Cost: $0.
-[2026-07-21T20:32:46.568Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-07-21T20:47:57.303Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10131ms). Cost: $0.
-[2026-07-21T21:03:07.945Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10261ms). Cost: $0.
-[2026-07-21T21:18:18.540Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10185ms). Cost: $0.
-[2026-07-21T21:33:29.001Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-07-21T21:48:39.660Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10048ms). Cost: $0.
-[2026-07-21T22:03:50.307Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10000ms). Cost: $0.
-[2026-07-21T22:19:00.809Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9927ms). Cost: $0.
-[2026-07-21T22:34:11.792Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10363ms). Cost: $0.
-[2026-07-21T22:49:22.347Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9962ms). Cost: $0.
-[2026-07-21T23:04:32.805Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-07-21T23:19:43.701Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10271ms). Cost: $0.
-[2026-07-21T23:34:54.169Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10123ms). Cost: $0.
-[2026-07-21T23:50:05.632Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10826ms). Cost: $0.
-[2026-07-22T00:05:16.094Z] liveness: tier1 expired=25, tier2 checked=40 removed=0 (10083ms). Cost: $0.
-[2026-07-22T00:20:26.960Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10164ms). Cost: $0.
-[2026-07-22T00:35:37.624Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-07-22T00:50:48.145Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10108ms). Cost: $0.
-[2026-07-22T01:05:58.985Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10291ms). Cost: $0.
-[2026-07-22T01:21:09.727Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10144ms). Cost: $0.
-[2026-07-22T01:36:20.646Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10528ms). Cost: $0.
-[2026-07-22T01:51:31.328Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10234ms). Cost: $0.
-[2026-07-22T02:06:42.012Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10164ms). Cost: $0.
-[2026-07-22T02:21:52.440Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-07-22T02:37:03.140Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10307ms). Cost: $0.
-[2026-07-22T02:52:13.751Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10113ms). Cost: $0.
-[2026-07-22T03:07:24.184Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-07-22T03:22:34.794Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10216ms). Cost: $0.
-[2026-07-22T03:37:45.398Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10232ms). Cost: $0.
-[2026-07-22T03:52:55.807Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-07-22T04:08:06.415Z] liveness: tier1 expired=30, tier2 checked=40 removed=0 (10250ms). Cost: $0.
-[2026-07-22T04:23:16.913Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-07-22T04:38:27.485Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10204ms). Cost: $0.
-[2026-07-22T04:53:38.165Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10309ms). Cost: $0.
-[2026-07-22T05:08:48.560Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-07-22T05:23:58.974Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-07-22T05:39:09.513Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-07-22T05:54:20.700Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10703ms). Cost: $0.
-[2026-07-22T06:09:31.651Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10377ms). Cost: $0.
-[2026-07-22T06:24:42.674Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10479ms). Cost: $0.
-[2026-07-22T06:39:53.202Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10152ms). Cost: $0.
-[2026-07-22T06:55:04.096Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10526ms). Cost: $0.
-[2026-07-22T07:10:14.545Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10148ms). Cost: $0.
-[2026-07-22T07:25:25.367Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10421ms). Cost: $0.
-[2026-07-22T07:40:35.853Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10108ms). Cost: $0.
-[2026-07-22T07:55:46.678Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10463ms). Cost: $0.
-[2026-07-22T08:10:57.132Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-07-22T08:26:07.885Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10184ms). Cost: $0.
-[2026-07-22T08:41:18.639Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10368ms). Cost: $0.
-[2026-07-22T08:56:29.366Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10383ms). Cost: $0.
-[2026-07-22T09:11:40.075Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10339ms). Cost: $0.
-[2026-07-22T09:26:50.670Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10185ms). Cost: $0.
-[2026-07-22T09:42:01.212Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-07-22T09:57:11.728Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-07-22T10:12:22.169Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-07-22T10:27:32.628Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-07-22T10:42:43.421Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10335ms). Cost: $0.
-[2026-07-22T10:57:53.925Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-07-22T11:13:04.582Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10053ms). Cost: $0.
-[2026-07-22T11:28:15.313Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10340ms). Cost: $0.
-[2026-07-22T11:43:26.092Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10460ms). Cost: $0.
-[2026-07-22T11:58:36.689Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10200ms). Cost: $0.
-[2026-07-22T12:13:47.211Z] liveness: tier1 expired=23, tier2 checked=40 removed=0 (10010ms). Cost: $0.
-[2026-07-22T12:28:57.867Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-07-22T12:44:08.472Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-07-22T12:59:18.794Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9942ms). Cost: $0.
-[2026-07-22T13:14:29.366Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9960ms). Cost: $0.
-[2026-07-22T13:29:39.912Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10122ms). Cost: $0.
-[2026-07-22T13:44:50.672Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10090ms). Cost: $0.
-[2026-07-22T14:00:01.239Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10025ms). Cost: $0.
-[2026-07-22T14:15:11.914Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-07-22T14:30:23.037Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10297ms). Cost: $0.
-[2026-07-22T14:45:33.943Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10240ms). Cost: $0.
-[2026-07-22T15:00:44.482Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10166ms). Cost: $0.
-[2026-07-22T15:15:55.173Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10053ms). Cost: $0.
-[2026-07-22T15:31:05.893Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-07-22T15:46:17.260Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10719ms). Cost: $0.
-[2026-07-22T16:01:27.977Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10064ms). Cost: $0.
-[2026-07-22T16:16:38.892Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10259ms). Cost: $0.
-[2026-07-22T16:31:49.381Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-07-22T16:47:00.188Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10116ms). Cost: $0.
-[2026-07-22T17:02:11.016Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10281ms). Cost: $0.
-[2026-07-22T17:17:21.687Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10066ms). Cost: $0.
-[2026-07-22T17:32:32.503Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10058ms). Cost: $0.
-[2026-07-22T17:47:43.352Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10170ms). Cost: $0.
-[2026-07-22T18:02:54.110Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-07-22T18:18:04.794Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-07-22T18:33:15.444Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-07-22T18:48:26.364Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10285ms). Cost: $0.
-[2026-07-22T19:03:37.600Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (10575ms). Cost: $0.
-[2026-07-22T19:18:48.339Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-07-22T19:33:58.975Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10036ms). Cost: $0.
-[2026-07-22T19:49:09.666Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10087ms). Cost: $0.
-[2026-07-22T20:04:21.028Z] liveness: tier1 expired=33, tier2 checked=40 removed=0 (10696ms). Cost: $0.
-[2026-07-22T20:19:32.441Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10760ms). Cost: $0.
-[2026-07-22T20:34:43.163Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10121ms). Cost: $0.
-[2026-07-22T20:49:54.275Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10487ms). Cost: $0.
-[2026-07-22T21:05:04.799Z] liveness: tier1 expired=18, tier2 checked=40 removed=0 (10014ms). Cost: $0.
-[2026-07-22T21:20:16.496Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10918ms). Cost: $0.
-[2026-07-22T21:35:27.289Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10214ms). Cost: $0.
-[2026-07-22T21:50:38.349Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10437ms). Cost: $0.
-[2026-07-22T22:05:48.976Z] liveness: tier1 expired=26, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-07-22T22:20:59.655Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10088ms). Cost: $0.
-[2026-07-22T22:36:10.345Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-07-22T22:51:21.656Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10736ms). Cost: $0.
-[2026-07-22T23:06:32.381Z] liveness: tier1 expired=61, tier2 checked=40 removed=0 (10184ms). Cost: $0.
-[2026-07-22T23:21:43.525Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10470ms). Cost: $0.
-[2026-07-22T23:36:54.169Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-07-22T23:52:04.867Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-07-23T00:07:15.903Z] liveness: tier1 expired=64, tier2 checked=40 removed=0 (10408ms). Cost: $0.
-[2026-07-23T00:22:27.273Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10745ms). Cost: $0.
-[2026-07-23T00:37:38.434Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10085ms). Cost: $0.
-[2026-07-23T00:52:49.468Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10379ms). Cost: $0.
-[2026-07-23T01:07:59.919Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-07-23T01:23:11.223Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10598ms). Cost: $0.
-[2026-07-23T01:38:21.956Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10306ms). Cost: $0.
-[2026-07-23T01:53:32.694Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-07-23T02:08:43.217Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-07-23T02:23:53.747Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-07-23T02:39:04.300Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10159ms). Cost: $0.
-[2026-07-23T02:54:14.923Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10211ms). Cost: $0.
-[2026-07-23T03:09:25.450Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9998ms). Cost: $0.
-[2026-07-23T03:24:36.208Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10414ms). Cost: $0.
-[2026-07-23T03:39:47.510Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10515ms). Cost: $0.
-[2026-07-23T03:54:58.113Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10175ms). Cost: $0.
-[2026-07-23T04:10:08.848Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-07-23T04:25:19.807Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10116ms). Cost: $0.
-[2026-07-23T04:40:30.348Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10025ms). Cost: $0.
-[2026-07-23T04:55:40.986Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10222ms). Cost: $0.
-[2026-07-23T05:10:51.685Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-07-23T05:26:02.783Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10600ms). Cost: $0.
-[2026-07-23T05:41:13.624Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-07-23T05:56:24.448Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10220ms). Cost: $0.
-[2026-07-23T06:11:35.464Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10461ms). Cost: $0.
-[2026-07-23T06:26:46.088Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-07-23T06:41:57.159Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10494ms). Cost: $0.
-[2026-07-23T06:57:08.007Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10262ms). Cost: $0.
-[2026-07-23T07:12:18.563Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10188ms). Cost: $0.
-[2026-07-23T07:27:29.120Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10181ms). Cost: $0.
-[2026-07-23T07:42:40.126Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10544ms). Cost: $0.
-[2026-07-23T07:57:51.317Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10616ms). Cost: $0.
-[2026-07-23T08:13:02.401Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10514ms). Cost: $0.
-[2026-07-23T08:28:13.354Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10528ms). Cost: $0.
-[2026-07-23T08:43:24.277Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10572ms). Cost: $0.
-[2026-07-23T08:58:35.020Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10352ms). Cost: $0.
-[2026-07-23T09:13:45.531Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10164ms). Cost: $0.
-[2026-07-23T09:28:56.009Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-07-23T09:44:06.411Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-07-23T09:59:16.938Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10142ms). Cost: $0.
-[2026-07-23T10:14:27.746Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10435ms). Cost: $0.
-[2026-07-23T10:29:38.895Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10677ms). Cost: $0.
-[2026-07-23T10:44:49.454Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10135ms). Cost: $0.
-[2026-07-23T10:59:59.961Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10120ms). Cost: $0.
-[2026-07-23T11:15:10.519Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-07-23T11:30:21.096Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10180ms). Cost: $0.
-[2026-07-23T11:45:31.663Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10218ms). Cost: $0.
-[2026-07-23T12:00:42.249Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-07-23T12:15:53.425Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10771ms). Cost: $0.
-[2026-07-23T12:31:03.958Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10088ms). Cost: $0.
-[2026-07-23T12:46:14.417Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10108ms). Cost: $0.
-[2026-07-23T13:01:24.893Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-07-23T13:16:35.368Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-07-23T13:31:46.201Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10186ms). Cost: $0.
-[2026-07-23T13:46:57.581Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10605ms). Cost: $0.
-[2026-07-23T14:02:08.441Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10248ms). Cost: $0.
-[2026-07-23T14:17:19.328Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10248ms). Cost: $0.
-[2026-07-23T14:32:29.928Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-07-23T14:47:40.626Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10125ms). Cost: $0.
-[2026-07-23T15:02:51.330Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-07-23T15:18:01.799Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10073ms). Cost: $0.
-[2026-07-23T15:33:12.717Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-07-23T15:48:23.328Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10006ms). Cost: $0.
-[2026-07-23T16:03:34.160Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-07-23T16:18:45.222Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10437ms). Cost: $0.
-[2026-07-23T16:33:55.865Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-07-23T16:49:06.757Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10428ms). Cost: $0.
-[2026-07-23T17:04:17.611Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10366ms). Cost: $0.
-[2026-07-23T17:19:28.185Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10178ms). Cost: $0.
-[2026-07-23T17:34:38.962Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10276ms). Cost: $0.
-[2026-07-23T17:49:49.468Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10105ms). Cost: $0.
-[2026-07-23T18:05:00.033Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10109ms). Cost: $0.
-[2026-07-23T18:20:11.080Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10227ms). Cost: $0.
-[2026-07-23T18:35:21.954Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10066ms). Cost: $0.
-[2026-07-23T18:50:32.576Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10111ms). Cost: $0.
-[2026-07-23T19:05:43.356Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10361ms). Cost: $0.
-[2026-07-23T19:20:54.040Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-07-23T19:36:08.235Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10264ms). Cost: $0.
-[2026-07-23T19:51:19.096Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10213ms). Cost: $0.
-[2026-07-23T20:06:30.340Z] liveness: tier1 expired=30, tier2 checked=40 removed=0 (10364ms). Cost: $0.
-[2026-07-23T20:21:41.413Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10457ms). Cost: $0.
-[2026-07-23T20:36:52.126Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-07-23T20:52:02.934Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10080ms). Cost: $0.
-[2026-07-23T21:07:13.916Z] liveness: tier1 expired=27, tier2 checked=40 removed=0 (10351ms). Cost: $0.
-[2026-07-23T21:22:24.668Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10057ms). Cost: $0.
-[2026-07-23T21:37:35.169Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10098ms). Cost: $0.
-[2026-07-23T21:52:45.868Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-07-23T22:07:56.738Z] liveness: tier1 expired=64, tier2 checked=40 removed=0 (10309ms). Cost: $0.
-[2026-07-23T22:23:13.021Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10258ms). Cost: $0.
-[2026-07-23T22:38:23.549Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10108ms). Cost: $0.
-[2026-07-23T22:53:34.236Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-07-23T23:08:45.011Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (10229ms). Cost: $0.
-[2026-07-23T23:23:55.768Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10206ms). Cost: $0.
-[2026-07-23T23:39:06.414Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10280ms). Cost: $0.
-[2026-07-23T23:54:16.971Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-07-24T00:09:27.424Z] liveness: tier1 expired=103, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-07-24T00:24:37.895Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-07-24T00:39:48.611Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10152ms). Cost: $0.
-[2026-07-24T00:54:59.369Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10240ms). Cost: $0.
-[2026-07-24T01:10:09.861Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-07-24T01:25:20.542Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10120ms). Cost: $0.
-[2026-07-24T01:40:31.123Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10177ms). Cost: $0.
-[2026-07-24T01:55:41.826Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10156ms). Cost: $0.
-[2026-07-24T02:10:52.420Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10176ms). Cost: $0.
-[2026-07-24T02:26:02.972Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-07-24T02:41:13.419Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10019ms). Cost: $0.
-[2026-07-24T02:56:23.788Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10005ms). Cost: $0.
-[2026-07-24T03:11:34.459Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10230ms). Cost: $0.
-[2026-07-24T03:26:45.102Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10177ms). Cost: $0.
-[2026-07-24T03:41:55.681Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10130ms). Cost: $0.
-[2026-07-24T03:57:06.214Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-07-24T04:12:16.755Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10171ms). Cost: $0.
-[2026-07-24T04:27:27.707Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10566ms). Cost: $0.
-[2026-07-24T04:42:38.237Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-07-24T04:57:48.863Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-07-24T05:12:59.633Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10217ms). Cost: $0.
-[2026-07-24T05:28:10.095Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-07-24T05:43:20.846Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10183ms). Cost: $0.
-[2026-07-24T05:58:31.385Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-07-24T06:13:41.851Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10124ms). Cost: $0.
-[2026-07-24T06:28:53.116Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10697ms). Cost: $0.
-[2026-07-24T06:44:03.987Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10478ms). Cost: $0.
-[2026-07-24T06:59:14.352Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-07-24T07:14:24.809Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-07-24T07:29:35.705Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10485ms). Cost: $0.
-[2026-07-24T07:44:46.038Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-07-24T07:59:56.319Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-07-24T08:15:07.233Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10549ms). Cost: $0.
-[2026-07-24T08:30:18.579Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10926ms). Cost: $0.
-[2026-07-24T08:45:29.062Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10107ms). Cost: $0.
-[2026-07-24T09:00:39.807Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10385ms). Cost: $0.
-[2026-07-24T09:15:50.600Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10363ms). Cost: $0.
-[2026-07-24T09:31:01.088Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10125ms). Cost: $0.
-[2026-07-24T09:46:11.455Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-07-24T10:01:21.902Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-07-24T10:16:32.898Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10641ms). Cost: $0.
-[2026-07-24T10:31:43.589Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10225ms). Cost: $0.
-[2026-07-24T10:46:53.947Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10000ms). Cost: $0.
-[2026-07-24T11:02:04.409Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-07-24T11:17:14.864Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-07-24T11:32:25.426Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-07-24T11:47:35.996Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10154ms). Cost: $0.
-[2026-07-24T12:02:46.391Z] liveness: tier1 expired=116, tier2 checked=40 removed=0 (10059ms). Cost: $0.
-[2026-07-24T12:17:56.824Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10067ms). Cost: $0.
-[2026-07-24T12:33:07.447Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-07-24T12:48:17.960Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-07-24T13:03:28.659Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-07-24T13:18:39.684Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10407ms). Cost: $0.
-[2026-07-24T13:33:50.499Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10194ms). Cost: $0.
-[2026-07-24T13:49:00.901Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9987ms). Cost: $0.
-[2026-07-24T14:04:11.455Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10192ms). Cost: $0.
-[2026-07-24T14:19:22.120Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10013ms). Cost: $0.
-[2026-07-24T14:34:34.791Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (11139ms). Cost: $0.
-[2026-07-24T14:49:46.718Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10888ms). Cost: $0.
-[2026-07-24T15:04:57.270Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-07-24T15:20:07.770Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10115ms). Cost: $0.
-[2026-07-24T15:35:18.442Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-07-24T15:50:29.224Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10124ms). Cost: $0.
-[2026-07-24T16:05:40.232Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10413ms). Cost: $0.
-[2026-07-24T16:20:50.925Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10116ms). Cost: $0.
-[2026-07-24T16:36:02.053Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10569ms). Cost: $0.
-[2026-07-24T16:51:12.658Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10236ms). Cost: $0.
-[2026-07-24T17:06:23.358Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10344ms). Cost: $0.
-[2026-07-24T17:28:32.411Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (428610ms). Cost: $0.
-[2026-07-24T17:51:03.461Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (428908ms). Cost: $0.
-[2026-07-24T18:13:33.983Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (428895ms). Cost: $0.
-[2026-07-24T18:36:04.598Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (428857ms). Cost: $0.
-[2026-07-24T18:58:35.126Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (428899ms). Cost: $0.
-[2026-07-24T19:21:05.636Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (428919ms). Cost: $0.
-[2026-07-24T19:36:37.497Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-07-24T19:58:46.634Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (428904ms). Cost: $0.
-[2026-07-24T20:21:17.071Z] liveness: tier1 expired=26, tier2 checked=40 removed=0 (428876ms). Cost: $0.
-[2026-07-24T20:36:49.035Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10133ms). Cost: $0.
-[2026-07-24T20:51:59.757Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10323ms). Cost: $0.
-[2026-07-24T21:07:10.804Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10629ms). Cost: $0.
-[2026-07-24T21:22:21.840Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10638ms). Cost: $0.
-[2026-07-24T21:37:32.301Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-07-24T21:52:43.087Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10248ms). Cost: $0.
-[2026-07-24T22:07:53.993Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10341ms). Cost: $0.
-[2026-07-24T22:23:04.449Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10107ms). Cost: $0.
-[2026-07-24T22:38:15.096Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10217ms). Cost: $0.
-[2026-07-24T22:53:25.539Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-07-24T23:08:36.738Z] liveness: tier1 expired=32, tier2 checked=40 removed=0 (10839ms). Cost: $0.
-[2026-07-24T23:23:47.083Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-07-24T23:38:57.668Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10190ms). Cost: $0.
-[2026-07-24T23:54:08.077Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-07-25T00:09:19.318Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10882ms). Cost: $0.
-[2026-07-25T00:24:29.715Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10036ms). Cost: $0.
-[2026-07-25T00:39:40.714Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10389ms). Cost: $0.
-[2026-07-25T00:54:51.267Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-07-25T01:10:01.714Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10090ms). Cost: $0.
-[2026-07-25T01:25:12.360Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10225ms). Cost: $0.
-[2026-07-25T01:40:23.385Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10436ms). Cost: $0.
-[2026-07-25T01:55:34.393Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10388ms). Cost: $0.
-[2026-07-25T02:10:45.158Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10173ms). Cost: $0.
-[2026-07-25T02:25:55.664Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-07-25T02:41:06.661Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10398ms). Cost: $0.
-[2026-07-25T02:56:17.061Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-07-25T03:11:28.056Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10463ms). Cost: $0.
-[2026-07-25T03:26:38.973Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10529ms). Cost: $0.
-[2026-07-25T03:41:49.517Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-07-25T03:57:00.413Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10277ms). Cost: $0.
-[2026-07-25T04:12:10.919Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-07-25T04:27:21.813Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10497ms). Cost: $0.
-[2026-07-25T04:42:32.345Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10150ms). Cost: $0.
-[2026-07-25T04:57:43.468Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10742ms). Cost: $0.
-[2026-07-25T05:12:54.029Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10209ms). Cost: $0.
-[2026-07-25T05:28:04.910Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10458ms). Cost: $0.
-[2026-07-25T05:43:16.063Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10587ms). Cost: $0.
-[2026-07-25T05:58:26.776Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10346ms). Cost: $0.
-[2026-07-25T06:13:37.344Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10125ms). Cost: $0.
-[2026-07-25T06:28:48.514Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10481ms). Cost: $0.
-[2026-07-25T06:43:59.684Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10276ms). Cost: $0.
-[2026-07-25T06:59:11.444Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (11126ms). Cost: $0.
-[2026-07-25T07:14:22.589Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10497ms). Cost: $0.
-[2026-07-25T07:29:33.885Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10639ms). Cost: $0.
-[2026-07-25T07:44:45.337Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10708ms). Cost: $0.
-[2026-07-25T07:59:55.958Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10006ms). Cost: $0.
-[2026-07-25T08:15:06.870Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10289ms). Cost: $0.
-[2026-07-25T08:30:17.790Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10351ms). Cost: $0.
-[2026-07-25T08:45:28.939Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10702ms). Cost: $0.
-[2026-07-25T09:00:40.256Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10580ms). Cost: $0.
-[2026-07-25T09:15:51.434Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10702ms). Cost: $0.
-[2026-07-25T09:31:02.260Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10229ms). Cost: $0.
-[2026-07-25T09:46:12.738Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-07-25T10:01:23.383Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-07-25T10:16:33.996Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10025ms). Cost: $0.
-[2026-07-25T10:31:45.310Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10709ms). Cost: $0.
-[2026-07-25T10:46:56.004Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10133ms). Cost: $0.
-[2026-07-25T11:02:06.504Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-07-25T11:17:17.414Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10308ms). Cost: $0.
-[2026-07-25T11:32:27.885Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-07-25T11:47:38.721Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10259ms). Cost: $0.
-[2026-07-25T12:02:49.314Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10169ms). Cost: $0.
-[2026-07-25T12:18:00.185Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10304ms). Cost: $0.
-[2026-07-25T12:33:10.969Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10186ms). Cost: $0.
-[2026-07-25T12:48:21.864Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10327ms). Cost: $0.
-[2026-07-25T13:03:32.695Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10434ms). Cost: $0.
-[2026-07-25T13:18:43.532Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10275ms). Cost: $0.
-[2026-07-25T13:33:54.107Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10013ms). Cost: $0.
-[2026-07-25T13:49:04.984Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10191ms). Cost: $0.
-[2026-07-25T14:04:15.719Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-07-25T14:19:26.486Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10351ms). Cost: $0.
-[2026-07-25T14:34:37.208Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10117ms). Cost: $0.
-[2026-07-25T14:49:47.871Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10067ms). Cost: $0.
-[2026-07-25T15:04:58.505Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-07-25T15:20:09.111Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-07-25T15:35:20.165Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10414ms). Cost: $0.
-[2026-07-25T15:50:30.733Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-07-25T16:05:41.508Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-07-25T16:20:52.321Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10328ms). Cost: $0.
-[2026-07-25T16:36:02.974Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10035ms). Cost: $0.
-[2026-07-25T16:51:13.984Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10439ms). Cost: $0.
-[2026-07-25T17:06:24.693Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10084ms). Cost: $0.
-[2026-07-25T17:21:35.919Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10581ms). Cost: $0.
-[2026-07-25T17:36:46.780Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10055ms). Cost: $0.
-[2026-07-25T17:51:57.100Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9965ms). Cost: $0.
-[2026-07-25T18:07:07.810Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-07-25T18:22:18.410Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-07-25T18:37:29.063Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-07-25T18:52:39.587Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10087ms). Cost: $0.
-[2026-07-25T19:07:50.196Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10153ms). Cost: $0.
-[2026-07-25T19:23:01.439Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10809ms). Cost: $0.
-[2026-07-25T19:38:12.448Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10449ms). Cost: $0.
-[2026-07-25T19:53:23.482Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10370ms). Cost: $0.
-[2026-07-25T20:08:33.945Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (10035ms). Cost: $0.
-[2026-07-25T20:23:44.403Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-07-25T20:38:55.608Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10666ms). Cost: $0.
-[2026-07-25T20:54:06.344Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10172ms). Cost: $0.
-[2026-07-25T21:09:16.956Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-07-25T21:24:27.374Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-07-25T21:39:37.794Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-07-25T21:54:48.404Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10233ms). Cost: $0.
-[2026-07-25T22:09:59.183Z] liveness: tier1 expired=22, tier2 checked=40 removed=0 (10437ms). Cost: $0.
-[2026-07-25T22:25:09.641Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10088ms). Cost: $0.
-[2026-07-25T22:40:20.590Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10518ms). Cost: $0.
-[2026-07-25T22:55:31.087Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10125ms). Cost: $0.
-[2026-07-25T23:10:42.204Z] liveness: tier1 expired=49, tier2 checked=40 removed=0 (10528ms). Cost: $0.
-[2026-07-25T23:25:52.905Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10161ms). Cost: $0.
-[2026-07-25T23:41:03.939Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10490ms). Cost: $0.
-[2026-07-25T23:56:14.855Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10445ms). Cost: $0.
-[2026-07-26T00:11:25.463Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (10259ms). Cost: $0.
-[2026-07-26T00:26:35.938Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10086ms). Cost: $0.
-[2026-07-26T00:41:46.759Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10191ms). Cost: $0.
-[2026-07-26T00:56:57.249Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10105ms). Cost: $0.
-[2026-07-26T01:12:07.868Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10162ms). Cost: $0.
-[2026-07-26T01:27:19.000Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10563ms). Cost: $0.
-[2026-07-26T01:42:30.017Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10574ms). Cost: $0.
-[2026-07-26T01:57:40.453Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-07-26T02:12:50.868Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-07-26T02:28:01.513Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10192ms). Cost: $0.
-[2026-07-26T02:43:12.497Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10527ms). Cost: $0.
-[2026-07-26T02:58:23.935Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10828ms). Cost: $0.
-[2026-07-26T03:13:34.712Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10358ms). Cost: $0.
-[2026-07-26T03:28:46.068Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10751ms). Cost: $0.
-[2026-07-26T03:43:56.722Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10214ms). Cost: $0.
-[2026-07-26T03:59:07.582Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10483ms). Cost: $0.
-[2026-07-26T04:14:18.399Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10393ms). Cost: $0.
-[2026-07-26T04:29:29.245Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10502ms). Cost: $0.
-[2026-07-26T04:44:39.878Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10272ms). Cost: $0.
-[2026-07-26T04:59:50.196Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-07-26T05:15:00.661Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10119ms). Cost: $0.
-[2026-07-26T05:30:11.125Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-07-26T05:45:22.556Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10839ms). Cost: $0.
-[2026-07-26T06:00:33.442Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10499ms). Cost: $0.
-[2026-07-26T06:15:44.344Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10529ms). Cost: $0.
-[2026-07-26T06:30:54.861Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-07-26T06:46:05.712Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10383ms). Cost: $0.
-[2026-07-26T07:01:16.342Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10297ms). Cost: $0.
-[2026-07-26T07:16:26.783Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10035ms). Cost: $0.
-[2026-07-26T07:31:37.775Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10490ms). Cost: $0.
-[2026-07-26T07:46:48.992Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10648ms). Cost: $0.
-[2026-07-26T08:01:59.915Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10570ms). Cost: $0.
-[2026-07-26T08:17:10.322Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10010ms). Cost: $0.
-[2026-07-26T08:32:21.082Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10289ms). Cost: $0.
-[2026-07-26T08:47:31.840Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10351ms). Cost: $0.
-[2026-07-26T09:02:42.218Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-07-26T09:17:52.754Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10171ms). Cost: $0.
-[2026-07-26T09:33:03.424Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10266ms). Cost: $0.
-[2026-07-26T09:48:13.881Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10055ms). Cost: $0.
-[2026-07-26T10:03:24.541Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10263ms). Cost: $0.
-[2026-07-26T10:18:34.963Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-07-26T10:33:45.701Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10377ms). Cost: $0.
-[2026-07-26T10:48:56.391Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10096ms). Cost: $0.
-[2026-07-26T11:04:07.456Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10567ms). Cost: $0.
-[2026-07-26T11:19:17.959Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-07-26T11:34:28.930Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10562ms). Cost: $0.
-[2026-07-26T11:49:39.849Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10378ms). Cost: $0.
-[2026-07-26T12:04:50.585Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10364ms). Cost: $0.
-[2026-07-26T12:20:01.612Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10624ms). Cost: $0.
-[2026-07-26T12:35:12.102Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10093ms). Cost: $0.
-[2026-07-26T12:50:23.247Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10770ms). Cost: $0.
-[2026-07-26T13:05:34.195Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10581ms). Cost: $0.
-[2026-07-26T13:20:44.825Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10280ms). Cost: $0.
-[2026-07-26T13:35:55.281Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10100ms). Cost: $0.
-[2026-07-26T13:51:05.657Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-07-26T14:06:16.321Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10280ms). Cost: $0.
-[2026-07-26T14:21:27.174Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10384ms). Cost: $0.
-[2026-07-26T14:36:37.921Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10055ms). Cost: $0.
-[2026-07-26T14:51:53.322Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (12198ms). Cost: $0.
-[2026-07-26T15:07:04.308Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10605ms). Cost: $0.
-[2026-07-26T15:22:15.059Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10326ms). Cost: $0.
-[2026-07-26T15:37:26.636Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10953ms). Cost: $0.
-[2026-07-26T15:52:38.119Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10219ms). Cost: $0.
-[2026-07-26T16:07:48.980Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10437ms). Cost: $0.
-[2026-07-26T16:22:59.480Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-07-26T16:38:09.921Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-07-26T16:53:20.820Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10277ms). Cost: $0.
-[2026-07-26T17:08:31.243Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-07-26T17:23:42.032Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10418ms). Cost: $0.
-[2026-07-26T17:38:52.535Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-07-26T17:54:03.095Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10192ms). Cost: $0.
-[2026-07-26T18:09:13.388Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-07-26T18:24:23.870Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-07-26T18:39:34.782Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10432ms). Cost: $0.
-[2026-07-26T18:54:45.239Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10041ms). Cost: $0.
-[2026-07-26T19:09:55.738Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-07-26T19:25:06.562Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10419ms). Cost: $0.
-[2026-07-26T19:40:16.956Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-07-26T19:55:27.778Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10438ms). Cost: $0.
-[2026-07-26T20:10:38.832Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10443ms). Cost: $0.
-[2026-07-26T20:25:50.014Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10627ms). Cost: $0.
-[2026-07-26T20:41:00.453Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10019ms). Cost: $0.
-[2026-07-26T20:56:10.997Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-07-26T21:11:22.038Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10484ms). Cost: $0.
-[2026-07-26T21:26:32.415Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-07-26T21:41:43.170Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10404ms). Cost: $0.
-[2026-07-26T21:56:53.762Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10164ms). Cost: $0.
-[2026-07-26T22:12:04.555Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10336ms). Cost: $0.
-[2026-07-26T22:27:15.195Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10252ms). Cost: $0.
-[2026-07-26T22:42:25.976Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10309ms). Cost: $0.
-[2026-07-26T22:57:37.089Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10454ms). Cost: $0.
-[2026-07-26T23:12:47.760Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10253ms). Cost: $0.
-[2026-07-26T23:28:00.060Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10346ms). Cost: $0.
-[2026-07-26T23:43:18.594Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (17886ms). Cost: $0.
-[2026-07-26T23:58:29.166Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10192ms). Cost: $0.
-[2026-07-27T00:13:40.030Z] liveness: tier1 expired=73, tier2 checked=40 removed=0 (10444ms). Cost: $0.
-[2026-07-27T00:28:50.851Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10224ms). Cost: $0.
-[2026-07-27T00:44:02.152Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10893ms). Cost: $0.
-[2026-07-27T00:59:12.877Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10340ms). Cost: $0.
-[2026-07-27T01:14:23.407Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-07-27T01:29:34.172Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10373ms). Cost: $0.
-[2026-07-27T01:44:45.072Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10532ms). Cost: $0.
-[2026-07-27T01:59:56.178Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10658ms). Cost: $0.
-[2026-07-27T02:15:06.670Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10119ms). Cost: $0.
-[2026-07-27T02:30:17.446Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-07-27T02:45:28.049Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10217ms). Cost: $0.
-[2026-07-27T03:00:38.840Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10182ms). Cost: $0.
-[2026-07-27T03:15:49.797Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10334ms). Cost: $0.
-[2026-07-27T03:31:00.741Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10262ms). Cost: $0.
-[2026-07-27T03:46:11.465Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10107ms). Cost: $0.
-[2026-07-27T04:01:22.186Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10189ms). Cost: $0.
-[2026-07-27T04:16:33.062Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10188ms). Cost: $0.
-[2026-07-27T04:31:43.684Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10161ms). Cost: $0.
-[2026-07-27T04:46:54.410Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10115ms). Cost: $0.
-[2026-07-27T05:02:05.270Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10488ms). Cost: $0.
-[2026-07-27T05:17:15.982Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10192ms). Cost: $0.
-[2026-07-27T05:32:26.380Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-07-27T05:47:36.860Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10053ms). Cost: $0.
-[2026-07-27T06:02:47.488Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10266ms). Cost: $0.
-[2026-07-27T06:17:57.955Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9984ms). Cost: $0.
-[2026-07-27T06:33:08.607Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10168ms). Cost: $0.
-[2026-07-27T06:48:19.160Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10079ms). Cost: $0.
-[2026-07-27T07:03:29.503Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9933ms). Cost: $0.
-[2026-07-27T07:18:39.840Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-07-27T07:33:50.232Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-07-27T07:49:00.729Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-07-27T08:04:11.072Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-07-27T08:19:21.512Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-07-27T08:34:32.148Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10246ms). Cost: $0.
-[2026-07-27T08:49:43.470Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10627ms). Cost: $0.
-[2026-07-27T09:04:53.880Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-07-27T09:20:04.263Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-07-27T09:35:14.677Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-07-27T09:50:25.277Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10041ms). Cost: $0.
-[2026-07-27T10:05:35.874Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-07-27T10:20:46.297Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-07-27T10:35:56.689Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-07-27T10:51:07.108Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-07-27T11:06:17.831Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10356ms). Cost: $0.
-[2026-07-27T11:21:28.299Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10080ms). Cost: $0.
-[2026-07-27T11:36:39.076Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10360ms). Cost: $0.
-[2026-07-27T11:51:49.490Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-07-27T12:07:00.123Z] liveness: tier1 expired=73, tier2 checked=40 removed=0 (10192ms). Cost: $0.
-[2026-07-27T12:22:11.184Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10540ms). Cost: $0.
-[2026-07-27T12:37:22.009Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10420ms). Cost: $0.
-[2026-07-27T12:52:33.164Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10556ms). Cost: $0.
-[2026-07-27T13:07:43.748Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9994ms). Cost: $0.
-[2026-07-27T13:22:54.182Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-07-27T13:38:05.285Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10468ms). Cost: $0.
-[2026-07-27T13:53:16.404Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10466ms). Cost: $0.
-[2026-07-27T14:08:27.589Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10815ms). Cost: $0.
-[2026-07-27T14:23:38.100Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10103ms). Cost: $0.
-[2026-07-27T14:38:50.838Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10489ms). Cost: $0.
-[2026-07-27T14:54:01.812Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10331ms). Cost: $0.
-[2026-07-27T15:09:12.396Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10185ms). Cost: $0.
-[2026-07-27T15:24:23.477Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10678ms). Cost: $0.
-[2026-07-27T15:39:33.938Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10131ms). Cost: $0.
-[2026-07-27T15:54:44.809Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10259ms). Cost: $0.
-[2026-07-27T16:09:55.525Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10282ms). Cost: $0.
-[2026-07-27T16:25:06.233Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10073ms). Cost: $0.
-[2026-07-27T16:30:12.056Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9935ms). Cost: $0.
-[2026-07-27T16:45:11.540Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9698ms). Cost: $0.
-[2026-07-27T17:00:12.606Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (9898ms). Cost: $0.
-[2026-07-27T17:15:12.421Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9811ms). Cost: $0.
-[2026-07-27T17:30:11.856Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9684ms). Cost: $0.
-[2026-07-27T17:45:11.943Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9759ms). Cost: $0.
-[2026-07-27T18:00:12.691Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-07-27T18:15:12.564Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9923ms). Cost: $0.
-[2026-07-27T18:30:12.952Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9818ms). Cost: $0.
-[2026-07-27T18:45:12.241Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9822ms). Cost: $0.
-[2026-07-27T19:00:12.266Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (9887ms). Cost: $0.
-[2026-07-27T19:15:12.085Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9774ms). Cost: $0.
-[2026-07-27T19:30:12.705Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9830ms). Cost: $0.
-[2026-07-27T19:45:12.085Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9811ms). Cost: $0.
-[2026-07-27T20:00:13.018Z] liveness: tier1 expired=20, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-07-27T20:15:12.382Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9816ms). Cost: $0.
-[2026-07-27T20:30:12.470Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9702ms). Cost: $0.
-[2026-07-27T20:45:12.461Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9861ms). Cost: $0.
-[2026-07-27T21:00:12.361Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9883ms). Cost: $0.
-[2026-07-27T21:15:12.921Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10019ms). Cost: $0.
-[2026-07-27T21:30:14.110Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10035ms). Cost: $0.
-[2026-07-27T21:45:13.436Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-07-27T22:00:12.186Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9839ms). Cost: $0.
-[2026-07-27T22:15:13.020Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9735ms). Cost: $0.
-[2026-07-27T22:30:12.419Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9712ms). Cost: $0.
-[2026-07-27T22:45:11.835Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9847ms). Cost: $0.
-[2026-07-27T23:00:12.676Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9728ms). Cost: $0.
-[2026-07-27T23:15:11.497Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9768ms). Cost: $0.
-[2026-07-27T23:30:12.304Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9824ms). Cost: $0.
-[2026-07-27T23:45:11.604Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9752ms). Cost: $0.
-[2026-07-28T00:00:12.555Z] liveness: tier1 expired=88, tier2 checked=40 removed=0 (10040ms). Cost: $0.
-[2026-07-28T00:15:11.901Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9821ms). Cost: $0.
-[2026-07-28T00:30:12.370Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9717ms). Cost: $0.
-[2026-07-28T00:45:12.215Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9728ms). Cost: $0.
-[2026-07-28T01:00:12.104Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9802ms). Cost: $0.
-[2026-07-28T01:15:12.257Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9928ms). Cost: $0.
-[2026-07-28T01:30:11.826Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9728ms). Cost: $0.
-[2026-07-28T01:45:12.189Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9768ms). Cost: $0.
-[2026-07-28T02:00:12.775Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10391ms). Cost: $0.
-[2026-07-28T02:15:12.433Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-07-28T02:30:12.296Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-07-28T02:45:12.543Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9795ms). Cost: $0.
-[2026-07-28T03:00:12.426Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-07-28T03:15:12.338Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9861ms). Cost: $0.
-[2026-07-28T03:30:12.385Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10103ms). Cost: $0.
-[2026-07-28T03:45:12.779Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-07-28T04:00:12.627Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9806ms). Cost: $0.
-[2026-07-28T04:15:11.905Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9827ms). Cost: $0.
-[2026-07-28T04:30:12.706Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-07-28T04:45:12.182Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9857ms). Cost: $0.
-[2026-07-28T05:00:12.377Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9918ms). Cost: $0.
-[2026-07-28T05:15:12.099Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9812ms). Cost: $0.
-[2026-07-28T05:30:12.306Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10102ms). Cost: $0.
-[2026-07-28T05:45:12.677Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9811ms). Cost: $0.
-[2026-07-28T06:00:13.039Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-07-28T06:15:12.844Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9943ms). Cost: $0.
-[2026-07-28T06:30:12.146Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9893ms). Cost: $0.
-[2026-07-28T06:45:12.357Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9769ms). Cost: $0.
-[2026-07-28T07:00:12.427Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-07-28T07:15:11.960Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9932ms). Cost: $0.
-[2026-07-28T07:30:12.880Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-07-28T07:45:12.341Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-07-28T08:00:13.664Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10310ms). Cost: $0.
-[2026-07-28T08:15:12.899Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-07-28T08:30:42.736Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (40448ms). Cost: $0.
-[2026-07-28T08:45:11.906Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10002ms). Cost: $0.
-[2026-07-28T09:00:13.065Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-07-28T09:15:12.817Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9949ms). Cost: $0.
-[2026-07-28T09:30:12.602Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9799ms). Cost: $0.
-[2026-07-28T09:45:12.176Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9860ms). Cost: $0.
-[2026-07-28T10:00:12.809Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10142ms). Cost: $0.
-[2026-07-28T10:15:12.833Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10106ms). Cost: $0.
-[2026-07-28T10:30:12.680Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-07-28T10:45:12.876Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-07-28T11:00:13.279Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9984ms). Cost: $0.
-[2026-07-28T11:15:12.641Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9869ms). Cost: $0.
-[2026-07-28T11:30:12.664Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9853ms). Cost: $0.
-[2026-07-28T11:45:12.709Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-07-28T12:00:13.808Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10255ms). Cost: $0.
-[2026-07-28T12:15:12.882Z] liveness: tier1 expired=253, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-07-28T12:30:12.668Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9782ms). Cost: $0.
-[2026-07-28T12:45:11.980Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9763ms). Cost: $0.
-[2026-07-28T13:00:12.898Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (9927ms). Cost: $0.
-[2026-07-28T13:15:12.632Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9892ms). Cost: $0.
-[2026-07-28T13:30:12.688Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-07-28T13:45:11.807Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-07-28T14:00:44.094Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (40695ms). Cost: $0.
-[2026-07-28T14:15:12.593Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9729ms). Cost: $0.
-[2026-07-28T14:30:12.522Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9736ms). Cost: $0.
-[2026-07-28T14:45:12.124Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9755ms). Cost: $0.
-[2026-07-28T15:00:11.900Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9845ms). Cost: $0.
-[2026-07-28T15:15:11.987Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9977ms). Cost: $0.
-[2026-07-28T15:30:11.994Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9824ms). Cost: $0.
-[2026-07-28T15:45:12.518Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9894ms). Cost: $0.
-[2026-07-28T16:00:12.938Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10169ms). Cost: $0.
-[2026-07-28T16:15:12.521Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-07-28T16:30:12.606Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9892ms). Cost: $0.
-[2026-07-28T16:45:12.327Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9948ms). Cost: $0.
-[2026-07-28T17:00:44.836Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (41432ms). Cost: $0.
-[2026-07-28T17:15:12.732Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9783ms). Cost: $0.
-[2026-07-28T17:30:12.522Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9867ms). Cost: $0.
-[2026-07-28T17:45:12.428Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9863ms). Cost: $0.
-[2026-07-28T18:00:12.507Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-07-28T18:15:12.645Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-07-28T18:30:12.467Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-07-28T18:45:12.146Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10120ms). Cost: $0.
-[2026-07-28T19:00:13.132Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-07-28T19:15:12.749Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10113ms). Cost: $0.
-[2026-07-28T19:30:12.775Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10316ms). Cost: $0.
-[2026-07-28T19:45:12.651Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-07-28T20:00:13.050Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9976ms). Cost: $0.
-[2026-07-28T20:15:12.369Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9975ms). Cost: $0.
-[2026-07-28T20:30:12.652Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10033ms). Cost: $0.
-[2026-07-28T20:45:12.413Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9806ms). Cost: $0.
-[2026-07-28T21:00:12.363Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-07-28T21:15:13.571Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-07-28T21:30:12.458Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9942ms). Cost: $0.
-[2026-07-28T21:45:12.505Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9733ms). Cost: $0.
-[2026-07-28T22:00:13.742Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (10058ms). Cost: $0.
-[2026-07-28T22:15:12.491Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-07-28T22:30:13.335Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-07-28T22:45:12.419Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9904ms). Cost: $0.
-[2026-07-28T23:00:12.319Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (9916ms). Cost: $0.
-[2026-07-28T23:15:12.404Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9860ms). Cost: $0.
-[2026-07-28T23:30:12.034Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9939ms). Cost: $0.
-[2026-07-28T23:45:11.500Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9760ms). Cost: $0.
-[2026-07-29T00:00:13.322Z] liveness: tier1 expired=43, tier2 checked=40 removed=0 (10086ms). Cost: $0.
-[2026-07-29T00:15:11.988Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-07-29T00:30:12.308Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (9730ms). Cost: $0.
-[2026-07-29T00:45:12.346Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9762ms). Cost: $0.
-[2026-07-29T01:00:12.132Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (9769ms). Cost: $0.
-[2026-07-29T01:15:12.027Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9747ms). Cost: $0.
-[2026-07-29T01:30:12.468Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9695ms). Cost: $0.
-[2026-07-29T01:45:11.592Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9709ms). Cost: $0.
-[2026-07-29T02:00:12.676Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10040ms). Cost: $0.
-[2026-07-29T02:15:12.537Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9879ms). Cost: $0.
-[2026-07-29T02:30:12.252Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-07-29T02:45:11.761Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9802ms). Cost: $0.
-[2026-07-29T03:00:12.772Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-07-29T03:15:12.903Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10213ms). Cost: $0.
-[2026-07-29T03:30:12.973Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9977ms). Cost: $0.
-[2026-07-29T03:45:12.644Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9809ms). Cost: $0.
-[2026-07-29T04:00:12.522Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9884ms). Cost: $0.
-[2026-07-29T04:15:12.379Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9811ms). Cost: $0.
-[2026-07-29T04:30:12.971Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10152ms). Cost: $0.
-[2026-07-29T04:45:12.453Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9851ms). Cost: $0.
-[2026-07-29T05:00:12.737Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9977ms). Cost: $0.
-[2026-07-29T05:15:12.535Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-07-29T05:30:12.578Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-07-29T05:45:12.137Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-07-29T06:00:12.515Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9854ms). Cost: $0.
-[2026-07-29T06:15:13.362Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10331ms). Cost: $0.
-[2026-07-29T06:30:12.608Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9759ms). Cost: $0.
-[2026-07-29T06:45:12.298Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9745ms). Cost: $0.
-[2026-07-29T07:00:12.357Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9966ms). Cost: $0.
-[2026-07-29T07:15:12.403Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9909ms). Cost: $0.
-[2026-07-29T07:30:12.594Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9861ms). Cost: $0.
-[2026-07-29T07:45:12.436Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-07-29T08:00:13.061Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-07-29T08:15:12.622Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-07-29T08:30:12.312Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9910ms). Cost: $0.
-[2026-07-29T08:45:12.346Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-07-29T09:00:12.403Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-07-29T09:15:11.975Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-07-29T09:30:12.109Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10005ms). Cost: $0.
-[2026-07-29T09:45:12.436Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-07-29T10:00:12.490Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-07-29T10:15:13.543Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10451ms). Cost: $0.
-[2026-07-29T10:30:12.892Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10056ms). Cost: $0.
-[2026-07-29T10:45:12.983Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-07-29T11:00:13.377Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10577ms). Cost: $0.
-[2026-07-29T11:15:12.061Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10040ms). Cost: $0.
-[2026-07-29T11:30:12.503Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10194ms). Cost: $0.
-[2026-07-29T11:45:13.521Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10487ms). Cost: $0.
-[2026-07-29T12:00:13.174Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10220ms). Cost: $0.
-[2026-07-29T12:15:12.335Z] liveness: tier1 expired=244, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-07-29T12:30:12.019Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9802ms). Cost: $0.
-[2026-07-29T12:45:12.582Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-07-29T13:00:12.528Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9821ms). Cost: $0.
-[2026-07-29T13:15:12.153Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-07-29T13:30:12.311Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9959ms). Cost: $0.
-[2026-07-29T13:45:12.270Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9697ms). Cost: $0.
-[2026-07-29T14:00:13.025Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9738ms). Cost: $0.
-[2026-07-29T14:15:12.482Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-07-29T14:30:12.800Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10530ms). Cost: $0.
-[2026-07-29T14:45:12.676Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-07-29T15:00:12.750Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (9932ms). Cost: $0.
-[2026-07-29T15:15:12.564Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9801ms). Cost: $0.
-[2026-07-29T15:30:12.972Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9933ms). Cost: $0.
-[2026-07-29T15:45:12.576Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9785ms). Cost: $0.
-[2026-07-29T16:00:12.427Z] liveness: tier1 expired=33, tier2 checked=40 removed=0 (9792ms). Cost: $0.
-[2026-07-29T16:15:12.495Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9873ms). Cost: $0.
-[2026-07-29T16:30:12.306Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9873ms). Cost: $0.
-[2026-07-29T16:45:12.273Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9819ms). Cost: $0.
-[2026-07-29T17:00:12.274Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (9921ms). Cost: $0.
-[2026-07-29T17:15:12.134Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9798ms). Cost: $0.
-[2026-07-29T17:30:12.307Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-07-29T17:45:12.157Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-07-29T18:00:13.095Z] liveness: tier1 expired=28, tier2 checked=40 removed=0 (9797ms). Cost: $0.
-[2026-07-29T18:15:12.934Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9825ms). Cost: $0.
-[2026-07-29T18:30:12.892Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-07-29T18:45:13.060Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10460ms). Cost: $0.
-[2026-07-29T19:00:13.085Z] liveness: tier1 expired=23, tier2 checked=40 removed=0 (9850ms). Cost: $0.
-[2026-07-29T19:15:12.831Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9937ms). Cost: $0.
-[2026-07-29T19:30:12.476Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9748ms). Cost: $0.
-[2026-07-29T19:45:12.397Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9850ms). Cost: $0.
-[2026-07-29T20:00:12.766Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-07-29T20:15:12.678Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9883ms). Cost: $0.
-[2026-07-29T20:30:12.340Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9790ms). Cost: $0.
-[2026-07-29T20:45:12.589Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-07-29T21:00:12.503Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10017ms). Cost: $0.
-[2026-07-29T21:15:12.653Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9829ms). Cost: $0.
-[2026-07-29T21:30:12.464Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9883ms). Cost: $0.
-[2026-07-29T21:45:12.665Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9834ms). Cost: $0.
-[2026-07-29T22:00:12.642Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9868ms). Cost: $0.
-[2026-07-29T22:15:11.821Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9848ms). Cost: $0.
-[2026-07-29T22:30:12.357Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9751ms). Cost: $0.
-[2026-07-29T22:45:12.492Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9838ms). Cost: $0.
-[2026-07-29T23:00:12.296Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9792ms). Cost: $0.
-[2026-07-29T23:15:12.382Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-07-29T23:30:12.152Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9814ms). Cost: $0.
-[2026-07-29T23:45:11.850Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9805ms). Cost: $0.
-[2026-07-30T00:00:12.759Z] liveness: tier1 expired=26, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-07-30T00:15:12.555Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9765ms). Cost: $0.
-[2026-07-30T00:30:12.185Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9938ms). Cost: $0.
-[2026-07-30T00:45:11.937Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-07-30T01:00:11.967Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-07-30T01:15:12.374Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9884ms). Cost: $0.
-[2026-07-30T01:30:12.280Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9774ms). Cost: $0.
-[2026-07-30T01:45:12.890Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9794ms). Cost: $0.
-[2026-07-30T02:00:12.872Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-07-30T02:15:12.752Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-07-30T02:30:12.824Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9808ms). Cost: $0.
-[2026-07-30T02:45:12.460Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9978ms). Cost: $0.
-[2026-07-30T03:00:12.420Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9927ms). Cost: $0.
-[2026-07-30T03:15:13.109Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9831ms). Cost: $0.
-[2026-07-30T03:30:13.871Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-07-30T03:45:12.435Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9991ms). Cost: $0.
-[2026-07-30T04:00:12.215Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10109ms). Cost: $0.
-[2026-07-30T04:15:12.185Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-07-30T04:30:12.095Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9824ms). Cost: $0.
-[2026-07-30T04:45:12.452Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9981ms). Cost: $0.
-[2026-07-30T05:00:12.714Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9964ms). Cost: $0.
-[2026-07-30T05:15:12.444Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9814ms). Cost: $0.
-[2026-07-30T05:30:12.094Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9827ms). Cost: $0.
-[2026-07-30T05:45:12.448Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9962ms). Cost: $0.
-[2026-07-30T06:00:12.506Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-07-30T06:15:12.936Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10048ms). Cost: $0.
-[2026-07-30T06:30:12.227Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9805ms). Cost: $0.
-[2026-07-30T06:45:11.938Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9822ms). Cost: $0.
-[2026-07-30T07:00:12.678Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-07-30T07:15:11.773Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9718ms). Cost: $0.
-[2026-07-30T07:30:12.314Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9785ms). Cost: $0.
-[2026-07-30T07:45:12.005Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-07-30T08:00:12.895Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-07-30T08:15:12.463Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9825ms). Cost: $0.
-[2026-07-30T08:30:12.452Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9933ms). Cost: $0.
-[2026-07-30T08:45:12.425Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9853ms). Cost: $0.
-[2026-07-30T09:00:12.109Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-07-30T09:15:12.367Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9760ms). Cost: $0.
-[2026-07-30T09:30:12.593Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9908ms). Cost: $0.
-[2026-07-30T09:45:12.106Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-07-30T10:00:13.065Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-07-30T10:15:12.849Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9941ms). Cost: $0.
-[2026-07-30T10:30:12.094Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9783ms). Cost: $0.
-[2026-07-30T10:45:12.639Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9797ms). Cost: $0.
-[2026-07-30T11:00:12.927Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-07-30T11:15:12.540Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9818ms). Cost: $0.
-[2026-07-30T11:30:12.393Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-07-30T11:45:12.663Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-07-30T12:00:12.839Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10017ms). Cost: $0.
-[2026-07-30T12:15:12.595Z] liveness: tier1 expired=245, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-07-30T12:30:12.333Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9774ms). Cost: $0.
-[2026-07-30T12:45:12.774Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10147ms). Cost: $0.
-[2026-07-30T13:00:14.386Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (11730ms). Cost: $0.
-[2026-07-30T13:15:12.028Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-07-30T13:30:12.023Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-07-30T13:45:12.494Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9842ms). Cost: $0.
-[2026-07-30T14:00:12.205Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9917ms). Cost: $0.
-[2026-07-30T14:15:12.092Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9820ms). Cost: $0.
-[2026-07-30T14:30:12.498Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9711ms). Cost: $0.
-[2026-07-30T14:45:12.395Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9710ms). Cost: $0.
-[2026-07-30T15:00:12.318Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (9919ms). Cost: $0.
-[2026-07-30T15:15:12.608Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9965ms). Cost: $0.
-[2026-07-30T15:30:12.158Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9832ms). Cost: $0.
-[2026-07-30T15:45:12.475Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9727ms). Cost: $0.
-[2026-07-30T16:00:12.306Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (9818ms). Cost: $0.
-[2026-07-30T16:15:42.905Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (40253ms). Cost: $0.
-[2026-07-30T16:30:12.654Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10263ms). Cost: $0.
-[2026-07-30T16:45:12.635Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-07-30T17:00:13.125Z] liveness: tier1 expired=55, tier2 checked=40 removed=0 (10195ms). Cost: $0.
-[2026-07-30T17:15:11.829Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9825ms). Cost: $0.
-[2026-07-30T17:30:12.447Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9705ms). Cost: $0.
-[2026-07-30T17:45:11.932Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9783ms). Cost: $0.
-[2026-07-30T18:00:12.547Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (9798ms). Cost: $0.
-[2026-07-30T18:15:12.682Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9909ms). Cost: $0.
-[2026-07-30T18:30:12.532Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9808ms). Cost: $0.
-[2026-07-30T18:45:12.266Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9738ms). Cost: $0.
-[2026-07-30T19:00:12.259Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-07-30T19:15:12.725Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-07-30T19:30:12.891Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9928ms). Cost: $0.
-[2026-07-30T19:45:12.707Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-07-30T20:00:13.216Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-07-30T20:15:11.750Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-07-30T20:30:12.376Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9845ms). Cost: $0.
-[2026-07-30T20:45:12.027Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-07-30T21:00:12.710Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9851ms). Cost: $0.
-[2026-07-30T21:15:12.496Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-07-30T21:30:12.385Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9847ms). Cost: $0.
-[2026-07-30T21:45:11.733Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9699ms). Cost: $0.
-[2026-07-30T22:00:12.437Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-07-30T22:15:12.684Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10005ms). Cost: $0.
-[2026-07-30T22:30:11.708Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9789ms). Cost: $0.
-[2026-07-30T22:45:12.032Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9818ms). Cost: $0.
-[2026-07-30T23:00:12.888Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9787ms). Cost: $0.
-[2026-07-30T23:15:12.388Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9863ms). Cost: $0.
-[2026-07-30T23:30:11.787Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-07-30T23:45:11.681Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9704ms). Cost: $0.
-[2026-07-31T00:00:12.291Z] liveness: tier1 expired=49, tier2 checked=40 removed=0 (9857ms). Cost: $0.
-[2026-07-31T00:15:12.125Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9790ms). Cost: $0.
-[2026-07-31T00:30:12.433Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9736ms). Cost: $0.
-[2026-07-31T00:45:12.211Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9793ms). Cost: $0.
-[2026-07-31T01:00:12.660Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9782ms). Cost: $0.
-[2026-07-31T01:15:12.248Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9791ms). Cost: $0.
-[2026-07-31T01:30:12.269Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9844ms). Cost: $0.
-[2026-07-31T01:45:12.505Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9739ms). Cost: $0.
-[2026-07-31T02:00:12.277Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (9899ms). Cost: $0.
-[2026-07-31T02:15:11.910Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9896ms). Cost: $0.
-[2026-07-31T02:30:12.250Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-07-31T02:45:12.350Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9715ms). Cost: $0.
-[2026-07-31T03:00:12.341Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-07-31T03:15:12.318Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9849ms). Cost: $0.
-[2026-07-31T03:30:12.417Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-07-31T03:45:12.326Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10025ms). Cost: $0.
-[2026-07-31T04:00:12.869Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9921ms). Cost: $0.
-[2026-07-31T04:15:11.985Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9820ms). Cost: $0.
-[2026-07-31T04:30:11.922Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-07-31T04:45:12.565Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-07-31T05:00:12.596Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9888ms). Cost: $0.
-[2026-07-31T05:15:12.747Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9896ms). Cost: $0.
-[2026-07-31T05:30:12.734Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9843ms). Cost: $0.
-[2026-07-31T05:45:12.492Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9765ms). Cost: $0.
-[2026-07-31T06:00:12.355Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9935ms). Cost: $0.
-[2026-07-31T06:15:12.958Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-07-31T06:30:12.301Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-07-31T06:45:12.486Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9959ms). Cost: $0.
-[2026-07-31T07:00:12.483Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-07-31T07:15:12.429Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9821ms). Cost: $0.
-[2026-07-31T07:30:12.376Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-07-31T07:45:11.948Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-07-31T08:00:42.611Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (40316ms). Cost: $0.
-[2026-07-31T08:15:12.059Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9925ms). Cost: $0.
-[2026-07-31T08:30:12.726Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-07-31T08:45:12.198Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9714ms). Cost: $0.
-[2026-07-31T09:00:11.847Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9838ms). Cost: $0.
-[2026-07-31T09:15:11.766Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-07-31T09:30:12.891Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10002ms). Cost: $0.
-[2026-07-31T09:45:11.899Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9906ms). Cost: $0.
-[2026-07-31T10:00:12.937Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-07-31T10:15:12.742Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9869ms). Cost: $0.
-[2026-07-31T10:30:12.886Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-07-31T10:45:12.797Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-07-31T11:00:13.390Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10073ms). Cost: $0.
-[2026-07-31T11:15:12.260Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9800ms). Cost: $0.
-[2026-07-31T11:30:12.028Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9903ms). Cost: $0.
-[2026-07-31T11:45:12.126Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9759ms). Cost: $0.
-[2026-07-31T12:00:12.517Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9801ms). Cost: $0.
-[2026-07-31T12:15:11.653Z] liveness: tier1 expired=267, tier2 checked=40 removed=0 (9655ms). Cost: $0.
-[2026-07-31T12:30:12.362Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9683ms). Cost: $0.
-[2026-07-31T12:45:12.206Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9513ms). Cost: $0.
-[2026-07-31T13:00:11.608Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9664ms). Cost: $0.
-[2026-07-31T13:15:11.957Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9703ms). Cost: $0.
-[2026-07-31T13:30:12.517Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9860ms). Cost: $0.
-[2026-07-31T13:45:12.505Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-07-31T14:00:12.404Z] liveness: tier1 expired=20, tier2 checked=40 removed=0 (9786ms). Cost: $0.
-[2026-07-31T14:15:11.974Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9635ms). Cost: $0.
-[2026-07-31T14:30:12.396Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9740ms). Cost: $0.
-[2026-07-31T14:45:11.957Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9813ms). Cost: $0.
-[2026-07-31T15:00:12.484Z] liveness: tier1 expired=31, tier2 checked=40 removed=0 (9671ms). Cost: $0.
-[2026-07-31T15:15:11.912Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9736ms). Cost: $0.
-[2026-07-31T15:30:12.496Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9787ms). Cost: $0.
-[2026-07-31T15:45:12.062Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9738ms). Cost: $0.
-[2026-07-31T16:00:12.537Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9819ms). Cost: $0.
-[2026-07-31T16:15:11.956Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9878ms). Cost: $0.
-[2026-07-31T16:30:12.449Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-07-31T16:45:11.815Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-07-31T17:00:12.995Z] liveness: tier1 expired=49, tier2 checked=40 removed=0 (10145ms). Cost: $0.
-[2026-07-31T17:15:12.210Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-07-31T17:30:11.667Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9800ms). Cost: $0.
-[2026-07-31T17:45:11.971Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10073ms). Cost: $0.
-[2026-07-31T18:00:12.571Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-07-31T18:15:12.518Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10097ms). Cost: $0.
-[2026-07-31T18:30:12.348Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9792ms). Cost: $0.
-[2026-07-31T18:45:12.568Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9781ms). Cost: $0.
-[2026-07-31T19:00:12.565Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (9914ms). Cost: $0.
-[2026-07-31T19:15:12.009Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10026ms). Cost: $0.
-[2026-07-31T19:30:12.277Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9845ms). Cost: $0.
-[2026-07-31T19:45:11.960Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9865ms). Cost: $0.
-[2026-07-31T20:00:12.883Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9904ms). Cost: $0.
-[2026-07-31T20:15:12.429Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-07-31T20:30:12.737Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9861ms). Cost: $0.
-[2026-07-31T20:45:12.309Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9773ms). Cost: $0.
-[2026-07-31T21:00:13.017Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10386ms). Cost: $0.
-[2026-07-31T21:15:12.015Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9822ms). Cost: $0.
-[2026-07-31T21:30:12.673Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-07-31T21:45:12.552Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9932ms). Cost: $0.
-[2026-07-31T22:00:12.300Z] liveness: tier1 expired=21, tier2 checked=40 removed=0 (9787ms). Cost: $0.
-[2026-07-31T22:15:12.602Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9970ms). Cost: $0.
-[2026-07-31T22:30:12.311Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-07-31T22:45:12.130Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9944ms). Cost: $0.
-[2026-07-31T23:00:11.953Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-07-31T23:15:12.307Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-07-31T23:30:12.367Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-07-31T23:45:12.204Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9836ms). Cost: $0.
-[2026-08-01T00:00:12.046Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9959ms). Cost: $0.
-[2026-08-01T00:15:12.540Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10059ms). Cost: $0.
-[2026-08-01T00:30:11.953Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9828ms). Cost: $0.
-[2026-08-01T00:45:12.408Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9808ms). Cost: $0.
-[2026-08-01T01:00:13.053Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-08-01T01:15:12.662Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9859ms). Cost: $0.
-[2026-08-01T01:30:12.424Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9928ms). Cost: $0.
-[2026-08-01T01:45:12.216Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9874ms). Cost: $0.
-[2026-08-01T02:00:12.143Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-08-01T02:15:12.622Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-08-01T02:30:12.380Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9930ms). Cost: $0.
-[2026-08-01T02:45:12.361Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9761ms). Cost: $0.
-[2026-08-01T03:00:12.313Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10042ms). Cost: $0.
-[2026-08-01T03:15:12.353Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9843ms). Cost: $0.
-[2026-08-01T03:30:12.319Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-08-01T03:45:12.208Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9816ms). Cost: $0.
-[2026-08-01T04:00:12.236Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9848ms). Cost: $0.
-[2026-08-01T04:15:12.653Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10005ms). Cost: $0.
-[2026-08-01T04:30:12.345Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9816ms). Cost: $0.
-[2026-08-01T04:45:12.096Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9836ms). Cost: $0.
-[2026-08-01T05:00:12.909Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9943ms). Cost: $0.
-[2026-08-01T05:15:11.966Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9776ms). Cost: $0.
-[2026-08-01T05:30:12.655Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10048ms). Cost: $0.
-[2026-08-01T05:45:12.157Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-08-01T06:00:12.817Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-01T06:15:43.710Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (40988ms). Cost: $0.
-[2026-08-01T06:30:12.391Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-08-01T06:45:12.675Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-01T07:00:12.176Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9784ms). Cost: $0.
-[2026-08-01T07:15:11.751Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9784ms). Cost: $0.
-[2026-08-01T07:30:12.226Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9782ms). Cost: $0.
-[2026-08-01T07:45:12.334Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9814ms). Cost: $0.
-[2026-08-01T08:00:13.096Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10367ms). Cost: $0.
-[2026-08-01T08:15:11.983Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9981ms). Cost: $0.
-[2026-08-01T08:30:11.829Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9925ms). Cost: $0.
-[2026-08-01T08:45:12.648Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9786ms). Cost: $0.
-[2026-08-01T09:00:12.639Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-08-01T09:15:12.281Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-08-01T09:30:12.651Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10293ms). Cost: $0.
-[2026-08-01T09:45:12.321Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9954ms). Cost: $0.
-[2026-08-01T10:00:12.235Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-08-01T10:15:13.093Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10194ms). Cost: $0.
-[2026-08-01T10:30:12.135Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-08-01T10:45:13.080Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10150ms). Cost: $0.
-[2026-08-01T11:00:42.879Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (40631ms). Cost: $0.
-[2026-08-01T11:15:12.499Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-01T11:30:12.687Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-08-01T11:45:12.910Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-08-01T12:00:12.175Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-08-01T12:15:12.513Z] liveness: tier1 expired=87, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-08-01T12:30:12.499Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10029ms). Cost: $0.
-[2026-08-01T12:45:12.453Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9851ms). Cost: $0.
-[2026-08-01T13:00:12.285Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-08-01T13:15:12.629Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9854ms). Cost: $0.
-[2026-08-01T13:30:12.309Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-08-01T13:45:12.096Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9923ms). Cost: $0.
-[2026-08-01T14:00:12.368Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9958ms). Cost: $0.
-[2026-08-01T14:15:12.223Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-08-01T14:30:11.728Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9805ms). Cost: $0.
-[2026-08-01T14:45:12.242Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-08-01T15:00:11.943Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-01T15:15:12.134Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9942ms). Cost: $0.
-[2026-08-01T15:30:12.765Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-08-01T15:45:11.481Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9708ms). Cost: $0.
-[2026-08-01T16:00:12.051Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-08-01T16:15:11.701Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9771ms). Cost: $0.
-[2026-08-01T16:30:12.517Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10005ms). Cost: $0.
-[2026-08-01T16:45:12.515Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9795ms). Cost: $0.
-[2026-08-01T17:00:12.351Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (9952ms). Cost: $0.
-[2026-08-01T17:15:11.927Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-08-01T17:30:12.385Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9824ms). Cost: $0.
-[2026-08-01T17:45:11.717Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9845ms). Cost: $0.
-[2026-08-01T18:00:12.617Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-08-01T18:15:12.296Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9830ms). Cost: $0.
-[2026-08-01T18:30:11.834Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-08-01T18:45:12.518Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9838ms). Cost: $0.
-[2026-08-01T19:00:12.283Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9918ms). Cost: $0.
-[2026-08-01T19:15:12.268Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9817ms). Cost: $0.
-[2026-08-01T19:30:12.116Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9959ms). Cost: $0.
-[2026-08-01T19:45:12.072Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9752ms). Cost: $0.
-[2026-08-01T20:00:11.989Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (9892ms). Cost: $0.
-[2026-08-01T20:15:12.045Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9868ms). Cost: $0.
-[2026-08-01T20:30:12.443Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9738ms). Cost: $0.
-[2026-08-01T20:45:11.695Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9698ms). Cost: $0.
-[2026-08-01T21:00:12.372Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9780ms). Cost: $0.
-[2026-08-01T21:15:12.381Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9691ms). Cost: $0.
-[2026-08-01T21:30:12.028Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9719ms). Cost: $0.
-[2026-08-01T21:45:12.278Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9812ms). Cost: $0.
-[2026-08-01T22:00:11.907Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-08-01T22:15:12.004Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-08-01T22:30:12.376Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9747ms). Cost: $0.
-[2026-08-01T22:45:12.261Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9813ms). Cost: $0.
-[2026-08-01T23:00:11.970Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9854ms). Cost: $0.
-[2026-08-01T23:15:12.087Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9848ms). Cost: $0.
-[2026-08-01T23:30:12.537Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9812ms). Cost: $0.
-[2026-08-01T23:45:12.337Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9675ms). Cost: $0.
-[2026-08-02T00:00:12.166Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9904ms). Cost: $0.
-[2026-08-02T00:15:12.221Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9828ms). Cost: $0.
-[2026-08-02T00:30:11.544Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9750ms). Cost: $0.
-[2026-08-02T00:45:12.209Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9824ms). Cost: $0.
-[2026-08-02T01:00:11.873Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9865ms). Cost: $0.
-[2026-08-02T01:15:12.134Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9751ms). Cost: $0.
-[2026-08-02T01:30:12.591Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9828ms). Cost: $0.
-[2026-08-02T01:45:12.313Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-08-02T02:00:14.008Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (11854ms). Cost: $0.
-[2026-08-02T02:15:12.572Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9881ms). Cost: $0.
-[2026-08-02T02:30:12.276Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-08-02T02:45:12.606Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9937ms). Cost: $0.
-[2026-08-02T03:00:12.069Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9799ms). Cost: $0.
-[2026-08-02T03:15:12.375Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-08-02T03:30:13.165Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10008ms). Cost: $0.
-[2026-08-02T03:45:11.831Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9960ms). Cost: $0.
-[2026-08-02T04:00:12.676Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-08-02T04:15:12.554Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9795ms). Cost: $0.
-[2026-08-02T04:30:12.022Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9780ms). Cost: $0.
-[2026-08-02T04:45:11.703Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9814ms). Cost: $0.
-[2026-08-02T05:00:12.664Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9930ms). Cost: $0.
-[2026-08-02T05:15:12.243Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9829ms). Cost: $0.
-[2026-08-02T05:30:11.715Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9875ms). Cost: $0.
-[2026-08-02T05:45:11.539Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9789ms). Cost: $0.
-[2026-08-02T06:00:12.313Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9852ms). Cost: $0.
-[2026-08-02T06:15:42.430Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (40347ms). Cost: $0.
-[2026-08-02T06:30:12.245Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9828ms). Cost: $0.
-[2026-08-02T06:45:12.112Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9797ms). Cost: $0.
-[2026-08-02T07:00:12.441Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-08-02T07:15:11.681Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9787ms). Cost: $0.
-[2026-08-02T07:30:11.748Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9640ms). Cost: $0.
-[2026-08-02T07:45:11.864Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-08-02T08:00:12.182Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-08-02T08:15:12.172Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9645ms). Cost: $0.
-[2026-08-02T08:30:11.362Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9643ms). Cost: $0.
-[2026-08-02T08:45:11.564Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9833ms). Cost: $0.
-[2026-08-02T09:00:11.766Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9681ms). Cost: $0.
-[2026-08-02T09:15:11.566Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9729ms). Cost: $0.
-[2026-08-02T09:30:12.165Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-08-02T09:45:11.531Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9772ms). Cost: $0.
-[2026-08-02T10:00:11.800Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9639ms). Cost: $0.
-[2026-08-02T10:15:12.314Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9892ms). Cost: $0.
-[2026-08-02T10:30:11.930Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9852ms). Cost: $0.
-[2026-08-02T10:45:12.201Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9805ms). Cost: $0.
-[2026-08-02T11:00:11.925Z] liveness: tier1 expired=26, tier2 checked=40 removed=0 (9831ms). Cost: $0.
-[2026-08-02T11:15:11.856Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-08-02T11:30:12.306Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9918ms). Cost: $0.
-[2026-08-02T11:45:11.791Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9730ms). Cost: $0.
-[2026-08-02T12:00:12.407Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9668ms). Cost: $0.
-[2026-08-02T12:15:12.639Z] liveness: tier1 expired=94, tier2 checked=40 removed=0 (9906ms). Cost: $0.
-[2026-08-02T12:30:12.183Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9939ms). Cost: $0.
-[2026-08-02T12:45:12.090Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-08-02T13:00:12.733Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (9916ms). Cost: $0.
-[2026-08-02T13:15:11.767Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9615ms). Cost: $0.
-[2026-08-02T13:30:12.375Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9899ms). Cost: $0.
-[2026-08-02T13:45:11.832Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9843ms). Cost: $0.
-[2026-08-02T14:00:12.380Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-08-02T14:15:11.710Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9726ms). Cost: $0.
-[2026-08-02T14:30:11.958Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9705ms). Cost: $0.
-[2026-08-02T14:45:11.943Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-08-02T15:00:12.295Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-08-02T15:15:12.110Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-08-02T15:30:12.396Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9676ms). Cost: $0.
-[2026-08-02T15:45:12.179Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9687ms). Cost: $0.
-[2026-08-02T16:00:12.644Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9838ms). Cost: $0.
-[2026-08-02T16:15:11.440Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9725ms). Cost: $0.
-[2026-08-02T16:30:11.763Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9641ms). Cost: $0.
-[2026-08-02T16:45:11.577Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9598ms). Cost: $0.
-[2026-08-02T17:00:12.229Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-08-02T17:15:12.063Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9908ms). Cost: $0.
-[2026-08-02T17:30:12.275Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9607ms). Cost: $0.
-[2026-08-02T17:45:12.732Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9916ms). Cost: $0.
-[2026-08-02T18:00:12.229Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9793ms). Cost: $0.
-[2026-08-02T18:15:12.177Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9853ms). Cost: $0.
-[2026-08-02T18:30:12.442Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9709ms). Cost: $0.
-[2026-08-02T18:45:12.337Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-08-02T19:00:11.923Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-02T19:15:12.595Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-08-02T19:30:12.128Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-08-02T19:45:11.749Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9727ms). Cost: $0.
-[2026-08-02T20:00:12.050Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9778ms). Cost: $0.
-[2026-08-02T20:15:12.306Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9716ms). Cost: $0.
-[2026-08-02T20:30:11.606Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9787ms). Cost: $0.
-[2026-08-02T20:45:11.457Z] liveness: tier1 expired=33, tier2 checked=40 removed=0 (9770ms). Cost: $0.
-[2026-08-02T21:00:11.792Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9754ms). Cost: $0.
-[2026-08-02T21:15:11.874Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9728ms). Cost: $0.
-[2026-08-02T21:30:12.527Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9821ms). Cost: $0.
-[2026-08-02T21:45:12.429Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9808ms). Cost: $0.
-[2026-08-02T22:00:12.069Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10013ms). Cost: $0.
-[2026-08-02T22:15:12.069Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9909ms). Cost: $0.
-[2026-08-02T22:30:12.401Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-02T22:45:11.879Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-08-02T23:00:12.465Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-08-02T23:15:12.292Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9699ms). Cost: $0.
-[2026-08-02T23:30:11.663Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9671ms). Cost: $0.
-[2026-08-02T23:45:12.155Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-08-03T00:00:12.701Z] liveness: tier1 expired=90, tier2 checked=40 removed=0 (9754ms). Cost: $0.
-[2026-08-03T00:15:11.574Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-08-03T00:30:12.100Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-08-03T00:45:11.684Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9730ms). Cost: $0.
-[2026-08-03T01:00:12.019Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9763ms). Cost: $0.
-[2026-08-03T01:15:11.762Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9794ms). Cost: $0.
-[2026-08-03T01:30:12.803Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10330ms). Cost: $0.
-[2026-08-03T01:45:12.371Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10261ms). Cost: $0.
-[2026-08-03T02:00:12.350Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10417ms). Cost: $0.
-[2026-08-03T02:15:12.683Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9875ms). Cost: $0.
-[2026-08-03T02:30:12.226Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9770ms). Cost: $0.
-[2026-08-03T02:45:11.717Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-08-03T03:00:12.098Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9799ms). Cost: $0.
-[2026-08-03T03:15:12.346Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9941ms). Cost: $0.
-[2026-08-03T03:30:12.019Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10270ms). Cost: $0.
-[2026-08-03T03:45:12.336Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9917ms). Cost: $0.
-[2026-08-03T04:00:11.993Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9818ms). Cost: $0.
-[2026-08-03T04:15:11.888Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9813ms). Cost: $0.
-[2026-08-03T04:30:12.079Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9727ms). Cost: $0.
-[2026-08-03T04:45:11.645Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9850ms). Cost: $0.
-[2026-08-03T05:00:12.473Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10029ms). Cost: $0.
-[2026-08-03T05:15:11.976Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9842ms). Cost: $0.
-[2026-08-03T05:30:12.684Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9936ms). Cost: $0.
-[2026-08-03T05:45:12.007Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9758ms). Cost: $0.
-[2026-08-03T06:00:12.705Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10008ms). Cost: $0.
-[2026-08-03T06:15:43.255Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (40514ms). Cost: $0.
-[2026-08-03T06:30:13.160Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10275ms). Cost: $0.
-[2026-08-03T06:45:11.691Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9785ms). Cost: $0.
-[2026-08-03T07:00:12.184Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9919ms). Cost: $0.
-[2026-08-03T07:15:11.908Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10019ms). Cost: $0.
-[2026-08-03T07:30:12.216Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10334ms). Cost: $0.
-[2026-08-03T07:45:12.848Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10290ms). Cost: $0.
-[2026-08-03T08:00:13.399Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10559ms). Cost: $0.
-[2026-08-03T08:15:12.434Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10100ms). Cost: $0.
-[2026-08-03T08:30:12.542Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9741ms). Cost: $0.
-[2026-08-03T08:45:12.476Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9819ms). Cost: $0.
-[2026-08-03T09:00:11.988Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-08-03T09:15:11.669Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9882ms). Cost: $0.
-[2026-08-03T09:30:12.544Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-08-03T09:45:12.413Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9935ms). Cost: $0.
-[2026-08-03T10:00:12.383Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9910ms). Cost: $0.
-[2026-08-03T10:15:11.709Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-08-03T10:30:12.523Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9952ms). Cost: $0.
-[2026-08-03T10:45:12.052Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-03T11:00:12.243Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10086ms). Cost: $0.
-[2026-08-03T11:15:12.514Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-08-03T11:30:42.956Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (40370ms). Cost: $0.
-[2026-08-03T11:45:11.994Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9830ms). Cost: $0.
-[2026-08-03T12:00:12.433Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9744ms). Cost: $0.
-[2026-08-03T12:15:12.105Z] liveness: tier1 expired=193, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-08-03T12:30:11.979Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10030ms). Cost: $0.
-[2026-08-03T12:45:12.796Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-08-03T13:00:12.429Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (9830ms). Cost: $0.
-[2026-08-03T13:15:12.351Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10137ms). Cost: $0.
-[2026-08-03T13:30:13.172Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10106ms). Cost: $0.
-[2026-08-03T13:45:11.878Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9814ms). Cost: $0.
-[2026-08-03T14:00:42.671Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (40406ms). Cost: $0.
-[2026-08-03T14:15:12.298Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10080ms). Cost: $0.
-[2026-08-03T14:30:12.497Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10367ms). Cost: $0.
-[2026-08-03T14:45:12.420Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9864ms). Cost: $0.
-[2026-08-03T15:00:12.006Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9887ms). Cost: $0.
-[2026-08-03T15:15:12.373Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9849ms). Cost: $0.
-[2026-08-03T15:30:11.970Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-03T15:45:12.071Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-08-03T16:00:11.842Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-08-03T16:15:12.037Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-08-03T16:30:12.467Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9866ms). Cost: $0.
-[2026-08-03T16:45:12.070Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9796ms). Cost: $0.
-[2026-08-03T17:00:12.390Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (9781ms). Cost: $0.
-[2026-08-03T17:15:11.923Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-08-03T17:30:12.123Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9660ms). Cost: $0.
-[2026-08-03T17:45:11.418Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9801ms). Cost: $0.
-[2026-08-03T18:00:12.087Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-08-03T18:15:12.373Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-08-03T18:30:11.762Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9935ms). Cost: $0.
-[2026-08-03T18:45:11.957Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10057ms). Cost: $0.
-[2026-08-03T19:00:12.316Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-08-03T19:15:12.218Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9763ms). Cost: $0.
-[2026-08-03T19:30:11.588Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9676ms). Cost: $0.
-[2026-08-03T19:45:11.930Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9757ms). Cost: $0.
-[2026-08-03T20:00:12.110Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-08-03T20:15:12.567Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-08-03T20:30:11.884Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9888ms). Cost: $0.
-[2026-08-03T20:45:11.723Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9809ms). Cost: $0.
-[2026-08-03T21:00:11.815Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (9725ms). Cost: $0.
-[2026-08-03T21:15:12.285Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9679ms). Cost: $0.
-[2026-08-03T21:30:12.367Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9764ms). Cost: $0.
-[2026-08-03T21:45:12.302Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9749ms). Cost: $0.
-[2026-08-03T22:00:11.680Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9917ms). Cost: $0.
-[2026-08-03T22:15:12.245Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9780ms). Cost: $0.
-[2026-08-03T22:30:11.700Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9818ms). Cost: $0.
-[2026-08-03T22:45:12.136Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9789ms). Cost: $0.
-[2026-08-03T23:00:11.552Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9791ms). Cost: $0.
-[2026-08-03T23:15:12.046Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9752ms). Cost: $0.
-[2026-08-03T23:30:12.061Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9800ms). Cost: $0.
-[2026-08-03T23:45:11.731Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9752ms). Cost: $0.
-[2026-08-04T00:00:11.928Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9747ms). Cost: $0.
-[2026-08-04T00:15:12.125Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9795ms). Cost: $0.
-[2026-08-04T00:30:12.388Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-04T00:45:11.576Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9790ms). Cost: $0.
-[2026-08-04T01:00:11.997Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9914ms). Cost: $0.
-[2026-08-04T01:15:11.876Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9975ms). Cost: $0.
-[2026-08-04T01:30:12.072Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9821ms). Cost: $0.
-[2026-08-04T01:45:12.174Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9722ms). Cost: $0.
-[2026-08-04T02:00:12.357Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (9761ms). Cost: $0.
-[2026-08-04T02:15:11.787Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-08-04T02:30:11.852Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9751ms). Cost: $0.
-[2026-08-04T02:45:11.735Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9639ms). Cost: $0.
-[2026-08-04T03:00:12.291Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10115ms). Cost: $0.
-[2026-08-04T03:15:12.020Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9880ms). Cost: $0.
-[2026-08-04T03:30:12.400Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-04T03:45:11.483Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9779ms). Cost: $0.
-[2026-08-04T04:00:12.039Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9716ms). Cost: $0.
-[2026-08-04T04:15:12.245Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9916ms). Cost: $0.
-[2026-08-04T04:30:12.808Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10300ms). Cost: $0.
-[2026-08-04T04:45:11.854Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9696ms). Cost: $0.
-[2026-08-04T05:00:12.140Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9780ms). Cost: $0.
-[2026-08-04T05:15:12.541Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-08-04T05:30:12.541Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10627ms). Cost: $0.
-[2026-08-04T05:45:11.888Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9759ms). Cost: $0.
-[2026-08-04T06:00:12.808Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10187ms). Cost: $0.
-[2026-08-04T06:15:12.731Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10098ms). Cost: $0.
-[2026-08-04T06:30:12.291Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9917ms). Cost: $0.
-[2026-08-04T06:45:11.892Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9852ms). Cost: $0.
-[2026-08-04T07:00:14.167Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (11611ms). Cost: $0.
-[2026-08-04T07:15:12.187Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10012ms). Cost: $0.
-[2026-08-04T07:30:13.068Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10385ms). Cost: $0.
-[2026-08-04T07:45:12.039Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9834ms). Cost: $0.
-[2026-08-04T08:00:12.957Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-08-04T08:15:12.433Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9926ms). Cost: $0.
-[2026-08-04T08:30:12.273Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10218ms). Cost: $0.
-[2026-08-04T08:45:12.504Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9876ms). Cost: $0.
-[2026-08-04T09:00:12.101Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-08-04T09:15:12.450Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-08-04T09:30:11.794Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9750ms). Cost: $0.
-[2026-08-04T09:45:12.221Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10058ms). Cost: $0.
-[2026-08-04T10:00:12.374Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10480ms). Cost: $0.
-[2026-08-04T10:15:12.234Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10263ms). Cost: $0.
-[2026-08-04T10:30:13.388Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10581ms). Cost: $0.
-[2026-08-04T10:45:12.091Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10283ms). Cost: $0.
-[2026-08-04T11:00:13.053Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10300ms). Cost: $0.
-[2026-08-04T11:15:12.286Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10276ms). Cost: $0.
-[2026-08-04T11:30:12.579Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9925ms). Cost: $0.
-[2026-08-04T11:45:12.014Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-08-04T12:00:12.411Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9942ms). Cost: $0.
-[2026-08-04T12:15:11.651Z] liveness: tier1 expired=198, tier2 checked=40 removed=0 (9893ms). Cost: $0.
-[2026-08-04T12:30:11.794Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9912ms). Cost: $0.
-[2026-08-04T12:45:12.177Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9986ms). Cost: $0.
-[2026-08-04T13:00:12.424Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (9888ms). Cost: $0.
-[2026-08-04T13:15:12.487Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9923ms). Cost: $0.
-[2026-08-04T13:30:11.603Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9656ms). Cost: $0.
-[2026-08-04T13:45:11.452Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9688ms). Cost: $0.
-[2026-08-04T14:00:12.025Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9743ms). Cost: $0.
-[2026-08-04T14:15:12.004Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9803ms). Cost: $0.
-[2026-08-04T14:30:12.441Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-04T14:45:11.458Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9765ms). Cost: $0.
-[2026-08-04T15:00:12.072Z] liveness: tier1 expired=25, tier2 checked=40 removed=0 (10059ms). Cost: $0.
-[2026-08-04T15:15:12.270Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9845ms). Cost: $0.
-[2026-08-04T15:30:12.462Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9959ms). Cost: $0.
-[2026-08-04T15:45:11.320Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9617ms). Cost: $0.
-[2026-08-04T16:00:11.433Z] liveness: tier1 expired=24, tier2 checked=40 removed=0 (9788ms). Cost: $0.
-[2026-08-04T16:15:12.343Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9863ms). Cost: $0.
-[2026-08-04T16:30:12.439Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9818ms). Cost: $0.
-[2026-08-04T16:45:11.628Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9644ms). Cost: $0.
-[2026-08-04T17:00:11.915Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-08-04T17:15:11.941Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9817ms). Cost: $0.
-[2026-08-04T17:30:11.839Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9643ms). Cost: $0.
-[2026-08-04T17:45:11.476Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9639ms). Cost: $0.
-[2026-08-04T18:00:12.089Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-08-04T18:15:11.501Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9853ms). Cost: $0.
-[2026-08-04T18:30:11.479Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9807ms). Cost: $0.
-[2026-08-04T18:45:11.375Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9642ms). Cost: $0.
-[2026-08-04T19:00:11.450Z] liveness: tier1 expired=26, tier2 checked=40 removed=0 (9668ms). Cost: $0.
-[2026-08-04T19:15:11.541Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9890ms). Cost: $0.
-[2026-08-04T19:30:11.480Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9656ms). Cost: $0.
-[2026-08-04T19:45:11.299Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9710ms). Cost: $0.
-[2026-08-04T20:00:11.454Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9794ms). Cost: $0.
-[2026-08-04T20:15:12.001Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9827ms). Cost: $0.
-[2026-08-04T20:30:11.526Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9663ms). Cost: $0.
-[2026-08-04T20:45:11.649Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9635ms). Cost: $0.
-[2026-08-04T21:00:11.649Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9680ms). Cost: $0.
-[2026-08-04T21:15:11.601Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9759ms). Cost: $0.
-[2026-08-04T21:30:11.704Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9740ms). Cost: $0.
-[2026-08-04T21:45:12.035Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9906ms). Cost: $0.
-[2026-08-04T22:00:12.567Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-08-04T22:15:12.133Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-08-04T22:30:12.103Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9799ms). Cost: $0.
-[2026-08-04T22:45:11.657Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-08-04T23:00:11.774Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9770ms). Cost: $0.
-[2026-08-04T23:15:12.008Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10133ms). Cost: $0.
-[2026-08-04T23:30:12.377Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9994ms). Cost: $0.
-[2026-08-04T23:45:12.134Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9746ms). Cost: $0.
-[2026-08-05T00:00:13.241Z] liveness: tier1 expired=71, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-08-05T00:15:12.476Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-08-05T00:30:12.706Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9965ms). Cost: $0.
-[2026-08-05T00:45:11.871Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9908ms). Cost: $0.
-[2026-08-05T01:00:12.469Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10209ms). Cost: $0.
-[2026-08-05T01:15:12.237Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10159ms). Cost: $0.
-[2026-08-05T01:30:12.140Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9688ms). Cost: $0.
-[2026-08-05T01:45:12.233Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9878ms). Cost: $0.
-[2026-08-05T02:00:12.678Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10033ms). Cost: $0.
-[2026-08-05T02:15:11.977Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9880ms). Cost: $0.
-[2026-08-05T02:30:12.120Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9875ms). Cost: $0.
-[2026-08-05T02:45:11.696Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9867ms). Cost: $0.
-[2026-08-05T03:00:12.298Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10169ms). Cost: $0.
-[2026-08-05T03:15:12.725Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-08-05T03:30:13.011Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10269ms). Cost: $0.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T03:45:02.600Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T04:00:01.906Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T04:15:01.990Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T04:30:01.908Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T04:45:01.826Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T05:00:02.268Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T05:15:01.996Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T05:30:02.575Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T05:45:02.152Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T06:00:02.478Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T06:15:01.877Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T06:30:01.753Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T06:45:01.734Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T07:00:02.177Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T07:15:01.788Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T07:30:02.266Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T07:45:02.402Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T08:00:01.883Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T08:15:02.563Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T08:30:01.752Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T08:45:02.288Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T09:00:02.682Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T09:15:02.003Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T09:30:02.211Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T09:45:02.094Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T10:00:02.482Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T10:15:02.374Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T10:30:01.664Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T10:45:01.731Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T11:00:02.748Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T11:15:02.603Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T11:30:02.450Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T11:45:02.501Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T12:00:01.930Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T12:15:02.307Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T12:30:01.806Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T12:45:01.610Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T13:00:02.031Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T13:15:02.499Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T13:30:02.246Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T13:45:02.292Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T14:00:02.743Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-05T14:15:01.712Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[2026-08-05T14:30:13.029Z] liveness: tier1 expired=105, tier2 checked=40 removed=0 (9852ms). Cost: $0.
-[2026-08-05T14:45:13.271Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-08-05T15:00:11.660Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (9766ms). Cost: $0.
-[2026-08-05T15:15:12.443Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9936ms). Cost: $0.
-[2026-08-05T15:30:12.016Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9962ms). Cost: $0.
-[2026-08-05T15:45:12.833Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10485ms). Cost: $0.
-[2026-08-05T16:00:12.442Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9902ms). Cost: $0.
-[2026-08-05T16:15:12.029Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9818ms). Cost: $0.
-[2026-08-05T16:30:11.368Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9706ms). Cost: $0.
-[2026-08-05T16:45:12.265Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9831ms). Cost: $0.
-[2026-08-05T17:00:11.663Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-08-05T17:15:12.366Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9923ms). Cost: $0.
-[2026-08-05T17:30:11.490Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9765ms). Cost: $0.
-[2026-08-05T17:45:11.974Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-08-05T18:00:12.159Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9797ms). Cost: $0.
-[2026-08-05T18:15:11.799Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9809ms). Cost: $0.
-[2026-08-05T18:30:11.992Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9821ms). Cost: $0.
-[2026-08-05T18:45:11.651Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-08-05T19:00:11.741Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9761ms). Cost: $0.
-[2026-08-05T19:15:12.000Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9918ms). Cost: $0.
-[2026-08-05T19:30:11.821Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9848ms). Cost: $0.
-[2026-08-05T19:45:11.680Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9715ms). Cost: $0.
-[2026-08-05T20:00:11.940Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9808ms). Cost: $0.
-[2026-08-05T20:15:12.566Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-08-05T20:30:12.398Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-08-05T20:45:11.764Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9757ms). Cost: $0.
-[2026-08-05T21:00:12.181Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9681ms). Cost: $0.
-[2026-08-05T21:15:11.869Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-08-05T21:30:12.155Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9707ms). Cost: $0.
-[2026-08-05T21:45:11.601Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9771ms). Cost: $0.
-[2026-08-05T22:00:12.195Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10085ms). Cost: $0.
-[2026-08-05T22:15:12.245Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-08-05T22:30:12.253Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9982ms). Cost: $0.
-[2026-08-05T22:45:12.463Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9973ms). Cost: $0.
-[2026-08-05T23:00:52.428Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (50408ms). Cost: $0.
-[2026-08-05T23:15:11.996Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10203ms). Cost: $0.
-[2026-08-05T23:30:11.964Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-05T23:45:12.110Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-08-06T00:00:13.656Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (11051ms). Cost: $0.
-[2026-08-06T00:15:11.505Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9839ms). Cost: $0.
-[2026-08-06T00:30:12.778Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10132ms). Cost: $0.
-[2026-08-06T00:45:11.372Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9660ms). Cost: $0.
-[2026-08-06T01:00:11.876Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10102ms). Cost: $0.
-[2026-08-06T01:15:12.305Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9782ms). Cost: $0.
-[2026-08-06T01:30:12.488Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-08-06T01:45:11.791Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9767ms). Cost: $0.
-[2026-08-06T02:00:12.388Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10084ms). Cost: $0.
-[2026-08-06T02:15:12.319Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-08-06T02:30:12.256Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9783ms). Cost: $0.
-[2026-08-06T02:45:12.467Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-08-06T03:00:11.993Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9941ms). Cost: $0.
-[2026-08-06T03:15:11.861Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-08-06T03:30:12.005Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9860ms). Cost: $0.
-[2026-08-06T03:45:11.855Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9762ms). Cost: $0.
-[2026-08-06T04:00:12.567Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9961ms). Cost: $0.
-[2026-08-06T04:15:12.639Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-06T04:30:12.393Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9784ms). Cost: $0.
-[2026-08-06T04:45:11.504Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9635ms). Cost: $0.
-[2026-08-06T05:00:11.786Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9732ms). Cost: $0.
-[2026-08-06T05:15:11.513Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9752ms). Cost: $0.
-[2026-08-06T05:30:11.545Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9849ms). Cost: $0.
-[2026-08-06T05:45:12.120Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9758ms). Cost: $0.
-[2026-08-06T06:00:12.202Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9670ms). Cost: $0.
-[2026-08-06T06:15:12.397Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10511ms). Cost: $0.
-[2026-08-06T06:30:12.231Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-08-06T06:45:12.082Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-08-06T07:00:12.750Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-08-06T07:15:12.063Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-08-06T07:30:11.731Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9599ms). Cost: $0.
-[2026-08-06T07:45:11.770Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9765ms). Cost: $0.
-[2026-08-06T08:00:12.376Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10064ms). Cost: $0.
-[2026-08-06T08:15:12.499Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-06T08:30:11.580Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-08-06T08:45:11.883Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-08-06T09:00:12.409Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-08-06T09:15:12.413Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9996ms). Cost: $0.
-[2026-08-06T09:30:12.509Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-08-06T09:45:12.349Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-08-06T10:00:11.946Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-08-06T10:15:12.232Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-08-06T10:30:12.068Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9978ms). Cost: $0.
-[2026-08-06T10:45:12.550Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10097ms). Cost: $0.
-[2026-08-06T11:00:12.069Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10014ms). Cost: $0.
-[2026-08-06T11:15:12.501Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-06T11:30:11.800Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-08-06T11:45:12.477Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-08-06T12:00:11.742Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-08-06T12:15:11.843Z] liveness: tier1 expired=149, tier2 checked=40 removed=0 (9886ms). Cost: $0.
-[2026-08-06T12:30:12.272Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9809ms). Cost: $0.
-[2026-08-06T12:45:12.020Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10105ms). Cost: $0.
-[2026-08-06T13:00:12.395Z] liveness: tier1 expired=43, tier2 checked=40 removed=0 (9890ms). Cost: $0.
-[2026-08-06T13:15:12.431Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10022ms). Cost: $0.
-[2026-08-06T13:30:11.691Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9733ms). Cost: $0.
-[2026-08-06T13:45:11.780Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9914ms). Cost: $0.
-[2026-08-06T14:00:12.342Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9832ms). Cost: $0.
-[2026-08-06T14:15:11.894Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10182ms). Cost: $0.
-[2026-08-06T14:30:12.013Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9776ms). Cost: $0.
-[2026-08-06T14:45:12.147Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9702ms). Cost: $0.
-[2026-08-06T15:00:12.426Z] liveness: tier1 expired=26, tier2 checked=40 removed=0 (9774ms). Cost: $0.
-[2026-08-06T15:15:11.754Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-08-06T15:30:13.265Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10591ms). Cost: $0.
-[2026-08-06T15:45:11.729Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9589ms). Cost: $0.
-[2026-08-06T16:00:11.900Z] liveness: tier1 expired=22, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-08-06T16:15:11.954Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9996ms). Cost: $0.
-[2026-08-06T16:30:11.955Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9774ms). Cost: $0.
-[2026-08-06T16:45:11.728Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9895ms). Cost: $0.
-[2026-08-06T17:00:12.063Z] liveness: tier1 expired=22, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-08-06T17:15:12.434Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9923ms). Cost: $0.
-[2026-08-06T17:30:11.857Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-08-06T17:45:12.103Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9996ms). Cost: $0.
-[2026-08-06T18:00:12.933Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10193ms). Cost: $0.
-[2026-08-06T18:15:11.920Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9941ms). Cost: $0.
-[2026-08-06T18:30:12.480Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-08-06T18:45:11.875Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9965ms). Cost: $0.
-[2026-08-06T19:00:12.381Z] liveness: tier1 expired=23, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-08-06T19:15:12.258Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9982ms). Cost: $0.
-[2026-08-06T19:30:11.557Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-08-06T19:45:11.804Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9816ms). Cost: $0.
-[2026-08-06T20:00:12.494Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10124ms). Cost: $0.
-[2026-08-06T20:15:11.622Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9853ms). Cost: $0.
-[2026-08-06T20:30:11.671Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9895ms). Cost: $0.
-[2026-08-06T20:45:11.967Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9759ms). Cost: $0.
-[2026-08-06T21:00:12.715Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10137ms). Cost: $0.
-[2026-08-06T21:15:11.752Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9902ms). Cost: $0.
-[2026-08-06T21:30:11.991Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10084ms). Cost: $0.
-[2026-08-06T21:45:12.220Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-08-06T22:00:11.791Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-08-06T22:15:12.632Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10026ms). Cost: $0.
-[2026-08-06T22:30:11.960Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9914ms). Cost: $0.
-[2026-08-06T22:45:11.853Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-08-06T23:00:12.006Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10013ms). Cost: $0.
-[2026-08-06T23:15:11.887Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9952ms). Cost: $0.
-[2026-08-06T23:30:12.071Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9861ms). Cost: $0.
-[2026-08-06T23:45:12.320Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9860ms). Cost: $0.
-[2026-08-07T00:00:11.740Z] liveness: tier1 expired=48, tier2 checked=40 removed=0 (9780ms). Cost: $0.
-[2026-08-07T00:15:11.789Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9899ms). Cost: $0.
-[2026-08-07T00:30:11.559Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9798ms). Cost: $0.
-[2026-08-07T00:45:12.158Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-08-07T01:00:12.443Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9823ms). Cost: $0.
-[2026-08-07T01:15:11.775Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9962ms). Cost: $0.
-[2026-08-07T01:30:11.981Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9816ms). Cost: $0.
-[2026-08-07T01:45:11.952Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9777ms). Cost: $0.
-[2026-08-07T02:00:12.819Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10273ms). Cost: $0.
-[2026-08-07T02:15:12.027Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-08-07T02:30:12.049Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-07T02:45:11.561Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9918ms). Cost: $0.
-[2026-08-07T03:00:12.055Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-08-07T03:15:12.315Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-08-07T03:30:12.635Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-08-07T03:45:12.406Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-08-07T04:00:11.951Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10248ms). Cost: $0.
-[2026-08-07T04:15:12.543Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9910ms). Cost: $0.
-[2026-08-07T04:30:11.741Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9982ms). Cost: $0.
-[2026-08-07T04:45:11.902Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9813ms). Cost: $0.
-[2026-08-07T05:00:12.057Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9770ms). Cost: $0.
-[2026-08-07T05:15:12.173Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9902ms). Cost: $0.
-[2026-08-07T05:30:12.025Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-08-07T05:45:12.220Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9765ms). Cost: $0.
-[2026-08-07T06:00:12.482Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9857ms). Cost: $0.
-[2026-08-07T06:15:12.552Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10394ms). Cost: $0.
-[2026-08-07T06:30:12.995Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9950ms). Cost: $0.
-[2026-08-07T06:45:11.631Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9890ms). Cost: $0.
-[2026-08-07T07:00:12.017Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-08-07T07:15:12.232Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9864ms). Cost: $0.
-[2026-08-07T07:30:12.060Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-08-07T07:45:12.175Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9936ms). Cost: $0.
-[2026-08-07T08:00:12.710Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-08-07T08:15:12.223Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-08-07T08:30:11.963Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9912ms). Cost: $0.
-[2026-08-07T08:45:12.399Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9763ms). Cost: $0.
-[2026-08-07T09:00:11.623Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9809ms). Cost: $0.
-[2026-08-07T09:15:11.788Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-08-07T09:30:13.142Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10439ms). Cost: $0.
-[2026-08-07T09:45:12.616Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10036ms). Cost: $0.
-[2026-08-07T10:00:12.485Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-08-07T10:15:11.949Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10035ms). Cost: $0.
-[2026-08-07T10:30:12.457Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10232ms). Cost: $0.
-[2026-08-07T10:45:12.124Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9762ms). Cost: $0.
-[2026-08-07T11:00:12.881Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-08-07T11:15:12.072Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9908ms). Cost: $0.
-[2026-08-07T11:30:11.841Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9828ms). Cost: $0.
-[2026-08-07T11:45:11.746Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-08-07T12:00:11.939Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9710ms). Cost: $0.
-[2026-08-07T12:15:11.912Z] liveness: tier1 expired=132, tier2 checked=40 removed=0 (9874ms). Cost: $0.
-[2026-08-07T12:30:12.132Z] liveness: tier1 expired=36, tier2 checked=40 removed=0 (9663ms). Cost: $0.
-[2026-08-07T12:45:12.112Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9578ms). Cost: $0.
-[2026-08-07T13:00:12.265Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9729ms). Cost: $0.
-[2026-08-07T13:15:11.760Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9795ms). Cost: $0.
-[2026-08-07T13:30:13.670Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (11003ms). Cost: $0.
-[2026-08-07T13:45:12.263Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9890ms). Cost: $0.
-[2026-08-07T14:00:12.248Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-08-07T14:15:11.967Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (9920ms). Cost: $0.
-[2026-08-07T14:30:12.139Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-08-07T14:45:11.751Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-07T15:00:12.511Z] liveness: tier1 expired=20, tier2 checked=40 removed=0 (10209ms). Cost: $0.
-[2026-08-07T15:15:12.260Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10134ms). Cost: $0.
-[2026-08-07T15:30:12.477Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9848ms). Cost: $0.
-[2026-08-07T15:45:12.577Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10009ms). Cost: $0.
-[2026-08-07T16:00:11.918Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9927ms). Cost: $0.
-[2026-08-07T16:15:12.947Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10454ms). Cost: $0.
-[2026-08-07T16:30:11.508Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9761ms). Cost: $0.
-[2026-08-07T16:45:12.039Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9758ms). Cost: $0.
-[2026-08-07T17:00:12.463Z] liveness: tier1 expired=56, tier2 checked=40 removed=0 (9790ms). Cost: $0.
-[2026-08-07T17:15:11.916Z] liveness: tier1 expired=63, tier2 checked=40 removed=0 (9654ms). Cost: $0.
-[2026-08-07T17:30:12.080Z] liveness: tier1 expired=59, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-08-07T17:45:11.349Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9667ms). Cost: $0.
-[2026-08-07T18:00:11.665Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9865ms). Cost: $0.
-[2026-08-07T18:15:12.230Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9848ms). Cost: $0.
-[2026-08-07T18:30:11.936Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9734ms). Cost: $0.
-[2026-08-07T18:45:11.530Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9685ms). Cost: $0.
-[2026-08-07T19:00:11.840Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9750ms). Cost: $0.
-[2026-08-07T19:15:12.003Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9770ms). Cost: $0.
-[2026-08-07T19:30:12.181Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9830ms). Cost: $0.
-[2026-08-07T19:45:12.037Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9938ms). Cost: $0.
-[2026-08-07T20:00:12.290Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9746ms). Cost: $0.
-[2026-08-07T20:15:11.516Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9820ms). Cost: $0.
-[2026-08-07T20:30:11.982Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9864ms). Cost: $0.
-[2026-08-07T20:45:12.453Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9765ms). Cost: $0.
-[2026-08-07T21:00:11.842Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9843ms). Cost: $0.
-[2026-08-07T21:15:11.808Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9782ms). Cost: $0.
-[2026-08-07T21:30:11.833Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9807ms). Cost: $0.
-[2026-08-07T21:45:11.987Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9793ms). Cost: $0.
-[2026-08-07T22:00:12.522Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9892ms). Cost: $0.
-[2026-08-07T22:15:11.728Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9816ms). Cost: $0.
-[2026-08-07T22:30:11.480Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9808ms). Cost: $0.
-[2026-08-07T22:45:12.512Z] liveness: tier1 expired=37, tier2 checked=40 removed=0 (9743ms). Cost: $0.
-[2026-08-07T23:00:11.739Z] liveness: tier1 expired=45, tier2 checked=40 removed=0 (9754ms). Cost: $0.
-[2026-08-07T23:15:11.922Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9633ms). Cost: $0.
-[2026-08-07T23:30:11.824Z] liveness: tier1 expired=80, tier2 checked=40 removed=0 (9663ms). Cost: $0.
-[2026-08-07T23:45:12.098Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9670ms). Cost: $0.
-[2026-08-08T00:00:12.434Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (9772ms). Cost: $0.
-[2026-08-08T00:15:12.080Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9778ms). Cost: $0.
-[2026-08-08T00:30:11.977Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9686ms). Cost: $0.
-[2026-08-08T00:45:12.227Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9781ms). Cost: $0.
-[2026-08-08T01:00:12.432Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-08-08T01:15:11.919Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9902ms). Cost: $0.
-[2026-08-08T01:30:11.705Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9728ms). Cost: $0.
-[2026-08-08T01:45:12.387Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9877ms). Cost: $0.
-[2026-08-08T02:00:12.037Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-08-08T02:15:12.167Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9830ms). Cost: $0.
-[2026-08-08T02:30:11.703Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9973ms). Cost: $0.
-[2026-08-08T02:45:12.372Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9764ms). Cost: $0.
-[2026-08-08T03:00:11.679Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-08-08T03:15:12.084Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9903ms). Cost: $0.
-[2026-08-08T03:30:12.384Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9756ms). Cost: $0.
-[2026-08-08T03:45:12.060Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9662ms). Cost: $0.
-[2026-08-08T04:00:11.347Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9510ms). Cost: $0.
-[2026-08-08T04:15:11.953Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9520ms). Cost: $0.
-[2026-08-08T04:30:11.259Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9520ms). Cost: $0.
-[2026-08-08T04:45:11.621Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9685ms). Cost: $0.
-[2026-08-08T05:00:11.768Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9707ms). Cost: $0.
-[2026-08-08T05:15:12.217Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9725ms). Cost: $0.
-[2026-08-08T05:30:11.901Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-08-08T05:45:12.059Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9695ms). Cost: $0.
-[2026-08-08T06:00:12.372Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-08-08T06:15:12.176Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-08-08T06:30:12.206Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-08-08T06:45:12.219Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9713ms). Cost: $0.
-[2026-08-08T07:00:12.544Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-08-08T07:15:12.064Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9695ms). Cost: $0.
-[2026-08-08T07:30:11.324Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9701ms). Cost: $0.
-[2026-08-08T07:45:11.712Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9836ms). Cost: $0.
-[2026-08-08T08:00:12.033Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9861ms). Cost: $0.
-[2026-08-08T08:15:12.623Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-08-08T08:30:12.262Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9711ms). Cost: $0.
-[2026-08-08T08:45:12.186Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9780ms). Cost: $0.
-[2026-08-08T09:00:12.383Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9791ms). Cost: $0.
-[2026-08-08T09:15:12.449Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10134ms). Cost: $0.
-[2026-08-08T09:30:12.359Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9754ms). Cost: $0.
-[2026-08-08T09:45:12.159Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-08-08T10:00:12.810Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-08-08T10:15:12.031Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9854ms). Cost: $0.
-[2026-08-08T10:30:11.971Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9839ms). Cost: $0.
-[2026-08-08T10:45:12.414Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-08-08T11:00:11.921Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9964ms). Cost: $0.
-[2026-08-08T11:15:11.818Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-08-08T11:30:12.395Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9737ms). Cost: $0.
-[2026-08-08T11:45:12.118Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9612ms). Cost: $0.
-[2026-08-08T12:00:12.069Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9576ms). Cost: $0.
-[2026-08-08T12:15:11.856Z] liveness: tier1 expired=59, tier2 checked=40 removed=0 (9682ms). Cost: $0.
-[2026-08-08T12:30:11.718Z] liveness: tier1 expired=42, tier2 checked=40 removed=0 (9609ms). Cost: $0.
-[2026-08-08T12:45:11.572Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9653ms). Cost: $0.
-[2026-08-08T13:00:11.552Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9594ms). Cost: $0.
-[2026-08-08T13:15:12.196Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9742ms). Cost: $0.
-[2026-08-08T13:30:11.805Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9630ms). Cost: $0.
-[2026-08-08T13:45:11.841Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9719ms). Cost: $0.
-[2026-08-08T14:00:12.527Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9788ms). Cost: $0.
-[2026-08-08T14:15:12.281Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9659ms). Cost: $0.
-[2026-08-08T14:30:12.291Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9799ms). Cost: $0.
-[2026-08-08T14:45:11.936Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-08-08T15:00:12.291Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-08-08T15:15:12.367Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9669ms). Cost: $0.
-[2026-08-08T15:30:11.879Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9670ms). Cost: $0.
-[2026-08-08T15:45:12.149Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9745ms). Cost: $0.
-[2026-08-08T16:00:12.372Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9712ms). Cost: $0.
-[2026-08-08T16:15:12.155Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9662ms). Cost: $0.
-[2026-08-08T16:30:12.469Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9869ms). Cost: $0.
-[2026-08-08T16:45:12.259Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9631ms). Cost: $0.
-[2026-08-08T17:00:12.006Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10231ms). Cost: $0.
-[2026-08-08T17:15:11.802Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9625ms). Cost: $0.
-[2026-08-08T17:30:12.072Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9731ms). Cost: $0.
-[2026-08-08T17:45:12.206Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9903ms). Cost: $0.
-[2026-08-08T18:00:11.559Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9677ms). Cost: $0.
-[2026-08-08T18:15:11.601Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9848ms). Cost: $0.
-[2026-08-08T18:30:11.887Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9766ms). Cost: $0.
-[2026-08-08T18:45:12.062Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9719ms). Cost: $0.
-[2026-08-08T19:00:12.592Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9960ms). Cost: $0.
-[2026-08-08T19:15:11.812Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9714ms). Cost: $0.
-[2026-08-08T19:30:11.332Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9727ms). Cost: $0.
-[2026-08-08T19:45:11.652Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9801ms). Cost: $0.
-[2026-08-08T20:00:11.831Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9684ms). Cost: $0.
-[2026-08-08T20:15:12.342Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9748ms). Cost: $0.
-[2026-08-08T20:30:12.121Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9748ms). Cost: $0.
-[2026-08-08T20:45:12.028Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9694ms). Cost: $0.
-[2026-08-08T21:00:12.364Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9798ms). Cost: $0.
-[2026-08-08T21:15:11.489Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9811ms). Cost: $0.
-[2026-08-08T21:30:12.483Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9768ms). Cost: $0.
-[2026-08-08T21:45:11.719Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9766ms). Cost: $0.
-[2026-08-08T22:00:12.156Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9764ms). Cost: $0.
-[2026-08-08T22:15:11.573Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9882ms). Cost: $0.
-[2026-08-08T22:30:12.528Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10106ms). Cost: $0.
-[2026-08-08T22:45:12.090Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-08-08T23:00:12.354Z] liveness: tier1 expired=25, tier2 checked=40 removed=0 (9757ms). Cost: $0.
-[2026-08-08T23:15:11.596Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9819ms). Cost: $0.
-[2026-08-08T23:30:11.668Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9792ms). Cost: $0.
-[2026-08-08T23:45:11.648Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9770ms). Cost: $0.
-[2026-08-09T00:00:12.226Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-08-09T00:15:12.017Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9984ms). Cost: $0.
-[2026-08-09T00:30:11.845Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-08-09T00:45:12.441Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9828ms). Cost: $0.
-[2026-08-09T01:00:11.637Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9738ms). Cost: $0.
-[2026-08-09T01:15:11.519Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9800ms). Cost: $0.
-[2026-08-09T01:30:12.300Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9581ms). Cost: $0.
-[2026-08-09T01:45:12.285Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9630ms). Cost: $0.
-[2026-08-09T02:00:11.720Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-08-09T02:15:12.172Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9651ms). Cost: $0.
-[2026-08-09T02:30:12.374Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-08-09T02:45:11.994Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-08-09T03:00:12.277Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9851ms). Cost: $0.
-[2026-08-09T03:15:12.074Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9814ms). Cost: $0.
-[2026-08-09T03:30:12.040Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-09T03:45:12.097Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9884ms). Cost: $0.
-[2026-08-09T04:00:12.349Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9839ms). Cost: $0.
-[2026-08-09T04:15:11.993Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9849ms). Cost: $0.
-[2026-08-09T04:30:11.907Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9944ms). Cost: $0.
-[2026-08-09T04:45:11.472Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9680ms). Cost: $0.
-[2026-08-09T05:00:11.745Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9755ms). Cost: $0.
-[2026-08-09T05:15:11.894Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9887ms). Cost: $0.
-[2026-08-09T05:30:12.307Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9706ms). Cost: $0.
-[2026-08-09T05:45:11.793Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9765ms). Cost: $0.
-[2026-08-09T06:00:12.088Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9838ms). Cost: $0.
-[2026-08-09T06:15:12.995Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10240ms). Cost: $0.
-[2026-08-09T06:30:11.808Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9886ms). Cost: $0.
-[2026-08-09T06:45:11.562Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9849ms). Cost: $0.
-[2026-08-09T07:00:12.306Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-08-09T07:15:12.027Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9593ms). Cost: $0.
-[2026-08-09T07:30:12.099Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9703ms). Cost: $0.
-[2026-08-09T07:45:11.747Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9526ms). Cost: $0.
-[2026-08-09T08:00:12.044Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9695ms). Cost: $0.
-[2026-08-09T08:15:12.164Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9712ms). Cost: $0.
-[2026-08-09T08:30:12.043Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9779ms). Cost: $0.
-[2026-08-09T08:45:11.999Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9857ms). Cost: $0.
-[2026-08-09T09:00:11.971Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9571ms). Cost: $0.
-[2026-08-09T09:15:11.877Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9542ms). Cost: $0.
-[2026-08-09T09:30:11.719Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9679ms). Cost: $0.
-[2026-08-09T09:45:12.175Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9733ms). Cost: $0.
-[2026-08-09T10:00:12.527Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9717ms). Cost: $0.
-[2026-08-09T10:15:11.326Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9630ms). Cost: $0.
-[2026-08-09T10:30:12.095Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9894ms). Cost: $0.
-[2026-08-09T10:45:11.840Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9665ms). Cost: $0.
-[2026-08-09T11:00:12.343Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-08-09T11:15:12.314Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9648ms). Cost: $0.
-[2026-08-09T11:30:11.981Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-08-09T11:45:11.510Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9880ms). Cost: $0.
-[2026-08-09T12:00:11.613Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9665ms). Cost: $0.
-[2026-08-09T12:15:12.249Z] liveness: tier1 expired=105, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-08-09T12:30:11.594Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9558ms). Cost: $0.
-[2026-08-09T12:45:11.787Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-08-09T13:00:11.908Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9755ms). Cost: $0.
-[2026-08-09T13:15:15.642Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (13733ms). Cost: $0.
-[2026-08-09T13:30:11.474Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9720ms). Cost: $0.
-[2026-08-09T13:45:12.210Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9651ms). Cost: $0.
-[2026-08-09T14:00:16.134Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (13400ms). Cost: $0.
-[2026-08-09T14:15:11.670Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9593ms). Cost: $0.
-[2026-08-09T14:30:11.855Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9626ms). Cost: $0.
-[2026-08-09T14:45:11.356Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9710ms). Cost: $0.
-[2026-08-09T15:00:11.353Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9572ms). Cost: $0.
-[2026-08-09T15:15:11.993Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9831ms). Cost: $0.
-[2026-08-09T15:30:12.160Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9851ms). Cost: $0.
-[2026-08-09T15:45:12.152Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9693ms). Cost: $0.
-[2026-08-09T16:00:12.379Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9847ms). Cost: $0.
-[2026-08-09T16:15:12.572Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-08-09T16:30:12.470Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9932ms). Cost: $0.
-[2026-08-09T16:45:11.464Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9701ms). Cost: $0.
-[2026-08-09T17:00:11.694Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9834ms). Cost: $0.
-[2026-08-09T17:15:11.882Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-08-09T17:30:12.375Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9935ms). Cost: $0.
-[2026-08-09T17:45:11.712Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9876ms). Cost: $0.
-[2026-08-09T18:00:11.859Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9706ms). Cost: $0.
-[2026-08-09T18:15:11.537Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-08-09T18:30:11.762Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9748ms). Cost: $0.
-[2026-08-09T18:45:12.123Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9738ms). Cost: $0.
-[2026-08-09T19:00:12.345Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-08-09T19:15:12.259Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-08-09T19:30:11.961Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9745ms). Cost: $0.
-[2026-08-09T19:45:11.312Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9692ms). Cost: $0.
-[2026-08-09T20:00:11.525Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9763ms). Cost: $0.
-[2026-08-09T20:15:12.015Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9731ms). Cost: $0.
-[2026-08-09T20:30:11.507Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9791ms). Cost: $0.
-[2026-08-09T20:45:11.715Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9733ms). Cost: $0.
-[2026-08-09T21:00:12.033Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9912ms). Cost: $0.
-[2026-08-09T21:15:12.099Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9881ms). Cost: $0.
-[2026-08-09T21:30:12.050Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9759ms). Cost: $0.
-[2026-08-09T21:45:11.813Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-08-09T22:00:12.123Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9803ms). Cost: $0.
-[2026-08-09T22:15:12.388Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9780ms). Cost: $0.
-[2026-08-09T22:30:12.113Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9799ms). Cost: $0.
-[2026-08-09T22:45:12.076Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9903ms). Cost: $0.
-[2026-08-09T23:00:12.350Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9917ms). Cost: $0.
-[2026-08-09T23:15:11.709Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9833ms). Cost: $0.
-[2026-08-09T23:30:12.390Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-08-09T23:45:12.263Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9688ms). Cost: $0.
-[2026-08-10T00:00:12.645Z] liveness: tier1 expired=132, tier2 checked=40 removed=0 (9868ms). Cost: $0.
-[2026-08-10T00:15:11.473Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9787ms). Cost: $0.
-[2026-08-10T00:30:12.255Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9707ms). Cost: $0.
-[2026-08-10T00:45:11.372Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9694ms). Cost: $0.
-[2026-08-10T01:00:11.664Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9817ms). Cost: $0.
-[2026-08-10T01:15:11.708Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-08-10T01:30:11.875Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9778ms). Cost: $0.
-[2026-08-10T01:45:11.788Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9844ms). Cost: $0.
-[2026-08-10T02:00:12.193Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-08-10T02:15:12.238Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9762ms). Cost: $0.
-[2026-08-10T02:30:11.501Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9833ms). Cost: $0.
-[2026-08-10T02:45:12.375Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9817ms). Cost: $0.
-[2026-08-10T03:00:11.827Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-10T03:15:11.944Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9776ms). Cost: $0.
-[2026-08-10T03:30:12.838Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10251ms). Cost: $0.
-[2026-08-10T03:45:12.357Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9899ms). Cost: $0.
-[2026-08-10T04:00:12.351Z] liveness: tier1 expired=18, tier2 checked=40 removed=0 (9944ms). Cost: $0.
-[2026-08-10T04:15:11.626Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9782ms). Cost: $0.
-[2026-08-10T04:30:11.490Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9726ms). Cost: $0.
-[2026-08-10T04:45:12.281Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9757ms). Cost: $0.
-[2026-08-10T05:00:12.519Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9844ms). Cost: $0.
-[2026-08-10T05:15:12.351Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9746ms). Cost: $0.
-[2026-08-10T05:30:12.638Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9892ms). Cost: $0.
-[2026-08-10T05:45:12.218Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-08-10T06:00:11.352Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9688ms). Cost: $0.
-[2026-08-10T06:15:12.212Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9861ms). Cost: $0.
-[2026-08-10T06:30:12.473Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-08-10T06:45:11.812Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9761ms). Cost: $0.
-[2026-08-10T07:00:12.434Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10030ms). Cost: $0.
-[2026-08-10T07:15:12.356Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9923ms). Cost: $0.
-[2026-08-10T07:30:12.488Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-08-10T07:45:11.996Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9733ms). Cost: $0.
-[2026-08-10T08:00:12.529Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-08-10T08:15:12.299Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9765ms). Cost: $0.
-[2026-08-10T08:30:12.329Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9781ms). Cost: $0.
-[2026-08-10T08:45:12.162Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-10T09:00:12.418Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9791ms). Cost: $0.
-[2026-08-10T09:15:11.768Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-08-10T09:30:11.983Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9773ms). Cost: $0.
-[2026-08-10T09:45:11.833Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9779ms). Cost: $0.
-[2026-08-10T10:00:12.152Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9771ms). Cost: $0.
-[2026-08-10T10:15:11.855Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9752ms). Cost: $0.
-[2026-08-10T10:30:11.986Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9904ms). Cost: $0.
-[2026-08-10T10:45:12.251Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9756ms). Cost: $0.
-[2026-08-10T11:00:11.945Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10018ms). Cost: $0.
-[2026-08-10T11:15:11.753Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9717ms). Cost: $0.
-[2026-08-10T11:30:11.821Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9883ms). Cost: $0.
-[2026-08-10T11:45:11.869Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9898ms). Cost: $0.
-[2026-08-10T12:00:12.324Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-08-10T12:15:11.528Z] liveness: tier1 expired=226, tier2 checked=40 removed=0 (9760ms). Cost: $0.
-[2026-08-10T12:30:11.917Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9761ms). Cost: $0.
-[2026-08-10T12:45:12.232Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10035ms). Cost: $0.
-[2026-08-10T13:00:12.529Z] liveness: tier1 expired=26, tier2 checked=40 removed=0 (9792ms). Cost: $0.
-[2026-08-10T13:15:12.130Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9874ms). Cost: $0.
-[2026-08-10T13:30:11.825Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9917ms). Cost: $0.
-[2026-08-10T13:45:11.962Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10168ms). Cost: $0.
-[2026-08-10T14:00:12.713Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10307ms). Cost: $0.
-[2026-08-10T14:15:12.504Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10400ms). Cost: $0.
-[2026-08-10T14:30:12.116Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-08-10T14:45:12.112Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9705ms). Cost: $0.
-[2026-08-10T15:00:12.384Z] liveness: tier1 expired=18, tier2 checked=40 removed=0 (9794ms). Cost: $0.
-[2026-08-10T15:15:12.243Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9824ms). Cost: $0.
-[2026-08-10T15:30:11.919Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9890ms). Cost: $0.
-[2026-08-10T15:45:12.320Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9869ms). Cost: $0.
-[2026-08-10T16:00:11.584Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (9812ms). Cost: $0.
-[2026-08-10T16:15:12.199Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9878ms). Cost: $0.
-[2026-08-10T16:30:12.243Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9671ms). Cost: $0.
-[2026-08-10T16:45:11.586Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9640ms). Cost: $0.
-[2026-08-10T17:00:11.821Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9791ms). Cost: $0.
-[2026-08-10T17:15:12.052Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9781ms). Cost: $0.
-[2026-08-10T17:30:12.535Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9939ms). Cost: $0.
-[2026-08-10T17:45:12.272Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-08-10T18:00:11.808Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (9872ms). Cost: $0.
-[2026-08-10T18:15:11.715Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9750ms). Cost: $0.
-[2026-08-10T18:30:12.525Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9864ms). Cost: $0.
-[2026-08-10T18:45:12.171Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-08-10T19:00:12.576Z] liveness: tier1 expired=53, tier2 checked=40 removed=0 (9984ms). Cost: $0.
-[2026-08-10T19:15:11.872Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9987ms). Cost: $0.
-[2026-08-10T19:30:12.145Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10179ms). Cost: $0.
-[2026-08-10T19:45:12.011Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-08-10T20:00:12.461Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10067ms). Cost: $0.
-[2026-08-10T20:15:12.011Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-08-10T20:30:11.900Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9806ms). Cost: $0.
-[2026-08-10T20:45:11.733Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9719ms). Cost: $0.
-[2026-08-10T21:00:11.901Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9732ms). Cost: $0.
-[2026-08-10T21:15:12.394Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9806ms). Cost: $0.
-[2026-08-10T21:30:11.950Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-08-10T21:45:12.043Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9732ms). Cost: $0.
-[2026-08-10T22:00:12.508Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9863ms). Cost: $0.
-[2026-08-10T22:15:11.819Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9800ms). Cost: $0.
-[2026-08-10T22:30:12.012Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9816ms). Cost: $0.
-[2026-08-10T22:45:12.088Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9769ms). Cost: $0.
-[2026-08-10T23:00:12.658Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-08-10T23:15:12.249Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-10T23:30:12.309Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10033ms). Cost: $0.
-[2026-08-10T23:45:11.983Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9872ms). Cost: $0.
-[2026-08-11T00:00:12.875Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10410ms). Cost: $0.
-[2026-08-11T00:15:11.528Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9809ms). Cost: $0.
-[2026-08-11T00:30:12.563Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9793ms). Cost: $0.
-[2026-08-11T00:45:12.538Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-08-11T01:00:11.733Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9813ms). Cost: $0.
-[2026-08-11T01:15:12.262Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9848ms). Cost: $0.
-[2026-08-11T01:30:11.956Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-08-11T01:45:11.662Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9759ms). Cost: $0.
-[2026-08-11T02:00:12.087Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9986ms). Cost: $0.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T02:15:02.443Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T02:30:02.334Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T02:45:02.386Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T03:00:01.783Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T03:15:01.851Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T03:30:01.823Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T03:45:02.316Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-npm error code ENOSPC
-npm error syscall write
-npm error errno -28
-npm error nospc ENOSPC: no space left on device, write
-npm error nospc prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T04:45:01.948Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T05:00:03.049Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T05:15:02.584Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T05:30:02.253Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T05:45:02.501Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T06:00:02.295Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T06:15:02.556Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T06:30:02.649Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T06:45:02.031Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T07:00:01.970Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T07:15:02.487Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T07:30:01.986Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T07:45:02.118Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T08:00:01.909Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T08:15:02.520Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T08:30:02.204Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T08:45:02.478Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T09:00:02.316Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T09:15:01.685Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T09:30:02.454Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T09:45:01.678Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T10:00:03.403Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T10:15:02.173Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T10:30:02.664Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T10:45:02.057Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T11:00:01.869Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T11:15:01.931Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T11:30:02.553Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T11:45:02.114Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T12:00:02.156Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T12:15:02.209Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T12:30:02.605Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T12:45:01.962Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T13:00:02.717Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T13:15:02.454Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T13:30:02.322Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T13:45:01.984Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T14:00:01.967Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T14:15:02.420Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T14:30:02.668Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-11T14:45:02.052Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[2026-08-11T15:00:13.040Z] liveness: tier1 expired=62, tier2 checked=40 removed=0 (10332ms). Cost: $0.
-[2026-08-11T15:15:11.970Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-08-11T15:30:12.552Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9854ms). Cost: $0.
-[2026-08-11T15:45:12.229Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-08-11T16:00:12.161Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9874ms). Cost: $0.
-[2026-08-11T16:15:11.809Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9822ms). Cost: $0.
-[2026-08-11T16:30:12.477Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9814ms). Cost: $0.
-[2026-08-11T16:45:11.829Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9841ms). Cost: $0.
-[2026-08-11T17:00:13.239Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10329ms). Cost: $0.
-[2026-08-11T17:15:12.171Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9912ms). Cost: $0.
-[2026-08-11T17:30:11.935Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-11T17:45:12.017Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9809ms). Cost: $0.
-[2026-08-11T18:00:11.936Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-11T18:15:12.002Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9847ms). Cost: $0.
-[2026-08-11T18:30:12.252Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-08-11T18:45:11.953Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9860ms). Cost: $0.
-[2026-08-11T19:00:13.191Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10163ms). Cost: $0.
-[2026-08-11T19:15:12.525Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10239ms). Cost: $0.
-[2026-08-11T19:30:12.495Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9692ms). Cost: $0.
-[2026-08-11T19:45:12.056Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9903ms). Cost: $0.
-[2026-08-11T20:00:12.612Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10080ms). Cost: $0.
-[2026-08-11T20:15:12.247Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9976ms). Cost: $0.
-[2026-08-11T20:30:12.194Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-08-11T20:45:12.641Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9908ms). Cost: $0.
-[2026-08-11T21:00:13.094Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10113ms). Cost: $0.
-[2026-08-11T21:15:12.490Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-08-11T21:30:11.882Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9865ms). Cost: $0.
-[2026-08-11T21:45:11.876Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-08-11T22:00:11.832Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-08-11T22:15:12.334Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9851ms). Cost: $0.
-[2026-08-11T22:30:12.105Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-08-11T22:45:12.326Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9764ms). Cost: $0.
-[2026-08-11T23:00:12.550Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-08-11T23:15:12.642Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-08-11T23:30:12.838Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-08-11T23:45:12.037Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9822ms). Cost: $0.
-[2026-08-12T00:00:11.939Z] liveness: tier1 expired=25, tier2 checked=40 removed=0 (9789ms). Cost: $0.
-[2026-08-12T00:15:12.153Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-08-12T00:30:11.648Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9790ms). Cost: $0.
-[2026-08-12T00:45:12.731Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10026ms). Cost: $0.
-[2026-08-12T01:00:12.713Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-08-12T01:15:12.655Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9978ms). Cost: $0.
-[2026-08-12T01:30:12.287Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-08-12T01:45:12.196Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9886ms). Cost: $0.
-[2026-08-12T02:00:13.137Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10513ms). Cost: $0.
-[2026-08-12T02:15:12.508Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-08-12T02:30:12.124Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10032ms). Cost: $0.
-[2026-08-12T02:45:12.221Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9881ms). Cost: $0.
-[2026-08-12T03:00:12.623Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9927ms). Cost: $0.
-[2026-08-12T03:15:12.817Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9978ms). Cost: $0.
-[2026-08-12T03:30:12.992Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-08-12T03:45:11.664Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9958ms). Cost: $0.
-[2026-08-12T04:00:12.809Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10203ms). Cost: $0.
-[2026-08-12T04:15:11.896Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10218ms). Cost: $0.
-[2026-08-12T04:30:12.525Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10040ms). Cost: $0.
-[2026-08-12T04:45:12.342Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-08-12T05:00:13.066Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10188ms). Cost: $0.
-[2026-08-12T05:15:12.538Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-08-12T05:30:11.761Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9795ms). Cost: $0.
-[2026-08-12T05:45:12.160Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9906ms). Cost: $0.
-[2026-08-12T06:00:12.547Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-08-12T06:15:13.364Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10316ms). Cost: $0.
-[2026-08-12T06:30:12.739Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-08-12T06:45:11.911Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9793ms). Cost: $0.
-[2026-08-12T07:00:12.593Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9867ms). Cost: $0.
-[2026-08-12T07:15:12.182Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9888ms). Cost: $0.
-[2026-08-12T07:30:11.925Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9769ms). Cost: $0.
-[2026-08-12T07:45:12.067Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9877ms). Cost: $0.
-[2026-08-12T08:00:12.920Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-08-12T08:15:12.199Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-12T08:30:12.050Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10134ms). Cost: $0.
-[2026-08-12T08:45:12.099Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9828ms). Cost: $0.
-[2026-08-12T09:00:11.932Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9906ms). Cost: $0.
-[2026-08-12T09:15:12.043Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9841ms). Cost: $0.
-[2026-08-12T09:30:12.967Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10139ms). Cost: $0.
-[2026-08-12T09:45:12.053Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-08-12T10:00:12.366Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10210ms). Cost: $0.
-[2026-08-12T10:15:12.353Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10142ms). Cost: $0.
-[2026-08-12T10:30:12.801Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-08-12T10:45:12.191Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-08-12T11:00:12.779Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10566ms). Cost: $0.
-[2026-08-12T11:15:12.570Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9875ms). Cost: $0.
-[2026-08-12T11:30:12.961Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10173ms). Cost: $0.
-[2026-08-12T11:45:11.635Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9935ms). Cost: $0.
-[2026-08-12T12:00:12.750Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-08-12T12:15:12.071Z] liveness: tier1 expired=184, tier2 checked=40 removed=0 (9786ms). Cost: $0.
-[2026-08-12T12:30:11.817Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-08-12T12:45:11.911Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9792ms). Cost: $0.
-[2026-08-12T13:00:11.815Z] liveness: tier1 expired=21, tier2 checked=40 removed=0 (9708ms). Cost: $0.
-[2026-08-12T13:15:12.569Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-08-12T13:30:12.565Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9830ms). Cost: $0.
-[2026-08-12T13:45:11.763Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9660ms). Cost: $0.
-[2026-08-12T14:00:12.894Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9898ms). Cost: $0.
-[2026-08-12T14:15:12.048Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9633ms). Cost: $0.
-[2026-08-12T14:30:12.391Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9736ms). Cost: $0.
-[2026-08-12T14:45:11.406Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9704ms). Cost: $0.
-[2026-08-12T15:00:12.567Z] liveness: tier1 expired=23, tier2 checked=40 removed=0 (9976ms). Cost: $0.
-[2026-08-12T15:15:12.319Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-08-12T15:30:12.427Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-08-12T15:45:12.209Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9981ms). Cost: $0.
-[2026-08-12T16:00:12.687Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10301ms). Cost: $0.
-[2026-08-12T16:15:12.115Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9875ms). Cost: $0.
-[2026-08-12T16:30:12.001Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10087ms). Cost: $0.
-[2026-08-12T16:45:12.218Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-08-12T17:00:12.524Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9924ms). Cost: $0.
-[2026-08-12T17:15:12.211Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9964ms). Cost: $0.
-[2026-08-12T17:30:12.194Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9935ms). Cost: $0.
-[2026-08-12T17:45:12.234Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9764ms). Cost: $0.
-[2026-08-12T18:00:12.191Z] liveness: tier1 expired=22, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-08-12T18:15:12.582Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9832ms). Cost: $0.
-[2026-08-12T18:30:12.584Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (9895ms). Cost: $0.
-[2026-08-12T18:45:12.065Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9800ms). Cost: $0.
-[2026-08-12T19:00:11.979Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9984ms). Cost: $0.
-[2026-08-12T19:15:12.180Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9788ms). Cost: $0.
-[2026-08-12T19:30:11.536Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9788ms). Cost: $0.
-[2026-08-12T19:45:12.334Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9848ms). Cost: $0.
-[2026-08-12T20:00:12.509Z] liveness: tier1 expired=33, tier2 checked=40 removed=0 (9948ms). Cost: $0.
-[2026-08-12T20:15:12.247Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-08-12T20:30:12.383Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9941ms). Cost: $0.
-[2026-08-12T20:45:12.602Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9933ms). Cost: $0.
-[2026-08-12T21:00:12.725Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-08-12T21:15:12.313Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-12T21:30:12.222Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-08-12T21:45:11.986Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-12T22:00:12.096Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-12T22:15:11.864Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-08-12T22:30:12.220Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-08-12T22:45:12.830Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-08-12T23:00:13.471Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9874ms). Cost: $0.
-[2026-08-12T23:15:13.232Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10209ms). Cost: $0.
-[2026-08-12T23:30:12.156Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-08-12T23:45:12.874Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10182ms). Cost: $0.
-[2026-08-13T00:00:12.520Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9949ms). Cost: $0.
-[2026-08-13T00:15:12.559Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-08-13T00:30:12.090Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-08-13T00:45:11.578Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9865ms). Cost: $0.
-[2026-08-13T01:00:12.562Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-08-13T01:15:12.475Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-13T01:30:12.247Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-13T01:45:12.279Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9830ms). Cost: $0.
-[2026-08-13T02:00:13.581Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10167ms). Cost: $0.
-[2026-08-13T02:15:12.097Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9831ms). Cost: $0.
-[2026-08-13T02:30:12.610Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-08-13T02:45:12.298Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10042ms). Cost: $0.
-[2026-08-13T03:00:12.238Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9938ms). Cost: $0.
-[2026-08-13T03:15:12.313Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9890ms). Cost: $0.
-[2026-08-13T03:30:12.548Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-08-13T03:45:12.514Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9806ms). Cost: $0.
-[2026-08-13T04:00:12.768Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-08-13T04:15:12.263Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10281ms). Cost: $0.
-[2026-08-13T04:30:12.345Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9887ms). Cost: $0.
-[2026-08-13T04:45:12.198Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9930ms). Cost: $0.
-[2026-08-13T05:00:12.353Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-08-13T05:15:12.307Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9860ms). Cost: $0.
-[2026-08-13T05:30:12.363Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-08-13T05:45:12.359Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9821ms). Cost: $0.
-[2026-08-13T06:00:12.315Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-08-13T06:15:12.709Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10268ms). Cost: $0.
-[2026-08-13T06:30:13.453Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10153ms). Cost: $0.
-[2026-08-13T06:45:12.106Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9913ms). Cost: $0.
-[2026-08-13T07:00:12.586Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9912ms). Cost: $0.
-[2026-08-13T07:15:12.640Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-08-13T07:30:12.746Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-08-13T07:45:12.683Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10266ms). Cost: $0.
-[2026-08-13T08:00:13.206Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-08-13T08:15:12.319Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9808ms). Cost: $0.
-[2026-08-13T08:30:12.460Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9883ms). Cost: $0.
-[2026-08-13T08:45:12.236Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-08-13T09:00:12.208Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9903ms). Cost: $0.
-[2026-08-13T09:15:12.456Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-08-13T09:30:12.723Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9673ms). Cost: $0.
-[2026-08-13T09:45:11.739Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9831ms). Cost: $0.
-[2026-08-13T10:00:12.472Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9732ms). Cost: $0.
-[2026-08-13T10:15:11.756Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9743ms). Cost: $0.
-[2026-08-13T10:30:13.061Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9896ms). Cost: $0.
-[2026-08-13T10:45:11.503Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9601ms). Cost: $0.
-[2026-08-13T11:00:13.686Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-08-13T11:15:12.886Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-08-13T11:30:13.576Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10102ms). Cost: $0.
-[2026-08-13T11:45:12.665Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-08-13T12:00:12.803Z] liveness: tier1 expired=22, tier2 checked=40 removed=0 (9812ms). Cost: $0.
-[2026-08-13T12:15:11.756Z] liveness: tier1 expired=121, tier2 checked=40 removed=0 (9962ms). Cost: $0.
-[2026-08-13T12:30:11.951Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9812ms). Cost: $0.
-[2026-08-13T12:45:12.388Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-08-13T13:00:13.166Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-08-13T13:15:12.521Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9878ms). Cost: $0.
-[2026-08-13T13:30:12.378Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10270ms). Cost: $0.
-[2026-08-13T13:45:11.888Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9977ms). Cost: $0.
-[2026-08-13T14:00:12.482Z] liveness: tier1 expired=24, tier2 checked=40 removed=0 (9865ms). Cost: $0.
-[2026-08-13T14:15:12.693Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9774ms). Cost: $0.
-[2026-08-13T14:30:12.270Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9889ms). Cost: $0.
-[2026-08-13T14:45:12.499Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-08-13T15:00:12.600Z] liveness: tier1 expired=41, tier2 checked=40 removed=0 (9872ms). Cost: $0.
-[2026-08-13T15:15:12.637Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-08-13T15:30:13.619Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10242ms). Cost: $0.
-[2026-08-13T15:45:12.195Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9948ms). Cost: $0.
-[2026-08-13T16:00:12.295Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9838ms). Cost: $0.
-[2026-08-13T16:15:12.840Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-08-13T16:30:12.661Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10022ms). Cost: $0.
-[2026-08-13T16:45:12.437Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9736ms). Cost: $0.
-[2026-08-13T17:00:12.512Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-08-13T17:15:12.821Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-08-13T17:30:13.259Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10227ms). Cost: $0.
-[2026-08-13T17:45:12.469Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9860ms). Cost: $0.
-[2026-08-13T18:00:12.440Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9894ms). Cost: $0.
-[2026-08-13T18:15:12.305Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-08-13T18:30:12.034Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-08-13T18:45:12.276Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-08-13T19:00:13.163Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (10067ms). Cost: $0.
-[2026-08-13T19:15:12.119Z] liveness: tier1 expired=26, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-08-13T19:30:12.000Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-08-13T19:45:12.368Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-08-13T20:00:13.199Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-08-13T20:15:12.707Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-08-13T20:30:12.237Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9910ms). Cost: $0.
-[2026-08-13T20:45:12.056Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-08-13T21:00:12.554Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-08-13T21:15:12.652Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10149ms). Cost: $0.
-[2026-08-13T21:30:13.381Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9844ms). Cost: $0.
-[2026-08-13T21:45:11.571Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9722ms). Cost: $0.
-[2026-08-13T22:00:13.090Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (9949ms). Cost: $0.
-[2026-08-13T22:15:11.956Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-13T22:30:12.838Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9795ms). Cost: $0.
-[2026-08-13T22:45:12.704Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-08-13T23:00:12.446Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9884ms). Cost: $0.
-[2026-08-13T23:15:12.377Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9715ms). Cost: $0.
-[2026-08-13T23:30:12.652Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9741ms). Cost: $0.
-[2026-08-13T23:45:12.128Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9722ms). Cost: $0.
-[2026-08-14T00:00:12.404Z] liveness: tier1 expired=135, tier2 checked=40 removed=0 (9851ms). Cost: $0.
-[2026-08-14T00:15:11.831Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9583ms). Cost: $0.
-[2026-08-14T00:30:12.199Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9654ms). Cost: $0.
-[2026-08-14T00:45:11.737Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9576ms). Cost: $0.
-[2026-08-14T01:00:12.403Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9695ms). Cost: $0.
-[2026-08-14T01:15:12.475Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9595ms). Cost: $0.
-[2026-08-14T01:30:13.421Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10144ms). Cost: $0.
-[2026-08-14T01:45:11.776Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9721ms). Cost: $0.
-[2026-08-14T02:00:13.717Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9781ms). Cost: $0.
-[2026-08-14T02:15:11.979Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9638ms). Cost: $0.
-[2026-08-14T02:30:12.995Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9731ms). Cost: $0.
-[2026-08-14T02:45:12.109Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9665ms). Cost: $0.
-[2026-08-14T03:00:12.479Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9815ms). Cost: $0.
-[2026-08-14T03:15:11.819Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9811ms). Cost: $0.
-[2026-08-14T03:30:12.926Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9955ms). Cost: $0.
-[2026-08-14T03:45:12.843Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-08-14T04:00:12.604Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10144ms). Cost: $0.
-[2026-08-14T04:15:12.595Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9954ms). Cost: $0.
-[2026-08-14T04:30:12.176Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-14T04:45:12.704Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9901ms). Cost: $0.
-[2026-08-14T05:00:13.574Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10115ms). Cost: $0.
-[2026-08-14T05:15:12.377Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9899ms). Cost: $0.
-[2026-08-14T05:30:12.017Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9903ms). Cost: $0.
-[2026-08-14T05:45:12.798Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10064ms). Cost: $0.
-[2026-08-14T06:00:12.567Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9981ms). Cost: $0.
-[2026-08-14T06:15:11.932Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9964ms). Cost: $0.
-[2026-08-14T06:30:12.662Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-08-14T06:45:12.471Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9831ms). Cost: $0.
-[2026-08-14T07:00:12.116Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9850ms). Cost: $0.
-[2026-08-14T07:15:12.726Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-08-14T07:30:13.087Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-08-14T07:45:12.198Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-08-14T08:00:12.115Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-08-14T08:15:12.166Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9904ms). Cost: $0.
-[2026-08-14T08:30:12.413Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9921ms). Cost: $0.
-[2026-08-14T08:45:12.910Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-08-14T09:00:12.158Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10312ms). Cost: $0.
-[2026-08-14T09:15:11.709Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9944ms). Cost: $0.
-[2026-08-14T09:30:12.156Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9948ms). Cost: $0.
-[2026-08-14T09:45:11.988Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-08-14T10:00:12.370Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10168ms). Cost: $0.
-[2026-08-14T10:15:11.746Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9865ms). Cost: $0.
-[2026-08-14T10:30:12.329Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-08-14T10:45:11.992Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10012ms). Cost: $0.
-[2026-08-14T11:00:12.113Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-08-14T11:15:12.032Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-08-14T11:30:12.298Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10142ms). Cost: $0.
-[2026-08-14T11:45:11.527Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-08-14T12:00:13.068Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10307ms). Cost: $0.
-[2026-08-14T12:15:12.282Z] liveness: tier1 expired=259, tier2 checked=40 removed=0 (9930ms). Cost: $0.
-[2026-08-14T12:30:12.094Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9872ms). Cost: $0.
-[2026-08-14T12:45:11.950Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9896ms). Cost: $0.
-[2026-08-14T13:00:11.898Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-08-14T13:15:12.216Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9786ms). Cost: $0.
-[2026-08-14T13:30:12.140Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-14T13:45:11.880Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (9786ms). Cost: $0.
-[2026-08-14T14:00:13.457Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9955ms). Cost: $0.
-[2026-08-14T14:15:12.933Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-08-14T14:30:13.323Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10119ms). Cost: $0.
-[2026-08-14T14:45:12.691Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-08-14T15:00:12.701Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9904ms). Cost: $0.
-[2026-08-14T15:15:12.547Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9881ms). Cost: $0.
-[2026-08-14T15:30:12.640Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-08-14T15:45:11.947Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9867ms). Cost: $0.
-[2026-08-14T16:00:12.264Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10097ms). Cost: $0.
-[2026-08-14T16:15:12.631Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9725ms). Cost: $0.
-[2026-08-14T16:30:11.529Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9842ms). Cost: $0.
-[2026-08-14T16:45:12.201Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9797ms). Cost: $0.
-[2026-08-14T17:00:12.455Z] liveness: tier1 expired=34, tier2 checked=40 removed=0 (9996ms). Cost: $0.
-[2026-08-14T17:15:11.693Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9876ms). Cost: $0.
-[2026-08-14T17:30:11.826Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10090ms). Cost: $0.
-[2026-08-14T17:45:12.136Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9914ms). Cost: $0.
-[2026-08-14T18:00:12.283Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10254ms). Cost: $0.
-[2026-08-14T18:15:12.408Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9955ms). Cost: $0.
-[2026-08-14T18:30:12.486Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9950ms). Cost: $0.
-[2026-08-14T18:45:12.673Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10030ms). Cost: $0.
-[2026-08-14T19:00:13.022Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10033ms). Cost: $0.
-[2026-08-14T19:15:12.706Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10121ms). Cost: $0.
-[2026-08-14T19:30:12.475Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-08-14T19:45:12.325Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10012ms). Cost: $0.
-[2026-08-14T20:00:12.300Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10125ms). Cost: $0.
-[2026-08-14T20:15:12.103Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9966ms). Cost: $0.
-[2026-08-14T20:30:12.574Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10018ms). Cost: $0.
-[2026-08-14T20:45:12.281Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9981ms). Cost: $0.
-[2026-08-14T21:00:12.523Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10342ms). Cost: $0.
-[2026-08-14T21:15:12.148Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-08-14T21:30:12.619Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-14T21:45:12.244Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9941ms). Cost: $0.
-[2026-08-14T22:00:12.449Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-08-14T22:15:12.839Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9909ms). Cost: $0.
-[2026-08-14T22:30:13.088Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9975ms). Cost: $0.
-[2026-08-14T22:45:12.650Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9898ms). Cost: $0.
-[2026-08-14T23:00:13.172Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9883ms). Cost: $0.
-[2026-08-14T23:15:12.349Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9948ms). Cost: $0.
-[2026-08-14T23:30:12.399Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10142ms). Cost: $0.
-[2026-08-14T23:45:11.768Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9914ms). Cost: $0.
-[2026-08-15T00:00:13.157Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-08-15T00:15:11.740Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-08-15T00:30:12.491Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10202ms). Cost: $0.
-[2026-08-15T00:45:12.311Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9963ms). Cost: $0.
-[2026-08-15T01:00:13.332Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10190ms). Cost: $0.
-[2026-08-15T01:15:12.606Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-08-15T01:30:12.347Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9970ms). Cost: $0.
-[2026-08-15T01:45:11.927Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-08-15T02:00:12.555Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10133ms). Cost: $0.
-[2026-08-15T02:15:12.565Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10108ms). Cost: $0.
-[2026-08-15T02:30:12.598Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-08-15T02:45:12.632Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-08-15T03:00:13.243Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10260ms). Cost: $0.
-[2026-08-15T03:15:12.515Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10083ms). Cost: $0.
-[2026-08-15T03:30:13.254Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10356ms). Cost: $0.
-[2026-08-15T03:45:12.696Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10165ms). Cost: $0.
-[2026-08-15T04:00:12.800Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10274ms). Cost: $0.
-[2026-08-15T04:15:12.514Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9937ms). Cost: $0.
-[2026-08-15T04:30:11.951Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10017ms). Cost: $0.
-[2026-08-15T04:45:11.680Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9851ms). Cost: $0.
-[2026-08-15T05:00:14.437Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10656ms). Cost: $0.
-[2026-08-15T05:15:12.603Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-08-15T05:30:12.518Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10177ms). Cost: $0.
-[2026-08-15T05:45:12.016Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-08-15T06:00:12.683Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-15T06:15:13.369Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10859ms). Cost: $0.
-[2026-08-15T06:30:13.177Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10121ms). Cost: $0.
-[2026-08-15T06:45:12.330Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10029ms). Cost: $0.
-[2026-08-15T07:00:12.393Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9948ms). Cost: $0.
-[2026-08-15T07:15:12.452Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-08-15T07:30:12.310Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-08-15T07:45:11.877Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9966ms). Cost: $0.
-[2026-08-15T08:00:12.888Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10010ms). Cost: $0.
-[2026-08-15T08:15:12.050Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9918ms). Cost: $0.
-[2026-08-15T08:30:12.745Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9984ms). Cost: $0.
-[2026-08-15T08:45:13.004Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9926ms). Cost: $0.
-[2026-08-15T09:00:12.337Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10106ms). Cost: $0.
-[2026-08-15T09:15:12.219Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9998ms). Cost: $0.
-[2026-08-15T09:30:11.953Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-15T09:45:11.908Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-08-15T10:00:12.887Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-08-15T10:15:11.840Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-08-15T10:30:12.841Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-08-15T10:45:12.340Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10163ms). Cost: $0.
-[2026-08-15T11:00:13.221Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-08-15T11:15:12.068Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10056ms). Cost: $0.
-[2026-08-15T11:30:13.167Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10253ms). Cost: $0.
-[2026-08-15T11:45:12.727Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-08-15T12:00:13.570Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10366ms). Cost: $0.
-[2026-08-15T12:15:12.493Z] liveness: tier1 expired=101, tier2 checked=40 removed=0 (9817ms). Cost: $0.
-[2026-08-15T12:30:13.009Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10032ms). Cost: $0.
-[2026-08-15T12:45:11.651Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-08-15T13:00:12.891Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-08-15T13:15:12.211Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-08-15T13:30:12.522Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9887ms). Cost: $0.
-[2026-08-15T13:45:11.772Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9925ms). Cost: $0.
-[2026-08-15T14:00:11.941Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9866ms). Cost: $0.
-[2026-08-15T14:15:12.372Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9875ms). Cost: $0.
-[2026-08-15T14:30:12.197Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-08-15T14:45:12.996Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9877ms). Cost: $0.
-[2026-08-15T15:00:12.968Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-08-15T15:15:13.315Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10206ms). Cost: $0.
-[2026-08-15T15:30:12.521Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10119ms). Cost: $0.
-[2026-08-15T15:45:13.183Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9877ms). Cost: $0.
-[2026-08-15T16:00:12.188Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9963ms). Cost: $0.
-[2026-08-15T16:15:13.032Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9960ms). Cost: $0.
-[2026-08-15T16:30:12.069Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-08-15T16:45:12.003Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10006ms). Cost: $0.
-[2026-08-15T17:00:11.950Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10002ms). Cost: $0.
-[2026-08-15T17:15:12.537Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-08-15T17:30:12.014Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9919ms). Cost: $0.
-[2026-08-15T17:45:12.258Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9770ms). Cost: $0.
-[2026-08-15T18:00:12.039Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9896ms). Cost: $0.
-[2026-08-15T18:15:13.027Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9777ms). Cost: $0.
-[2026-08-15T18:30:12.548Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-08-15T18:45:13.136Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-08-15T19:00:12.327Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9799ms). Cost: $0.
-[2026-08-15T19:15:12.157Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9912ms). Cost: $0.
-[2026-08-15T19:30:11.784Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9920ms). Cost: $0.
-[2026-08-15T19:45:12.404Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9877ms). Cost: $0.
-[2026-08-15T20:00:12.893Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10394ms). Cost: $0.
-[2026-08-15T20:15:12.876Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-08-15T20:30:13.183Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10952ms). Cost: $0.
-[2026-08-15T20:45:11.892Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-08-15T21:00:12.234Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10392ms). Cost: $0.
-[2026-08-15T21:15:12.872Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9935ms). Cost: $0.
-[2026-08-15T21:30:12.124Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-08-15T21:45:11.955Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-08-15T22:00:12.430Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9976ms). Cost: $0.
-[2026-08-15T22:15:12.851Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-08-15T22:30:12.952Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10010ms). Cost: $0.
-[2026-08-15T22:45:12.732Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-08-15T23:00:13.362Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9994ms). Cost: $0.
-[2026-08-15T23:15:12.243Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (9893ms). Cost: $0.
-[2026-08-15T23:30:12.466Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9962ms). Cost: $0.
-[2026-08-15T23:45:12.468Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9939ms). Cost: $0.
-[2026-08-16T00:00:13.514Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10223ms). Cost: $0.
-[2026-08-16T00:15:12.699Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10077ms). Cost: $0.
-[2026-08-16T00:30:12.412Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-16T00:45:11.678Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-08-16T01:00:12.806Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-08-16T01:15:11.866Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-08-16T01:30:12.125Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9937ms). Cost: $0.
-[2026-08-16T01:45:11.987Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9889ms). Cost: $0.
-[2026-08-16T02:00:14.815Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (11068ms). Cost: $0.
-[2026-08-16T02:15:11.698Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-08-16T02:30:12.776Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-16T02:45:11.750Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9981ms). Cost: $0.
-[2026-08-16T03:00:13.625Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-08-16T03:15:12.670Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-08-16T03:30:12.856Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10055ms). Cost: $0.
-[2026-08-16T03:45:11.820Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-08-16T04:00:13.625Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-08-16T04:15:12.570Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9848ms). Cost: $0.
-[2026-08-16T04:30:12.013Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10194ms). Cost: $0.
-[2026-08-16T04:45:12.627Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10059ms). Cost: $0.
-[2026-08-16T05:00:11.900Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-08-16T05:15:12.384Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-08-16T05:30:12.183Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10110ms). Cost: $0.
-[2026-08-16T05:45:12.101Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9926ms). Cost: $0.
-[2026-08-16T06:00:13.527Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10058ms). Cost: $0.
-[2026-08-16T06:15:12.705Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10111ms). Cost: $0.
-[2026-08-16T06:30:12.433Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10551ms). Cost: $0.
-[2026-08-16T06:45:12.628Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-08-16T07:00:13.195Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-08-16T07:15:12.867Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10110ms). Cost: $0.
-[2026-08-16T07:30:13.530Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10290ms). Cost: $0.
-[2026-08-16T07:45:12.018Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10246ms). Cost: $0.
-[2026-08-16T08:00:12.295Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10166ms). Cost: $0.
-[2026-08-16T08:15:12.470Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9873ms). Cost: $0.
-[2026-08-16T08:30:12.906Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-08-16T08:45:12.473Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9987ms). Cost: $0.
-[2026-08-16T09:00:12.907Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-08-16T09:15:12.788Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10280ms). Cost: $0.
-[2026-08-16T09:30:12.726Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10172ms). Cost: $0.
-[2026-08-16T09:45:11.696Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9965ms). Cost: $0.
-[2026-08-16T10:00:12.550Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-08-16T10:15:12.413Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-08-16T10:30:12.611Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-08-16T10:45:12.104Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9921ms). Cost: $0.
-[2026-08-16T11:00:12.330Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10174ms). Cost: $0.
-[2026-08-16T11:15:12.678Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-08-16T11:30:12.537Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-08-16T11:45:11.759Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9977ms). Cost: $0.
-[2026-08-16T12:00:13.205Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10347ms). Cost: $0.
-[2026-08-16T12:15:12.439Z] liveness: tier1 expired=101, tier2 checked=40 removed=0 (9865ms). Cost: $0.
-[2026-08-16T12:30:12.739Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-08-16T12:45:12.548Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9872ms). Cost: $0.
-[2026-08-16T13:00:12.642Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-08-16T13:15:12.473Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9867ms). Cost: $0.
-[2026-08-16T13:30:12.231Z] liveness: tier1 expired=53, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-08-16T13:45:11.929Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9803ms). Cost: $0.
-[2026-08-16T14:00:12.137Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10163ms). Cost: $0.
-[2026-08-16T14:15:12.082Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9910ms). Cost: $0.
-[2026-08-16T14:30:11.911Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10117ms). Cost: $0.
-[2026-08-16T14:45:11.558Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9920ms). Cost: $0.
-[2026-08-16T15:00:13.288Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10287ms). Cost: $0.
-[2026-08-16T15:15:12.313Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-08-16T15:30:12.665Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-08-16T15:45:12.926Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10000ms). Cost: $0.
-[2026-08-16T16:00:12.677Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-08-16T16:15:12.180Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9861ms). Cost: $0.
-[2026-08-16T16:30:12.153Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-08-16T16:45:12.929Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-08-16T17:00:13.678Z] liveness: tier1 expired=18, tier2 checked=40 removed=0 (10008ms). Cost: $0.
-[2026-08-16T17:15:12.488Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10174ms). Cost: $0.
-[2026-08-16T17:30:11.926Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-08-16T17:45:12.043Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-08-16T18:00:12.062Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10193ms). Cost: $0.
-[2026-08-16T18:15:11.741Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-08-16T18:30:12.387Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-16T18:45:12.390Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9937ms). Cost: $0.
-[2026-08-16T19:00:13.379Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10391ms). Cost: $0.
-[2026-08-16T19:15:12.578Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9872ms). Cost: $0.
-[2026-08-16T19:30:12.096Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-08-16T19:45:12.286Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9875ms). Cost: $0.
-[2026-08-16T20:00:12.246Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9986ms). Cost: $0.
-[2026-08-16T20:15:12.449Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9928ms). Cost: $0.
-[2026-08-16T20:30:12.387Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10186ms). Cost: $0.
-[2026-08-16T20:45:12.402Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-08-16T21:00:12.910Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10088ms). Cost: $0.
-[2026-08-16T21:15:12.749Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-08-16T21:30:12.707Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10000ms). Cost: $0.
-[2026-08-16T21:45:12.114Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-16T22:00:11.953Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10019ms). Cost: $0.
-[2026-08-16T22:15:11.974Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9914ms). Cost: $0.
-[2026-08-16T22:30:12.743Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9978ms). Cost: $0.
-[2026-08-16T22:45:11.855Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9912ms). Cost: $0.
-[2026-08-16T23:00:12.165Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-08-16T23:15:12.570Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-16T23:30:12.509Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9906ms). Cost: $0.
-[2026-08-16T23:45:11.897Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9872ms). Cost: $0.
-[2026-08-17T00:00:12.257Z] liveness: tier1 expired=73, tier2 checked=40 removed=0 (10219ms). Cost: $0.
-[2026-08-17T00:15:12.494Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9867ms). Cost: $0.
-[2026-08-17T00:30:12.294Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-08-17T00:45:12.874Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10000ms). Cost: $0.
-[2026-08-17T01:00:13.258Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10026ms). Cost: $0.
-[2026-08-17T01:15:13.042Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-08-17T01:30:13.230Z] liveness: tier1 expired=32, tier2 checked=40 removed=0 (9852ms). Cost: $0.
-[2026-08-17T01:45:12.014Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9843ms). Cost: $0.
-[2026-08-17T02:00:12.151Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10194ms). Cost: $0.
-[2026-08-17T02:15:12.494Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10009ms). Cost: $0.
-[2026-08-17T02:30:12.493Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10029ms). Cost: $0.
-[2026-08-17T02:45:12.024Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-08-17T03:00:12.416Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-08-17T03:15:12.513Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9892ms). Cost: $0.
-[2026-08-17T03:30:12.897Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10324ms). Cost: $0.
-[2026-08-17T03:45:12.373Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-08-17T04:00:13.170Z] liveness: tier1 expired=35, tier2 checked=40 removed=0 (10533ms). Cost: $0.
-[2026-08-17T04:15:11.954Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9890ms). Cost: $0.
-[2026-08-17T04:30:13.166Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10125ms). Cost: $0.
-[2026-08-17T04:45:13.043Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9938ms). Cost: $0.
-[2026-08-17T05:00:12.898Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10194ms). Cost: $0.
-[2026-08-17T05:15:12.208Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10167ms). Cost: $0.
-[2026-08-17T05:30:11.998Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9987ms). Cost: $0.
-[2026-08-17T05:45:11.678Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9832ms). Cost: $0.
-[2026-08-17T06:00:12.453Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-08-17T06:15:13.042Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10247ms). Cost: $0.
-[2026-08-17T06:30:12.463Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (9902ms). Cost: $0.
-[2026-08-17T06:45:12.276Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10212ms). Cost: $0.
-[2026-08-17T07:00:12.518Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9998ms). Cost: $0.
-[2026-08-17T07:15:13.189Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10519ms). Cost: $0.
-[2026-08-17T07:30:13.170Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10120ms). Cost: $0.
-[2026-08-17T07:45:12.102Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-08-17T08:00:13.707Z] liveness: tier1 expired=53, tier2 checked=40 removed=0 (10355ms). Cost: $0.
-[2026-08-17T08:15:12.770Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10077ms). Cost: $0.
-[2026-08-17T08:30:12.606Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-08-17T08:45:12.034Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-08-17T09:00:13.774Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10266ms). Cost: $0.
-[2026-08-17T09:15:12.479Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9963ms). Cost: $0.
-[2026-08-17T09:30:12.277Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-08-17T09:45:12.157Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10133ms). Cost: $0.
-[2026-08-17T10:00:12.257Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10189ms). Cost: $0.
-[2026-08-17T10:15:11.926Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-08-17T10:30:13.783Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10424ms). Cost: $0.
-[2026-08-17T10:45:12.008Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-08-17T11:00:13.110Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10213ms). Cost: $0.
-[2026-08-17T11:15:12.827Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10227ms). Cost: $0.
-[2026-08-17T11:30:12.977Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9998ms). Cost: $0.
-[2026-08-17T11:45:12.323Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-08-17T12:00:12.912Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-08-17T12:15:12.275Z] liveness: tier1 expired=184, tier2 checked=40 removed=0 (10395ms). Cost: $0.
-[2026-08-17T12:30:12.910Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-08-17T12:45:12.200Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9878ms). Cost: $0.
-[2026-08-17T13:00:13.244Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10368ms). Cost: $0.
-[2026-08-17T13:15:13.257Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-08-17T13:30:12.960Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10298ms). Cost: $0.
-[2026-08-17T13:45:12.244Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9732ms). Cost: $0.
-[2026-08-17T14:00:13.431Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10633ms). Cost: $0.
-[2026-08-17T14:15:12.476Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10048ms). Cost: $0.
-[2026-08-17T14:30:13.856Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10213ms). Cost: $0.
-[2026-08-17T14:45:12.914Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-08-17T15:00:13.291Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10299ms). Cost: $0.
-[2026-08-17T15:15:13.465Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-08-17T15:30:12.298Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-08-17T15:45:11.714Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-08-17T16:00:12.878Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-08-17T16:15:12.285Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-08-17T16:30:12.204Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10258ms). Cost: $0.
-[2026-08-17T16:45:13.550Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10431ms). Cost: $0.
-[2026-08-17T17:00:13.978Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10742ms). Cost: $0.
-[2026-08-17T17:15:13.026Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10238ms). Cost: $0.
-[2026-08-17T17:30:12.144Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10381ms). Cost: $0.
-[2026-08-17T17:45:13.073Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10181ms). Cost: $0.
-[2026-08-17T18:00:12.103Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10033ms). Cost: $0.
-[2026-08-17T18:15:12.845Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9916ms). Cost: $0.
-[2026-08-17T18:30:12.588Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-08-17T18:45:13.018Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9984ms). Cost: $0.
-[2026-08-17T19:00:12.021Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-08-17T19:15:12.361Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10262ms). Cost: $0.
-[2026-08-17T19:30:12.560Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9938ms). Cost: $0.
-[2026-08-17T19:45:12.272Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-08-17T20:00:12.445Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10178ms). Cost: $0.
-[2026-08-17T20:15:12.252Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-08-17T20:30:11.928Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10161ms). Cost: $0.
-[2026-08-17T20:45:12.870Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9757ms). Cost: $0.
-[2026-08-17T21:00:13.669Z] liveness: tier1 expired=18, tier2 checked=40 removed=0 (10168ms). Cost: $0.
-[2026-08-17T21:15:13.217Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10349ms). Cost: $0.
-[2026-08-17T21:30:12.918Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10285ms). Cost: $0.
-[2026-08-17T21:45:12.740Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10194ms). Cost: $0.
-[2026-08-17T22:00:13.910Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10581ms). Cost: $0.
-[2026-08-17T22:15:11.902Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9932ms). Cost: $0.
-[2026-08-17T22:30:12.392Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-08-17T22:45:12.882Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10162ms). Cost: $0.
-[2026-08-17T23:00:12.623Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10650ms). Cost: $0.
-[2026-08-17T23:15:12.746Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10148ms). Cost: $0.
-[2026-08-17T23:30:12.354Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-08-17T23:45:12.311Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10085ms). Cost: $0.
-[2026-08-18T00:00:12.317Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-08-18T00:15:11.684Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-08-18T00:30:12.293Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9950ms). Cost: $0.
-[2026-08-18T00:45:12.542Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9874ms). Cost: $0.
-[2026-08-18T01:00:13.070Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10030ms). Cost: $0.
-[2026-08-18T01:15:12.484Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9952ms). Cost: $0.
-[2026-08-18T01:30:13.074Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-08-18T01:45:11.773Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10036ms). Cost: $0.
-[2026-08-18T02:00:13.953Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10235ms). Cost: $0.
-[2026-08-18T02:15:12.165Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-08-18T02:30:12.641Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10079ms). Cost: $0.
-[2026-08-18T02:45:12.196Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9916ms). Cost: $0.
-[2026-08-18T03:00:12.146Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-08-18T03:15:12.679Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-08-18T03:30:12.415Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-08-18T03:45:12.263Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9982ms). Cost: $0.
-[2026-08-18T04:00:12.495Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10206ms). Cost: $0.
-[2026-08-18T04:15:12.182Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-08-18T04:30:12.711Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9880ms). Cost: $0.
-[2026-08-18T04:45:12.348Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9899ms). Cost: $0.
-[2026-08-18T05:00:13.134Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10143ms). Cost: $0.
-[2026-08-18T05:15:12.024Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-08-18T05:30:12.804Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10188ms). Cost: $0.
-[2026-08-18T05:45:11.791Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9896ms). Cost: $0.
-[2026-08-18T06:00:12.264Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9869ms). Cost: $0.
-[2026-08-18T06:15:12.418Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-08-18T06:30:13.649Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-08-18T06:45:12.289Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9889ms). Cost: $0.
-[2026-08-18T07:00:12.789Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10234ms). Cost: $0.
-[2026-08-18T07:15:13.097Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-08-18T07:30:12.830Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10053ms). Cost: $0.
-[2026-08-18T07:45:12.533Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-08-18T08:00:13.171Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10220ms). Cost: $0.
-[2026-08-18T08:15:11.893Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9853ms). Cost: $0.
-[2026-08-18T08:30:12.906Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9898ms). Cost: $0.
-[2026-08-18T08:45:12.644Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9961ms). Cost: $0.
-[2026-08-18T09:00:12.654Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10106ms). Cost: $0.
-[2026-08-18T09:15:12.289Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-08-18T09:30:12.201Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-18T09:45:12.372Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9961ms). Cost: $0.
-[2026-08-18T10:00:12.046Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-08-18T10:15:12.413Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9936ms). Cost: $0.
-[2026-08-18T10:30:13.101Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9977ms). Cost: $0.
-[2026-08-18T10:45:11.645Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9895ms). Cost: $0.
-[2026-08-18T11:00:13.639Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-08-18T11:15:12.001Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10178ms). Cost: $0.
-[2026-08-18T11:30:13.146Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10008ms). Cost: $0.
-[2026-08-18T11:45:11.708Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-08-18T12:00:12.617Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10122ms). Cost: $0.
-[2026-08-18T12:15:11.691Z] liveness: tier1 expired=135, tier2 checked=40 removed=0 (9981ms). Cost: $0.
-[2026-08-18T12:30:12.470Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-08-18T12:45:12.740Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-08-18T13:00:12.172Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10337ms). Cost: $0.
-[2026-08-18T13:15:12.828Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9899ms). Cost: $0.
-[2026-08-18T13:30:11.847Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-08-18T13:45:12.449Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10218ms). Cost: $0.
-[2026-08-18T14:00:12.593Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10096ms). Cost: $0.
-[2026-08-18T14:15:11.926Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9746ms). Cost: $0.
-[2026-08-18T14:30:13.382Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10144ms). Cost: $0.
-[2026-08-18T14:45:12.273Z] liveness: tier1 expired=58, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-08-18T15:00:12.123Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-08-18T15:15:12.514Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9904ms). Cost: $0.
-[2026-08-18T15:30:12.351Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10146ms). Cost: $0.
-[2026-08-18T15:45:11.912Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9925ms). Cost: $0.
-[2026-08-18T16:00:12.095Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10229ms). Cost: $0.
-[2026-08-18T16:15:12.755Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-08-18T16:30:12.726Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10022ms). Cost: $0.
-[2026-08-18T16:45:11.804Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-08-18T17:00:13.954Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10980ms). Cost: $0.
-[2026-08-18T17:15:12.388Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9928ms). Cost: $0.
-[2026-08-18T17:30:12.748Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10316ms). Cost: $0.
-[2026-08-18T17:45:11.757Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9892ms). Cost: $0.
-[2026-08-18T18:00:12.660Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-08-18T18:15:13.290Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10233ms). Cost: $0.
-[2026-08-18T18:30:12.207Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9902ms). Cost: $0.
-[2026-08-18T18:45:13.187Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-08-18T19:00:13.266Z] liveness: tier1 expired=32, tier2 checked=40 removed=0 (10064ms). Cost: $0.
-[2026-08-18T19:15:12.853Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-08-18T19:30:12.418Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10340ms). Cost: $0.
-[2026-08-18T19:45:11.931Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-08-18T20:00:12.273Z] liveness: tier1 expired=75, tier2 checked=40 removed=0 (10399ms). Cost: $0.
-[2026-08-18T20:15:12.087Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-08-18T20:30:12.555Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-08-18T20:45:11.940Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-18T21:00:12.984Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10222ms). Cost: $0.
-[2026-08-18T21:15:12.667Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-08-18T21:30:13.274Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10198ms). Cost: $0.
-[2026-08-18T21:45:12.600Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10190ms). Cost: $0.
-[2026-08-18T22:00:13.185Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-08-18T22:15:12.430Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9977ms). Cost: $0.
-[2026-08-18T22:30:12.504Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-08-18T22:45:12.964Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10026ms). Cost: $0.
-[2026-08-18T23:00:12.803Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-08-18T23:15:12.887Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10344ms). Cost: $0.
-[2026-08-18T23:30:15.057Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (12219ms). Cost: $0.
-[2026-08-18T23:45:11.674Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9887ms). Cost: $0.
-[2026-08-19T00:00:13.133Z] liveness: tier1 expired=73, tier2 checked=40 removed=0 (10289ms). Cost: $0.
-[2026-08-19T00:15:11.808Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-08-19T00:30:11.980Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10022ms). Cost: $0.
-[2026-08-19T00:45:12.330Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9872ms). Cost: $0.
-[2026-08-19T01:00:12.146Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-08-19T01:15:12.391Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-08-19T01:30:13.146Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10404ms). Cost: $0.
-[2026-08-19T01:45:12.348Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-19T02:00:12.998Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-08-19T02:15:11.779Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9876ms). Cost: $0.
-[2026-08-19T02:30:12.790Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-08-19T02:45:12.209Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-08-19T03:00:13.271Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-08-19T03:15:12.354Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-08-19T03:30:13.107Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10090ms). Cost: $0.
-[2026-08-19T03:45:12.238Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-08-19T04:00:12.675Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-08-19T04:15:11.925Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10156ms). Cost: $0.
-[2026-08-19T04:30:12.378Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-08-19T04:45:12.407Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-08-19T05:00:13.782Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10120ms). Cost: $0.
-[2026-08-19T05:15:12.471Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9981ms). Cost: $0.
-[2026-08-19T05:30:12.404Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-08-19T05:45:11.919Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-08-19T06:00:12.445Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-08-19T06:15:12.455Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10291ms). Cost: $0.
-[2026-08-19T06:30:12.897Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10103ms). Cost: $0.
-[2026-08-19T06:45:12.849Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-08-19T07:00:13.065Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-08-19T07:15:12.053Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10093ms). Cost: $0.
-[2026-08-19T07:30:13.022Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-08-19T07:45:12.423Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10057ms). Cost: $0.
-[2026-08-19T08:00:13.030Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-08-19T08:15:12.389Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9958ms). Cost: $0.
-[2026-08-19T08:30:12.424Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10229ms). Cost: $0.
-[2026-08-19T08:45:12.191Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-08-19T09:00:12.101Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10277ms). Cost: $0.
-[2026-08-19T09:15:12.245Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9916ms). Cost: $0.
-[2026-08-19T09:30:11.907Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9978ms). Cost: $0.
-[2026-08-19T09:45:12.243Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9964ms). Cost: $0.
-[2026-08-19T10:00:12.140Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-08-19T10:15:12.204Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9927ms). Cost: $0.
-[2026-08-19T10:30:13.408Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-08-19T10:45:12.498Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9752ms). Cost: $0.
-[2026-08-19T11:00:12.255Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9839ms). Cost: $0.
-[2026-08-19T11:15:12.053Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9849ms). Cost: $0.
-[2026-08-19T11:30:13.129Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-08-19T11:45:11.574Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9844ms). Cost: $0.
-[2026-08-19T12:00:12.688Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (10040ms). Cost: $0.
-[2026-08-19T12:15:12.009Z] liveness: tier1 expired=213, tier2 checked=40 removed=0 (9903ms). Cost: $0.
-[2026-08-19T12:30:12.398Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-08-19T12:45:11.862Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-08-19T13:00:12.916Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10183ms). Cost: $0.
-[2026-08-19T13:15:11.717Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-08-19T13:30:12.477Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9982ms). Cost: $0.
-[2026-08-19T13:45:12.077Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-08-19T14:00:13.308Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10199ms). Cost: $0.
-[2026-08-19T14:15:12.699Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9920ms). Cost: $0.
-[2026-08-19T14:30:12.950Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-08-19T14:45:12.747Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10083ms). Cost: $0.
-[2026-08-19T15:00:13.650Z] liveness: tier1 expired=30, tier2 checked=40 removed=0 (10307ms). Cost: $0.
-[2026-08-19T15:15:13.345Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-08-19T15:30:12.407Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-08-19T15:45:12.734Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-08-19T16:00:13.012Z] liveness: tier1 expired=21, tier2 checked=40 removed=0 (10232ms). Cost: $0.
-[2026-08-19T16:15:12.806Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9941ms). Cost: $0.
-[2026-08-19T16:30:12.383Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-08-19T16:45:12.140Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-19T17:00:13.054Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10318ms). Cost: $0.
-[2026-08-19T17:15:12.287Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10189ms). Cost: $0.
-[2026-08-19T17:30:12.189Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-08-19T17:45:12.176Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-08-19T18:00:12.019Z] liveness: tier1 expired=21, tier2 checked=40 removed=0 (9973ms). Cost: $0.
-[2026-08-19T18:15:12.955Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-08-19T18:30:12.213Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9930ms). Cost: $0.
-[2026-08-19T18:45:12.921Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-08-19T19:00:12.387Z] liveness: tier1 expired=22, tier2 checked=40 removed=0 (10417ms). Cost: $0.
-[2026-08-19T19:15:12.018Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-08-19T19:30:12.558Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10010ms). Cost: $0.
-[2026-08-19T19:45:12.453Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10165ms). Cost: $0.
-[2026-08-19T20:00:13.182Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10482ms). Cost: $0.
-[2026-08-19T20:15:11.900Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-08-19T20:30:12.571Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10012ms). Cost: $0.
-[2026-08-19T20:45:12.645Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-08-19T21:00:13.195Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-08-19T21:15:12.087Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9966ms). Cost: $0.
-[2026-08-19T21:30:13.480Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-08-19T21:45:12.492Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9906ms). Cost: $0.
-[2026-08-19T22:00:12.978Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-08-19T22:15:12.317Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-08-19T22:30:13.393Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10232ms). Cost: $0.
-[2026-08-19T22:45:12.969Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-08-19T23:00:12.694Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-08-19T23:15:12.844Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10399ms). Cost: $0.
-[2026-08-19T23:30:12.315Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-08-19T23:45:12.077Z] liveness: tier1 expired=30, tier2 checked=40 removed=0 (9927ms). Cost: $0.
-[2026-08-20T00:00:12.684Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10181ms). Cost: $0.
-[2026-08-20T00:15:12.723Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10231ms). Cost: $0.
-[2026-08-20T00:30:12.001Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10258ms). Cost: $0.
-[2026-08-20T00:45:12.719Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10259ms). Cost: $0.
-[2026-08-20T01:00:13.610Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10358ms). Cost: $0.
-[2026-08-20T01:15:12.508Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-08-20T01:30:13.322Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10262ms). Cost: $0.
-[2026-08-20T01:45:12.343Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9998ms). Cost: $0.
-[2026-08-20T02:00:13.759Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10331ms). Cost: $0.
-[2026-08-20T02:15:12.345Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-08-20T02:30:13.047Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-08-20T02:45:12.167Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9877ms). Cost: $0.
-[2026-08-20T03:00:13.719Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10593ms). Cost: $0.
-[2026-08-20T03:15:13.161Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10055ms). Cost: $0.
-[2026-08-20T03:30:12.597Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9970ms). Cost: $0.
-[2026-08-20T03:45:12.587Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-08-20T04:00:13.215Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10036ms). Cost: $0.
-[2026-08-20T04:15:12.196Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10188ms). Cost: $0.
-[2026-08-20T04:30:12.388Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-08-20T04:45:13.273Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9975ms). Cost: $0.
-[2026-08-20T05:00:13.053Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10205ms). Cost: $0.
-[2026-08-20T05:15:12.575Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10260ms). Cost: $0.
-[2026-08-20T05:30:12.326Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-08-20T05:45:12.799Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-08-20T06:00:12.658Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9971ms). Cost: $0.
-[2026-08-20T06:15:12.131Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10433ms). Cost: $0.
-[2026-08-20T06:30:12.573Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10167ms). Cost: $0.
-[2026-08-20T06:45:12.247Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-08-20T07:00:12.829Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10119ms). Cost: $0.
-[2026-08-20T07:15:11.915Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-08-20T07:30:12.943Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-08-20T07:45:12.383Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-08-20T08:00:13.157Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10141ms). Cost: $0.
-[2026-08-20T08:15:11.689Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-08-20T08:30:12.284Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10010ms). Cost: $0.
-[2026-08-20T08:45:12.962Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-08-20T09:00:12.030Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10147ms). Cost: $0.
-[2026-08-20T09:15:12.729Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10120ms). Cost: $0.
-[2026-08-20T09:30:12.189Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10261ms). Cost: $0.
-[2026-08-20T09:45:12.555Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10048ms). Cost: $0.
-[2026-08-20T10:00:12.822Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10270ms). Cost: $0.
-[2026-08-20T10:15:12.168Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10113ms). Cost: $0.
-[2026-08-20T10:30:13.486Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10325ms). Cost: $0.
-[2026-08-20T10:45:12.127Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-08-20T11:00:12.999Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10323ms). Cost: $0.
-[2026-08-20T11:15:12.104Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10160ms). Cost: $0.
-[2026-08-20T11:30:13.056Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-08-20T11:45:12.281Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-08-20T12:00:12.828Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-08-20T12:15:12.429Z] liveness: tier1 expired=132, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-08-20T12:30:12.482Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10267ms). Cost: $0.
-[2026-08-20T12:45:12.758Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-08-20T13:00:12.585Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10297ms). Cost: $0.
-[2026-08-20T13:15:12.930Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10163ms). Cost: $0.
-[2026-08-20T13:30:12.879Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10120ms). Cost: $0.
-[2026-08-20T13:45:13.288Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10605ms). Cost: $0.
-[2026-08-20T14:00:12.992Z] liveness: tier1 expired=29, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-08-20T14:15:12.918Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10162ms). Cost: $0.
-[2026-08-20T14:30:13.259Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-08-20T14:45:12.755Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-08-20T15:00:14.030Z] liveness: tier1 expired=30, tier2 checked=40 removed=0 (10231ms). Cost: $0.
-[2026-08-20T15:15:13.265Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-08-20T15:30:12.820Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10019ms). Cost: $0.
-[2026-08-20T15:45:12.795Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10238ms). Cost: $0.
-[2026-08-20T16:00:11.949Z] liveness: tier1 expired=20, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-08-20T16:15:12.785Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9955ms). Cost: $0.
-[2026-08-20T16:30:12.614Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10248ms). Cost: $0.
-[2026-08-20T16:45:11.847Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-20T17:00:13.387Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10341ms). Cost: $0.
-[2026-08-20T17:15:13.254Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10202ms). Cost: $0.
-[2026-08-20T17:30:12.673Z] liveness: tier1 expired=27, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-08-20T17:45:13.060Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-08-20T18:00:12.111Z] liveness: tier1 expired=21, tier2 checked=40 removed=0 (10180ms). Cost: $0.
-[2026-08-20T18:15:12.237Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9919ms). Cost: $0.
-[2026-08-20T18:30:12.350Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-08-20T18:45:12.491Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-08-20T19:00:13.106Z] liveness: tier1 expired=30, tier2 checked=40 removed=0 (10129ms). Cost: $0.
-[2026-08-20T19:15:12.876Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10040ms). Cost: $0.
-[2026-08-20T19:30:12.921Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10498ms). Cost: $0.
-[2026-08-20T19:45:12.773Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9887ms). Cost: $0.
-[2026-08-20T20:00:12.612Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10757ms). Cost: $0.
-[2026-08-20T20:15:12.103Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10120ms). Cost: $0.
-[2026-08-20T20:30:12.599Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10204ms). Cost: $0.
-[2026-08-20T20:45:11.847Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9942ms). Cost: $0.
-[2026-08-20T21:00:13.447Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10628ms). Cost: $0.
-[2026-08-20T21:15:12.439Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-08-20T21:30:12.693Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10116ms). Cost: $0.
-[2026-08-20T21:45:12.637Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10030ms). Cost: $0.
-[2026-08-20T22:00:13.210Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9906ms). Cost: $0.
-[2026-08-20T22:15:12.578Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9852ms). Cost: $0.
-[2026-08-20T22:30:12.071Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9913ms). Cost: $0.
-[2026-08-20T22:45:12.185Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10018ms). Cost: $0.
-[2026-08-20T23:00:12.745Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-08-20T23:15:12.094Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9924ms). Cost: $0.
-[2026-08-20T23:30:12.599Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-08-20T23:45:12.632Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9843ms). Cost: $0.
-[2026-08-21T00:00:13.145Z] liveness: tier1 expired=60, tier2 checked=40 removed=0 (9986ms). Cost: $0.
-[2026-08-21T00:15:12.304Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10152ms). Cost: $0.
-[2026-08-21T00:30:13.457Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-08-21T00:45:13.291Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10262ms). Cost: $0.
-[2026-08-21T01:00:13.123Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-08-21T01:15:13.046Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-08-21T01:30:13.326Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10198ms). Cost: $0.
-[2026-08-21T01:45:12.301Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9886ms). Cost: $0.
-[2026-08-21T02:00:12.831Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-08-21T02:15:11.902Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9964ms). Cost: $0.
-[2026-08-21T02:30:12.817Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-08-21T02:45:12.290Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9939ms). Cost: $0.
-[2026-08-21T03:00:12.882Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10026ms). Cost: $0.
-[2026-08-21T03:15:13.328Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10163ms). Cost: $0.
-[2026-08-21T03:30:13.308Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10763ms). Cost: $0.
-[2026-08-21T03:45:11.849Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-08-21T04:00:13.028Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10191ms). Cost: $0.
-[2026-08-21T04:15:11.674Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-08-21T04:30:13.013Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9944ms). Cost: $0.
-[2026-08-21T04:45:12.149Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9874ms). Cost: $0.
-[2026-08-21T05:00:12.826Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-21T05:15:12.336Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10543ms). Cost: $0.
-[2026-08-21T05:30:11.961Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9939ms). Cost: $0.
-[2026-08-21T05:45:12.567Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10057ms). Cost: $0.
-[2026-08-21T06:00:12.561Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10310ms). Cost: $0.
-[2026-08-21T06:15:12.017Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10006ms). Cost: $0.
-[2026-08-21T06:30:13.131Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-08-21T06:45:12.607Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10006ms). Cost: $0.
-[2026-08-21T07:00:12.932Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-08-21T07:15:12.339Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10010ms). Cost: $0.
-[2026-08-21T07:30:12.631Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10286ms). Cost: $0.
-[2026-08-21T07:45:12.209Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10097ms). Cost: $0.
-[2026-08-21T08:00:12.874Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10182ms). Cost: $0.
-[2026-08-21T08:15:12.525Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-08-21T08:30:13.165Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10152ms). Cost: $0.
-[2026-08-21T08:45:12.238Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10107ms). Cost: $0.
-[2026-08-21T09:00:12.597Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10229ms). Cost: $0.
-[2026-08-21T09:15:12.544Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9971ms). Cost: $0.
-[2026-08-21T09:30:12.029Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10010ms). Cost: $0.
-[2026-08-21T09:45:11.790Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-08-21T10:00:12.889Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10149ms). Cost: $0.
-[2026-08-21T10:15:12.550Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9898ms). Cost: $0.
-[2026-08-21T10:30:12.808Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10042ms). Cost: $0.
-[2026-08-21T10:45:12.150Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9944ms). Cost: $0.
-[2026-08-21T11:00:12.685Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-21T11:15:12.250Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9928ms). Cost: $0.
-[2026-08-21T11:30:12.510Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9896ms). Cost: $0.
-[2026-08-21T11:45:11.991Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10022ms). Cost: $0.
-[2026-08-21T12:00:12.365Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10360ms). Cost: $0.
-[2026-08-21T12:15:12.150Z] liveness: tier1 expired=176, tier2 checked=40 removed=0 (9944ms). Cost: $0.
-[2026-08-21T12:30:13.292Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10209ms). Cost: $0.
-[2026-08-21T12:45:12.119Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10057ms). Cost: $0.
-[2026-08-21T13:00:12.088Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10103ms). Cost: $0.
-[2026-08-21T13:15:12.577Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-08-21T13:30:12.677Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10179ms). Cost: $0.
-[2026-08-21T13:45:12.116Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9955ms). Cost: $0.
-[2026-08-21T14:00:43.852Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (40430ms). Cost: $0.
-[2026-08-21T14:15:12.299Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-21T14:30:12.916Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-21T14:45:12.180Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9868ms). Cost: $0.
-[2026-08-21T15:00:13.938Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10649ms). Cost: $0.
-[2026-08-21T15:15:12.701Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-08-21T15:30:12.249Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-08-21T15:45:13.035Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-08-21T16:00:12.567Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10115ms). Cost: $0.
-[2026-08-21T16:15:12.943Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-21T16:30:12.790Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9981ms). Cost: $0.
-[2026-08-21T16:45:11.617Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9936ms). Cost: $0.
-[2026-08-21T17:00:13.183Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10522ms). Cost: $0.
-[2026-08-21T17:15:12.757Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10266ms). Cost: $0.
-[2026-08-21T17:30:12.734Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-08-21T17:45:12.830Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9973ms). Cost: $0.
-[2026-08-21T18:00:13.260Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10533ms). Cost: $0.
-[2026-08-21T18:15:12.489Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10253ms). Cost: $0.
-[2026-08-21T18:30:12.273Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10100ms). Cost: $0.
-[2026-08-21T18:45:12.426Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-08-21T19:00:12.776Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10272ms). Cost: $0.
-[2026-08-21T19:15:12.067Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-08-21T19:30:12.210Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9917ms). Cost: $0.
-[2026-08-21T19:45:11.837Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10059ms). Cost: $0.
-[2026-08-21T20:00:13.044Z] liveness: tier1 expired=44, tier2 checked=40 removed=0 (10284ms). Cost: $0.
-[2026-08-21T20:15:12.299Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9966ms). Cost: $0.
-[2026-08-21T20:30:12.208Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10006ms). Cost: $0.
-[2026-08-21T20:45:11.785Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-21T21:00:13.094Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10275ms). Cost: $0.
-[2026-08-21T21:15:12.458Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10022ms). Cost: $0.
-[2026-08-21T21:30:12.552Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-08-21T21:45:12.626Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-08-21T22:00:13.087Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10030ms). Cost: $0.
-[2026-08-21T22:15:12.866Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-08-21T22:30:13.127Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-08-21T22:45:13.111Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9950ms). Cost: $0.
-[2026-08-21T23:00:12.628Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9971ms). Cost: $0.
-[2026-08-21T23:15:12.224Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10284ms). Cost: $0.
-[2026-08-21T23:30:12.821Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9927ms). Cost: $0.
-[2026-08-21T23:45:12.321Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9901ms). Cost: $0.
-[2026-08-22T00:00:12.404Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-08-22T00:15:12.629Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10265ms). Cost: $0.
-[2026-08-22T00:30:12.519Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10132ms). Cost: $0.
-[2026-08-22T00:45:12.479Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9917ms). Cost: $0.
-[2026-08-22T01:00:12.534Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10032ms). Cost: $0.
-[2026-08-22T01:15:13.252Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10002ms). Cost: $0.
-[2026-08-22T01:30:13.252Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9898ms). Cost: $0.
-[2026-08-22T01:45:12.374Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9877ms). Cost: $0.
-[2026-08-22T02:00:13.929Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10945ms). Cost: $0.
-[2026-08-22T02:15:12.463Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-08-22T02:30:12.702Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9918ms). Cost: $0.
-[2026-08-22T02:45:12.506Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10167ms). Cost: $0.
-[2026-08-22T03:00:13.140Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10108ms). Cost: $0.
-[2026-08-22T03:15:12.751Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-08-22T03:30:13.008Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-08-22T03:45:12.276Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10029ms). Cost: $0.
-[2026-08-22T04:00:12.238Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10204ms). Cost: $0.
-[2026-08-22T04:15:12.639Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-08-22T04:30:11.782Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-08-22T04:45:11.987Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-08-22T05:00:12.657Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10187ms). Cost: $0.
-[2026-08-22T05:15:12.589Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-22T05:30:12.144Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10077ms). Cost: $0.
-[2026-08-22T05:45:12.066Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10175ms). Cost: $0.
-[2026-08-22T06:00:13.111Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10328ms). Cost: $0.
-[2026-08-22T06:15:12.383Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-08-22T06:30:12.210Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9954ms). Cost: $0.
-[2026-08-22T06:45:12.316Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9954ms). Cost: $0.
-[2026-08-22T07:00:12.925Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9971ms). Cost: $0.
-[2026-08-22T07:15:12.729Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-08-22T07:30:13.519Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9998ms). Cost: $0.
-[2026-08-22T07:45:12.274Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-08-22T08:00:13.192Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10196ms). Cost: $0.
-[2026-08-22T08:15:12.348Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-08-22T08:30:12.842Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-08-22T08:45:12.746Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-08-22T09:00:12.882Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10148ms). Cost: $0.
-[2026-08-22T09:15:12.440Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9937ms). Cost: $0.
-[2026-08-22T09:30:12.220Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-08-22T09:45:12.592Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10053ms). Cost: $0.
-[2026-08-22T10:00:12.568Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-08-22T10:15:11.679Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-08-22T10:30:13.406Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10234ms). Cost: $0.
-[2026-08-22T10:45:12.534Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-08-22T11:00:13.569Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10193ms). Cost: $0.
-[2026-08-22T11:15:12.429Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10213ms). Cost: $0.
-[2026-08-22T11:30:12.772Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9927ms). Cost: $0.
-[2026-08-22T11:45:12.179Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-08-22T12:00:12.763Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10139ms). Cost: $0.
-[2026-08-22T12:15:12.371Z] liveness: tier1 expired=100, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-08-22T12:30:13.284Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10364ms). Cost: $0.
-[2026-08-22T12:45:12.268Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10019ms). Cost: $0.
-[2026-08-22T13:00:12.685Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10298ms). Cost: $0.
-[2026-08-22T13:15:12.080Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10053ms). Cost: $0.
-[2026-08-22T13:30:12.161Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-08-22T13:45:12.293Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10235ms). Cost: $0.
-[2026-08-22T14:00:12.863Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10254ms). Cost: $0.
-[2026-08-22T14:15:13.315Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-08-22T14:30:12.881Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-08-22T14:45:12.426Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10123ms). Cost: $0.
-[2026-08-22T15:00:13.436Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10508ms). Cost: $0.
-[2026-08-22T15:15:13.082Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10501ms). Cost: $0.
-[2026-08-22T15:30:12.551Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9712ms). Cost: $0.
-[2026-08-22T15:45:12.820Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10142ms). Cost: $0.
-[2026-08-22T16:00:13.233Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10019ms). Cost: $0.
-[2026-08-22T16:15:11.955Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10144ms). Cost: $0.
-[2026-08-22T16:30:12.439Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9984ms). Cost: $0.
-[2026-08-22T16:45:11.901Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-08-22T17:00:12.424Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9971ms). Cost: $0.
-[2026-08-22T17:15:13.075Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-08-22T17:30:12.354Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9966ms). Cost: $0.
-[2026-08-22T17:45:13.125Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9923ms). Cost: $0.
-[2026-08-22T18:00:11.822Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-22T18:15:12.685Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9960ms). Cost: $0.
-[2026-08-22T18:30:12.020Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9953ms). Cost: $0.
-[2026-08-22T18:45:12.596Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9994ms). Cost: $0.
-[2026-08-22T19:00:13.158Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-08-22T19:15:12.201Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-08-22T19:30:12.476Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9958ms). Cost: $0.
-[2026-08-22T19:45:12.797Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-08-22T20:00:12.256Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10247ms). Cost: $0.
-[2026-08-22T20:15:12.535Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-08-22T20:30:12.343Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10088ms). Cost: $0.
-[2026-08-22T20:45:12.524Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-08-22T21:00:12.611Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-08-22T21:15:13.024Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10165ms). Cost: $0.
-[2026-08-22T21:30:12.672Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-08-22T21:45:11.789Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-08-22T22:00:13.439Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10136ms). Cost: $0.
-[2026-08-22T22:15:12.967Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-08-22T22:30:12.628Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10017ms). Cost: $0.
-[2026-08-22T22:45:12.822Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10154ms). Cost: $0.
-[2026-08-22T23:00:13.452Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10137ms). Cost: $0.
-[2026-08-22T23:15:12.781Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-08-22T23:30:12.416Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-08-22T23:45:11.927Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-23T00:00:12.413Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10201ms). Cost: $0.
-[2026-08-23T00:15:11.993Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9802ms). Cost: $0.
-[2026-08-23T00:30:12.276Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-08-23T00:45:11.837Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9901ms). Cost: $0.
-[2026-08-23T01:00:12.916Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-08-23T01:15:12.595Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-08-23T01:30:12.748Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9875ms). Cost: $0.
-[2026-08-23T01:45:12.368Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9876ms). Cost: $0.
-[2026-08-23T02:00:13.471Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10202ms). Cost: $0.
-[2026-08-23T02:15:12.529Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-08-23T02:30:12.813Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10197ms). Cost: $0.
-[2026-08-23T02:45:11.610Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9936ms). Cost: $0.
-[2026-08-23T03:00:12.914Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10059ms). Cost: $0.
-[2026-08-23T03:15:12.434Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10008ms). Cost: $0.
-[2026-08-23T03:30:13.127Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-08-23T03:45:12.453Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9926ms). Cost: $0.
-[2026-08-23T04:00:12.529Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10048ms). Cost: $0.
-[2026-08-23T04:15:12.236Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9901ms). Cost: $0.
-[2026-08-23T04:30:12.451Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9971ms). Cost: $0.
-[2026-08-23T04:45:12.076Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10025ms). Cost: $0.
-[2026-08-23T05:00:13.260Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10410ms). Cost: $0.
-[2026-08-23T05:15:11.630Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9916ms). Cost: $0.
-[2026-08-23T05:30:12.555Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10115ms). Cost: $0.
-[2026-08-23T05:45:12.258Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-23T06:00:11.909Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-08-23T06:15:12.797Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10107ms). Cost: $0.
-[2026-08-23T06:30:11.923Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9944ms). Cost: $0.
-[2026-08-23T06:45:12.528Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-08-23T07:00:13.178Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10158ms). Cost: $0.
-[2026-08-23T07:15:12.571Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10261ms). Cost: $0.
-[2026-08-23T07:30:12.801Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9942ms). Cost: $0.
-[2026-08-23T07:45:12.663Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-23T08:00:13.713Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10381ms). Cost: $0.
-[2026-08-23T08:15:12.838Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10206ms). Cost: $0.
-[2026-08-23T08:30:12.963Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-08-23T08:45:12.564Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-08-23T09:00:12.877Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-08-23T09:15:12.115Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-08-23T09:30:12.244Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9936ms). Cost: $0.
-[2026-08-23T09:45:12.494Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9919ms). Cost: $0.
-[2026-08-23T10:00:13.367Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10147ms). Cost: $0.
-[2026-08-23T10:15:12.274Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-08-23T10:30:11.775Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10111ms). Cost: $0.
-[2026-08-23T10:45:12.491Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9955ms). Cost: $0.
-[2026-08-23T11:00:12.971Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10010ms). Cost: $0.
-[2026-08-23T11:15:12.580Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-08-23T11:30:12.049Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9935ms). Cost: $0.
-[2026-08-23T11:45:12.168Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-08-23T12:00:12.742Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10401ms). Cost: $0.
-[2026-08-23T12:15:11.721Z] liveness: tier1 expired=103, tier2 checked=40 removed=0 (10115ms). Cost: $0.
-[2026-08-23T12:30:12.536Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-08-23T12:45:12.128Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9921ms). Cost: $0.
-[2026-08-23T13:00:12.456Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-08-23T13:15:12.883Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10438ms). Cost: $0.
-[2026-08-23T13:30:12.485Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9966ms). Cost: $0.
-[2026-08-23T13:45:11.736Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9926ms). Cost: $0.
-[2026-08-23T14:00:12.336Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10266ms). Cost: $0.
-[2026-08-23T14:15:12.750Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10174ms). Cost: $0.
-[2026-08-23T14:30:12.334Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10008ms). Cost: $0.
-[2026-08-23T14:45:12.182Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9916ms). Cost: $0.
-[2026-08-23T15:00:12.460Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-08-23T15:15:13.536Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10195ms). Cost: $0.
-[2026-08-23T15:30:12.859Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-08-23T15:45:13.056Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10096ms). Cost: $0.
-[2026-08-23T16:00:12.200Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-08-23T16:15:12.629Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-08-23T16:30:12.452Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9687ms). Cost: $0.
-[2026-08-23T16:45:12.247Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-23T17:00:12.867Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10452ms). Cost: $0.
-[2026-08-23T17:15:13.246Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10235ms). Cost: $0.
-[2026-08-23T17:30:11.988Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9975ms). Cost: $0.
-[2026-08-23T17:45:12.278Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9908ms). Cost: $0.
-[2026-08-23T18:00:12.147Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10012ms). Cost: $0.
-[2026-08-23T18:15:12.261Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-08-23T18:30:12.173Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10033ms). Cost: $0.
-[2026-08-23T18:45:12.899Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-23T19:00:13.283Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9994ms). Cost: $0.
-[2026-08-23T19:15:13.029Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10017ms). Cost: $0.
-[2026-08-23T19:30:12.649Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-08-23T19:45:12.054Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9938ms). Cost: $0.
-[2026-08-23T20:00:12.064Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-08-23T20:15:12.713Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-08-23T20:30:12.235Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10064ms). Cost: $0.
-[2026-08-23T20:45:12.556Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-08-23T21:00:13.091Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10306ms). Cost: $0.
-[2026-08-23T21:15:12.534Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-08-23T21:30:12.317Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-08-23T21:45:12.086Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-08-23T22:00:12.459Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-08-23T22:15:12.488Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9926ms). Cost: $0.
-[2026-08-23T22:30:12.258Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9913ms). Cost: $0.
-[2026-08-23T22:45:13.175Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10524ms). Cost: $0.
-[2026-08-23T23:00:12.828Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9955ms). Cost: $0.
-[2026-08-23T23:15:11.865Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-08-23T23:30:13.246Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10185ms). Cost: $0.
-[2026-08-23T23:45:12.038Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10180ms). Cost: $0.
-[2026-08-24T00:00:13.136Z] liveness: tier1 expired=63, tier2 checked=40 removed=0 (10213ms). Cost: $0.
-[2026-08-24T00:15:11.821Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-08-24T00:30:12.536Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9938ms). Cost: $0.
-[2026-08-24T00:45:12.247Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9918ms). Cost: $0.
-[2026-08-24T01:00:12.908Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-08-24T01:15:13.114Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-08-24T01:30:12.727Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-08-24T01:45:12.380Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9921ms). Cost: $0.
-[2026-08-24T02:00:13.833Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10915ms). Cost: $0.
-[2026-08-24T02:15:12.439Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10083ms). Cost: $0.
-[2026-08-24T02:30:12.318Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9977ms). Cost: $0.
-[2026-08-24T02:45:12.701Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9994ms). Cost: $0.
-[2026-08-24T03:00:13.159Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-08-24T03:15:12.524Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-24T03:30:12.764Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-08-24T03:45:12.443Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-08-24T04:00:13.535Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10238ms). Cost: $0.
-[2026-08-24T04:15:12.106Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9963ms). Cost: $0.
-[2026-08-24T04:30:13.255Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10018ms). Cost: $0.
-[2026-08-24T04:45:12.433Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-08-24T05:00:13.138Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-08-24T05:15:13.564Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10676ms). Cost: $0.
-[2026-08-24T05:30:11.931Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10079ms). Cost: $0.
-[2026-08-24T05:45:12.697Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-24T06:00:13.382Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-08-24T06:15:12.763Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10189ms). Cost: $0.
-[2026-08-24T06:30:12.721Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-08-24T06:45:11.820Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-08-24T07:00:13.564Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10077ms). Cost: $0.
-[2026-08-24T07:15:12.863Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10253ms). Cost: $0.
-[2026-08-24T07:30:12.829Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10152ms). Cost: $0.
-[2026-08-24T07:45:11.758Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-08-24T08:00:12.999Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10275ms). Cost: $0.
-[2026-08-24T08:15:11.711Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-08-24T08:30:13.570Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-08-24T08:45:13.549Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10181ms). Cost: $0.
-[2026-08-24T09:00:13.383Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10483ms). Cost: $0.
-[2026-08-24T09:15:12.026Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10180ms). Cost: $0.
-[2026-08-24T09:30:12.021Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-08-24T09:45:12.407Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10430ms). Cost: $0.
-[2026-08-24T10:00:12.828Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10332ms). Cost: $0.
-[2026-08-24T10:15:12.172Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-08-24T10:30:13.153Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-08-24T10:45:12.129Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9959ms). Cost: $0.
-[2026-08-24T11:00:12.803Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9978ms). Cost: $0.
-[2026-08-24T11:15:12.215Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10136ms). Cost: $0.
-[2026-08-24T11:30:12.247Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-08-24T11:45:11.931Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-08-24T12:00:13.062Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10142ms). Cost: $0.
-[2026-08-24T12:15:13.298Z] liveness: tier1 expired=180, tier2 checked=40 removed=0 (10676ms). Cost: $0.
-[2026-08-24T12:30:13.115Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10533ms). Cost: $0.
-[2026-08-24T12:45:12.936Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9932ms). Cost: $0.
-[2026-08-24T13:00:12.823Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10080ms). Cost: $0.
-[2026-08-24T13:15:12.684Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9976ms). Cost: $0.
-[2026-08-24T13:30:12.154Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10242ms). Cost: $0.
-[2026-08-24T13:45:12.374Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10042ms). Cost: $0.
-[2026-08-24T14:00:12.910Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10077ms). Cost: $0.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-24T14:15:02.476Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-24T14:30:01.698Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-24T14:45:02.275Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-24T15:00:02.166Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-24T15:15:02.399Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-24T15:30:01.948Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-24T15:45:02.321Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-24T16:00:02.042Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-prisma:error
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[liveness-sweep] 2026-08-24T16:15:02.240Z ERROR:
-Invalid `prisma.listing.updateMany()` invocation:
-
-
-Can't reach database server at `127.0.0.1:5432`
-
-Please make sure your database server is running at `127.0.0.1:5432`.
-[2026-08-24T16:30:12.647Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10117ms). Cost: $0.
-[2026-08-24T16:45:12.947Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-24T17:00:12.237Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10292ms). Cost: $0.
-[2026-08-24T17:15:13.046Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-08-24T17:30:11.990Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-08-24T17:45:12.414Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-08-24T18:00:12.326Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-08-24T18:15:12.769Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-08-24T18:30:12.327Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-08-24T18:45:12.414Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-24T19:00:12.961Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10103ms). Cost: $0.
-[2026-08-24T19:15:12.871Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9973ms). Cost: $0.
-[2026-08-24T19:30:12.069Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10253ms). Cost: $0.
-[2026-08-24T19:45:12.272Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9908ms). Cost: $0.
-[2026-08-24T20:00:12.544Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10378ms). Cost: $0.
-[2026-08-24T20:15:12.657Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-08-24T20:30:11.693Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9961ms). Cost: $0.
-[2026-08-24T20:45:12.746Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-08-24T21:00:12.779Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10233ms). Cost: $0.
-[2026-08-24T21:15:12.394Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-08-24T21:30:12.492Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-08-24T21:45:12.536Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9923ms). Cost: $0.
-[2026-08-24T22:00:12.775Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10006ms). Cost: $0.
-[2026-08-24T22:15:12.311Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9933ms). Cost: $0.
-[2026-08-24T22:30:12.333Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-24T22:45:12.548Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9987ms). Cost: $0.
-[2026-08-24T23:00:12.878Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10178ms). Cost: $0.
-[2026-08-24T23:15:12.280Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-08-24T23:30:11.879Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9964ms). Cost: $0.
-[2026-08-24T23:45:11.923Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9923ms). Cost: $0.
-[2026-08-25T00:00:12.001Z] liveness: tier1 expired=87, tier2 checked=40 removed=0 (10234ms). Cost: $0.
-[2026-08-25T00:15:12.212Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9943ms). Cost: $0.
-[2026-08-25T00:30:11.946Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10014ms). Cost: $0.
-[2026-08-25T00:45:12.415Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9919ms). Cost: $0.
-[2026-08-25T01:00:12.508Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-08-25T01:15:12.474Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-08-25T01:30:12.938Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-08-25T01:45:11.515Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9893ms). Cost: $0.
-[2026-08-25T02:00:12.685Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10420ms). Cost: $0.
-[2026-08-25T02:15:12.359Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9874ms). Cost: $0.
-[2026-08-25T02:30:12.397Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9966ms). Cost: $0.
-[2026-08-25T02:45:12.645Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-08-25T03:00:13.337Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10224ms). Cost: $0.
-[2026-08-25T03:15:12.217Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10174ms). Cost: $0.
-[2026-08-25T03:30:12.120Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10254ms). Cost: $0.
-[2026-08-25T03:45:12.454Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9919ms). Cost: $0.
-[2026-08-25T04:00:13.147Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10269ms). Cost: $0.
-[2026-08-25T04:15:12.495Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9924ms). Cost: $0.
-[2026-08-25T04:30:12.626Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9959ms). Cost: $0.
-[2026-08-25T04:45:13.322Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-08-25T05:00:12.415Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10192ms). Cost: $0.
-[2026-08-25T05:15:12.218Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10189ms). Cost: $0.
-[2026-08-25T05:30:12.018Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9961ms). Cost: $0.
-[2026-08-25T05:45:11.957Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10176ms). Cost: $0.
-[2026-08-25T06:00:12.562Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-08-25T06:15:11.864Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10009ms). Cost: $0.
-[2026-08-25T06:30:12.151Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-08-25T06:45:12.421Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-08-25T07:00:11.816Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-08-25T07:15:12.348Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10131ms). Cost: $0.
-[2026-08-25T07:30:12.223Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10086ms). Cost: $0.
-[2026-08-25T07:45:12.232Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10088ms). Cost: $0.
-[2026-08-25T08:00:11.856Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10088ms). Cost: $0.
-[2026-08-25T08:15:12.702Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10162ms). Cost: $0.
-[2026-08-25T08:30:12.088Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9926ms). Cost: $0.
-[2026-08-25T08:45:12.583Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10218ms). Cost: $0.
-[2026-08-25T09:00:12.626Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10298ms). Cost: $0.
-[2026-08-25T09:15:12.459Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-08-25T09:30:12.848Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10245ms). Cost: $0.
-[2026-08-25T09:45:11.581Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9889ms). Cost: $0.
-[2026-08-25T10:00:12.341Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9987ms). Cost: $0.
-[2026-08-25T10:15:11.937Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10150ms). Cost: $0.
-[2026-08-25T10:30:13.078Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9913ms). Cost: $0.
-[2026-08-25T10:45:12.277Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9986ms). Cost: $0.
-[2026-08-25T11:00:11.786Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10125ms). Cost: $0.
-[2026-08-25T11:15:12.496Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-08-25T11:30:13.116Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10365ms). Cost: $0.
-[2026-08-25T11:45:12.593Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-08-25T12:00:12.213Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-08-25T12:15:12.341Z] liveness: tier1 expired=219, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-25T12:30:13.218Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10438ms). Cost: $0.
-[2026-08-25T12:45:12.392Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-25T13:00:12.418Z] liveness: tier1 expired=20, tier2 checked=40 removed=0 (10225ms). Cost: $0.
-[2026-08-25T13:15:12.694Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9994ms). Cost: $0.
-[2026-08-25T13:30:12.041Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10276ms). Cost: $0.
-[2026-08-25T13:45:12.496Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-25T14:00:12.739Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10018ms). Cost: $0.
-[2026-08-25T14:15:11.758Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-08-25T14:30:12.908Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9991ms). Cost: $0.
-[2026-08-25T14:45:12.799Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9768ms). Cost: $0.
-[2026-08-25T15:00:12.610Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (9961ms). Cost: $0.
-[2026-08-25T15:15:12.381Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10048ms). Cost: $0.
-[2026-08-25T15:30:11.904Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-08-25T15:45:12.196Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9943ms). Cost: $0.
-[2026-08-25T16:00:12.410Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10110ms). Cost: $0.
-[2026-08-25T16:15:11.923Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9955ms). Cost: $0.
-[2026-08-25T16:30:12.197Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-08-25T16:45:12.449Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-08-25T17:00:12.631Z] liveness: tier1 expired=22, tier2 checked=40 removed=0 (10113ms). Cost: $0.
-[2026-08-25T17:15:11.792Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9991ms). Cost: $0.
-[2026-08-25T17:30:12.637Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10261ms). Cost: $0.
-[2026-08-25T17:45:12.428Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-08-25T18:00:12.286Z] liveness: tier1 expired=54, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-08-25T18:15:11.864Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-25T18:30:12.073Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10134ms). Cost: $0.
-[2026-08-25T18:45:12.475Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9945ms). Cost: $0.
-[2026-08-25T19:00:12.301Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9936ms). Cost: $0.
-[2026-08-25T19:15:13.138Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9926ms). Cost: $0.
-[2026-08-25T19:30:12.370Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9991ms). Cost: $0.
-[2026-08-25T19:45:12.676Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10166ms). Cost: $0.
-[2026-08-25T20:00:13.001Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10552ms). Cost: $0.
-[2026-08-25T20:15:12.125Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10014ms). Cost: $0.
-[2026-08-25T20:30:12.283Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10124ms). Cost: $0.
-[2026-08-25T20:45:12.554Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10041ms). Cost: $0.
-[2026-08-25T21:00:13.022Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10228ms). Cost: $0.
-[2026-08-25T21:15:11.963Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9948ms). Cost: $0.
-[2026-08-25T21:30:11.819Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10057ms). Cost: $0.
-[2026-08-25T21:45:11.626Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9928ms). Cost: $0.
-[2026-08-25T22:00:13.176Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-08-25T22:15:12.824Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9899ms). Cost: $0.
-[2026-08-25T22:30:12.790Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9970ms). Cost: $0.
-[2026-08-25T22:45:12.817Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-08-25T23:00:12.522Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10113ms). Cost: $0.
-[2026-08-25T23:15:12.526Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10167ms). Cost: $0.
-[2026-08-25T23:30:12.942Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10220ms). Cost: $0.
-[2026-08-25T23:45:12.223Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9930ms). Cost: $0.
-[2026-08-26T00:00:12.965Z] liveness: tier1 expired=102, tier2 checked=40 removed=0 (10285ms). Cost: $0.
-[2026-08-26T00:15:12.512Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-08-26T00:30:11.644Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9889ms). Cost: $0.
-[2026-08-26T00:45:12.054Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9793ms). Cost: $0.
-[2026-08-26T01:00:12.160Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10141ms). Cost: $0.
-[2026-08-26T01:15:12.535Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-08-26T01:30:12.460Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9918ms). Cost: $0.
-[2026-08-26T01:45:11.773Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-08-26T02:00:14.161Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10845ms). Cost: $0.
-[2026-08-26T02:15:11.841Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9829ms). Cost: $0.
-[2026-08-26T02:30:12.756Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-08-26T02:45:12.622Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9884ms). Cost: $0.
-[2026-08-26T03:00:13.097Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10398ms). Cost: $0.
-[2026-08-26T03:15:12.593Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10632ms). Cost: $0.
-[2026-08-26T03:30:13.249Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-08-26T03:45:12.098Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9938ms). Cost: $0.
-[2026-08-26T04:00:12.551Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-08-26T04:15:12.813Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10177ms). Cost: $0.
-[2026-08-26T04:30:12.551Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-08-26T04:45:12.203Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9996ms). Cost: $0.
-[2026-08-26T05:00:12.598Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10387ms). Cost: $0.
-[2026-08-26T05:15:12.378Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10116ms). Cost: $0.
-[2026-08-26T05:30:12.056Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-08-26T05:45:11.680Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-08-26T06:00:12.767Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10203ms). Cost: $0.
-[2026-08-26T06:15:11.987Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10025ms). Cost: $0.
-[2026-08-26T06:30:12.317Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10010ms). Cost: $0.
-[2026-08-26T06:45:12.375Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10066ms). Cost: $0.
-[2026-08-26T07:00:12.415Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-08-26T07:15:12.778Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10456ms). Cost: $0.
-[2026-08-26T07:30:13.008Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10136ms). Cost: $0.
-[2026-08-26T07:45:12.291Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10228ms). Cost: $0.
-[2026-08-26T08:00:12.164Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10109ms). Cost: $0.
-[2026-08-26T08:15:11.804Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9984ms). Cost: $0.
-[2026-08-26T08:30:12.445Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-08-26T08:45:12.182Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10133ms). Cost: $0.
-[2026-08-26T09:00:12.595Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10541ms). Cost: $0.
-[2026-08-26T09:15:12.692Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-08-26T09:30:12.790Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10308ms). Cost: $0.
-[2026-08-26T09:45:12.031Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9976ms). Cost: $0.
-[2026-08-26T10:00:12.857Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-08-26T10:15:12.015Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-26T10:30:13.595Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10090ms). Cost: $0.
-[2026-08-26T10:45:11.876Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-08-26T11:00:13.618Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10413ms). Cost: $0.
-[2026-08-26T11:15:12.795Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10241ms). Cost: $0.
-[2026-08-26T11:30:12.588Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10269ms). Cost: $0.
-[2026-08-26T11:45:12.939Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10295ms). Cost: $0.
-[2026-08-26T12:00:13.018Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10236ms). Cost: $0.
-[2026-08-26T12:15:12.582Z] liveness: tier1 expired=281, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-08-26T12:30:12.283Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10028ms). Cost: $0.
-[2026-08-26T12:45:12.423Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10170ms). Cost: $0.
-[2026-08-26T13:00:12.657Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10243ms). Cost: $0.
-[2026-08-26T13:15:12.059Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-08-26T13:30:12.526Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10555ms). Cost: $0.
-[2026-08-26T13:45:12.587Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10169ms). Cost: $0.
-[2026-08-26T14:00:12.729Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10372ms). Cost: $0.
-[2026-08-26T14:15:11.976Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-26T14:30:13.038Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9958ms). Cost: $0.
-[2026-08-26T14:45:12.476Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-08-26T15:00:13.419Z] liveness: tier1 expired=29, tier2 checked=40 removed=0 (10320ms). Cost: $0.
-[2026-08-26T15:15:12.818Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10006ms). Cost: $0.
-[2026-08-26T15:30:11.687Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-08-26T15:45:12.342Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-08-26T16:00:12.523Z] liveness: tier1 expired=23, tier2 checked=40 removed=0 (10229ms). Cost: $0.
-[2026-08-26T16:15:13.292Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10382ms). Cost: $0.
-[2026-08-26T16:30:12.659Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-08-26T16:45:12.374Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9942ms). Cost: $0.
-[2026-08-26T17:00:12.881Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10352ms). Cost: $0.
-[2026-08-26T17:15:12.785Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-08-26T17:30:11.706Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10018ms). Cost: $0.
-[2026-08-26T17:45:12.154Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-08-26T18:00:12.017Z] liveness: tier1 expired=27, tier2 checked=40 removed=0 (10106ms). Cost: $0.
-[2026-08-26T18:15:12.595Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9887ms). Cost: $0.
-[2026-08-26T18:30:11.826Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-08-26T18:45:12.542Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9966ms). Cost: $0.
-[2026-08-26T19:00:12.707Z] liveness: tier1 expired=21, tier2 checked=40 removed=0 (10093ms). Cost: $0.
-[2026-08-26T19:15:12.855Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-08-26T19:30:12.199Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10216ms). Cost: $0.
-[2026-08-26T19:45:12.076Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9704ms). Cost: $0.
-[2026-08-26T20:00:12.772Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10419ms). Cost: $0.
-[2026-08-26T20:15:12.091Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9751ms). Cost: $0.
-[2026-08-26T20:30:12.164Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-08-26T20:45:12.451Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9713ms). Cost: $0.
-[2026-08-26T21:00:13.766Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10749ms). Cost: $0.
-[2026-08-26T21:15:12.623Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-08-26T21:30:12.975Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10187ms). Cost: $0.
-[2026-08-26T21:45:11.794Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9986ms). Cost: $0.
-[2026-08-26T22:00:12.504Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10056ms). Cost: $0.
-[2026-08-26T22:15:12.375Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9884ms). Cost: $0.
-[2026-08-26T22:30:12.977Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-08-26T22:45:12.394Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-08-26T23:00:12.569Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-08-26T23:15:13.084Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9937ms). Cost: $0.
-[2026-08-26T23:30:12.099Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-08-26T23:45:11.615Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-08-27T00:00:12.829Z] liveness: tier1 expired=35, tier2 checked=40 removed=0 (10291ms). Cost: $0.
-[2026-08-27T00:15:12.584Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10447ms). Cost: $0.
-[2026-08-27T00:30:12.419Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-08-27T00:45:12.551Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9955ms). Cost: $0.
-[2026-08-27T01:00:13.004Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-08-27T01:15:12.823Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-08-27T01:30:12.261Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9919ms). Cost: $0.
-[2026-08-27T01:45:12.202Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9930ms). Cost: $0.
-[2026-08-27T02:00:13.423Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10621ms). Cost: $0.
-[2026-08-27T02:15:11.996Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9950ms). Cost: $0.
-[2026-08-27T02:30:12.353Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-08-27T02:45:12.429Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10437ms). Cost: $0.
-[2026-08-27T03:00:13.308Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10174ms). Cost: $0.
-[2026-08-27T03:15:12.835Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10479ms). Cost: $0.
-[2026-08-27T03:30:12.734Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10284ms). Cost: $0.
-[2026-08-27T03:45:11.994Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-08-27T04:00:12.085Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9942ms). Cost: $0.
-[2026-08-27T04:15:11.922Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9863ms). Cost: $0.
-[2026-08-27T04:30:12.266Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10005ms). Cost: $0.
-[2026-08-27T04:45:12.365Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-08-27T05:00:12.850Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10336ms). Cost: $0.
-[2026-08-27T05:15:11.852Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-08-27T05:30:11.996Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10120ms). Cost: $0.
-[2026-08-27T05:45:12.568Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10057ms). Cost: $0.
-[2026-08-27T06:00:12.183Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9930ms). Cost: $0.
-[2026-08-27T06:15:12.817Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10064ms). Cost: $0.
-[2026-08-27T06:30:12.533Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10013ms). Cost: $0.
-[2026-08-27T06:45:11.937Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9973ms). Cost: $0.
-[2026-08-27T07:00:12.759Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10187ms). Cost: $0.
-[2026-08-27T07:15:12.986Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10287ms). Cost: $0.
-[2026-08-27T07:30:13.266Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9959ms). Cost: $0.
-[2026-08-27T07:45:12.233Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-08-27T08:00:11.822Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9904ms). Cost: $0.
-[2026-08-27T08:15:11.756Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-08-27T08:30:12.574Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-08-27T08:45:12.235Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10066ms). Cost: $0.
-[2026-08-27T09:00:12.266Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10189ms). Cost: $0.
-[2026-08-27T09:15:12.380Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-08-27T09:30:12.341Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-08-27T09:45:12.268Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9875ms). Cost: $0.
-[2026-08-27T10:00:11.891Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10115ms). Cost: $0.
-[2026-08-27T10:15:12.156Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-08-27T10:30:12.436Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-08-27T10:45:11.716Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-08-27T11:00:12.732Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9986ms). Cost: $0.
-[2026-08-27T11:15:12.110Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9790ms). Cost: $0.
-[2026-08-27T11:30:12.690Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10029ms). Cost: $0.
-[2026-08-27T11:45:12.624Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9955ms). Cost: $0.
-[2026-08-27T12:00:12.473Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (10149ms). Cost: $0.
-[2026-08-27T12:15:12.189Z] liveness: tier1 expired=99, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-08-27T12:30:13.008Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10407ms). Cost: $0.
-[2026-08-27T12:45:12.398Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10036ms). Cost: $0.
-[2026-08-27T13:00:12.244Z] liveness: tier1 expired=133, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-08-27T13:15:12.758Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-27T13:30:12.217Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10029ms). Cost: $0.
-[2026-08-27T13:45:12.486Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9895ms). Cost: $0.
-[2026-08-27T14:00:12.476Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10293ms). Cost: $0.
-[2026-08-27T14:15:12.114Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9910ms). Cost: $0.
-[2026-08-27T14:30:13.060Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-08-27T14:45:12.834Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-27T15:00:12.821Z] liveness: tier1 expired=122, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-08-27T15:15:12.279Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-08-27T15:30:12.385Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9965ms). Cost: $0.
-[2026-08-27T15:45:12.764Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-08-27T16:00:12.717Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (10144ms). Cost: $0.
-[2026-08-27T16:15:12.113Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-08-27T16:30:13.089Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10569ms). Cost: $0.
-[2026-08-27T16:45:12.004Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10153ms). Cost: $0.
-[2026-08-27T17:00:12.137Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10198ms). Cost: $0.
-[2026-08-27T17:15:12.868Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10242ms). Cost: $0.
-[2026-08-27T17:30:12.195Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10136ms). Cost: $0.
-[2026-08-27T17:45:13.013Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10162ms). Cost: $0.
-[2026-08-27T18:00:13.453Z] liveness: tier1 expired=43, tier2 checked=40 removed=0 (10362ms). Cost: $0.
-[2026-08-27T18:15:12.766Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10098ms). Cost: $0.
-[2026-08-27T18:30:12.024Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10053ms). Cost: $0.
-[2026-08-27T18:45:12.946Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-08-27T19:00:13.025Z] liveness: tier1 expired=20, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-08-27T19:15:13.023Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10177ms). Cost: $0.
-[2026-08-27T19:30:11.968Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-08-27T19:45:11.996Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-27T20:00:12.350Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10424ms). Cost: $0.
-[2026-08-27T20:15:11.844Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-08-27T20:30:12.254Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-08-27T20:45:12.413Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9836ms). Cost: $0.
-[2026-08-27T21:00:12.602Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10258ms). Cost: $0.
-[2026-08-27T21:15:12.711Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-08-27T21:30:13.173Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9981ms). Cost: $0.
-[2026-08-27T21:45:12.223Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-08-27T22:00:12.586Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-08-27T22:15:12.498Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9937ms). Cost: $0.
-[2026-08-27T22:30:13.377Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10422ms). Cost: $0.
-[2026-08-27T22:45:12.975Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10012ms). Cost: $0.
-[2026-08-27T23:00:12.978Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10261ms). Cost: $0.
-[2026-08-27T23:15:13.222Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10426ms). Cost: $0.
-[2026-08-27T23:30:12.551Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10312ms). Cost: $0.
-[2026-08-27T23:45:11.996Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9950ms). Cost: $0.
-[2026-08-28T00:00:12.127Z] liveness: tier1 expired=97, tier2 checked=40 removed=0 (10262ms). Cost: $0.
-[2026-08-28T00:15:12.136Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10490ms). Cost: $0.
-[2026-08-28T00:30:12.468Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10505ms). Cost: $0.
-[2026-08-28T00:45:12.229Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10173ms). Cost: $0.
-[2026-08-28T01:00:12.709Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10256ms). Cost: $0.
-[2026-08-28T01:15:13.081Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-08-28T01:30:12.986Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10100ms). Cost: $0.
-[2026-08-28T01:45:12.514Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10180ms). Cost: $0.
-[2026-08-28T02:00:13.363Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10398ms). Cost: $0.
-[2026-08-28T02:15:12.196Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9927ms). Cost: $0.
-[2026-08-28T02:30:12.170Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10058ms). Cost: $0.
-[2026-08-28T02:45:12.630Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9965ms). Cost: $0.
-[2026-08-28T03:00:13.261Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10209ms). Cost: $0.
-[2026-08-28T03:15:12.187Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10132ms). Cost: $0.
-[2026-08-28T03:30:12.577Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10542ms). Cost: $0.
-[2026-08-28T03:45:12.111Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10152ms). Cost: $0.
-[2026-08-28T04:00:12.317Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10477ms). Cost: $0.
-[2026-08-28T04:15:12.171Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-08-28T04:30:13.311Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-08-28T04:45:12.865Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10000ms). Cost: $0.
-[2026-08-28T05:00:13.569Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10423ms). Cost: $0.
-[2026-08-28T05:15:12.906Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10081ms). Cost: $0.
-[2026-08-28T05:30:12.150Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9954ms). Cost: $0.
-[2026-08-28T05:45:11.947Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10249ms). Cost: $0.
-[2026-08-28T06:00:13.017Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10389ms). Cost: $0.
-[2026-08-28T06:15:12.083Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10339ms). Cost: $0.
-[2026-08-28T06:30:11.867Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10078ms). Cost: $0.
-[2026-08-28T06:45:12.345Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-08-28T07:00:11.649Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9808ms). Cost: $0.
-[2026-08-28T07:15:12.924Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10188ms). Cost: $0.
-[2026-08-28T07:30:12.132Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10025ms). Cost: $0.
-[2026-08-28T07:45:12.062Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10292ms). Cost: $0.
-[2026-08-28T08:00:13.326Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10678ms). Cost: $0.
-[2026-08-28T08:15:12.066Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-08-28T08:30:12.585Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10100ms). Cost: $0.
-[2026-08-28T08:45:12.619Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-08-28T09:00:12.871Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-08-28T09:15:11.747Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10014ms). Cost: $0.
-[2026-08-28T09:30:12.178Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10140ms). Cost: $0.
-[2026-08-28T09:45:12.309Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-08-28T10:00:12.208Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (10274ms). Cost: $0.
-[2026-08-28T10:15:12.255Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10235ms). Cost: $0.
-[2026-08-28T10:30:13.405Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-08-28T10:45:12.139Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-08-28T11:00:12.806Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10239ms). Cost: $0.
-[2026-08-28T11:15:12.398Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-08-28T11:30:12.994Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10211ms). Cost: $0.
-[2026-08-28T11:45:11.926Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10057ms). Cost: $0.
-[2026-08-28T12:00:12.667Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-08-28T12:15:12.534Z] liveness: tier1 expired=136, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-08-28T12:30:12.209Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10345ms). Cost: $0.
-[2026-08-28T12:45:12.397Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10080ms). Cost: $0.
-[2026-08-28T13:00:12.798Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10431ms). Cost: $0.
-[2026-08-28T13:15:11.914Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-08-28T13:30:12.326Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10030ms). Cost: $0.
-[2026-08-28T13:45:12.386Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10173ms). Cost: $0.
-[2026-08-28T14:00:12.397Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10039ms). Cost: $0.
-[2026-08-28T14:15:13.327Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10125ms). Cost: $0.
-[2026-08-28T14:30:12.482Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10038ms). Cost: $0.
-[2026-08-28T14:45:13.060Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-08-28T15:00:12.260Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-08-28T15:15:12.895Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-08-28T15:30:12.442Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9961ms). Cost: $0.
-[2026-08-28T15:45:12.507Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-08-28T16:00:12.470Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9975ms). Cost: $0.
-[2026-08-28T16:15:12.145Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-08-28T16:30:12.193Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10245ms). Cost: $0.
-[2026-08-28T16:45:12.818Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10268ms). Cost: $0.
-[2026-08-28T17:00:12.951Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10401ms). Cost: $0.
-[2026-08-28T17:15:12.903Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10214ms). Cost: $0.
-[2026-08-28T17:30:12.752Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-08-28T17:45:12.839Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10583ms). Cost: $0.
-[2026-08-28T18:00:12.742Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10019ms). Cost: $0.
-[2026-08-28T18:15:12.372Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10012ms). Cost: $0.
-[2026-08-28T18:30:12.815Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10119ms). Cost: $0.
-[2026-08-28T18:45:12.700Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-08-28T19:00:16.127Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (13544ms). Cost: $0.
-[2026-08-28T19:15:13.466Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10055ms). Cost: $0.
-[2026-08-28T19:30:12.530Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10276ms). Cost: $0.
-[2026-08-28T19:45:11.756Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9803ms). Cost: $0.
-[2026-08-28T20:00:12.178Z] liveness: tier1 expired=25, tier2 checked=40 removed=0 (10255ms). Cost: $0.
-[2026-08-28T20:15:12.240Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10059ms). Cost: $0.
-[2026-08-28T20:30:12.769Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10264ms). Cost: $0.
-[2026-08-28T20:45:12.721Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10136ms). Cost: $0.
-[2026-08-28T21:00:12.783Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10267ms). Cost: $0.
-[2026-08-28T21:15:13.280Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10119ms). Cost: $0.
-[2026-08-28T21:30:12.482Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-08-28T21:45:12.574Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-08-28T22:00:13.253Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10190ms). Cost: $0.
-[2026-08-28T22:15:12.602Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-08-28T22:30:12.699Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-08-28T22:45:13.096Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-08-28T23:00:12.318Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9997ms). Cost: $0.
-[2026-08-28T23:15:13.096Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10388ms). Cost: $0.
-[2026-08-28T23:30:12.689Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10286ms). Cost: $0.
-[2026-08-28T23:45:12.234Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-29T00:00:12.704Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10380ms). Cost: $0.
-[2026-08-29T00:15:12.059Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10030ms). Cost: $0.
-[2026-08-29T00:30:11.602Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9949ms). Cost: $0.
-[2026-08-29T00:45:12.862Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-08-29T01:00:12.747Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-08-29T01:15:12.493Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10062ms). Cost: $0.
-[2026-08-29T01:30:12.256Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10330ms). Cost: $0.
-[2026-08-29T01:45:12.101Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10054ms). Cost: $0.
-[2026-08-29T02:00:12.209Z] liveness: tier1 expired=29, tier2 checked=40 removed=0 (10217ms). Cost: $0.
-[2026-08-29T02:15:12.186Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9912ms). Cost: $0.
-[2026-08-29T02:30:12.890Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-08-29T02:45:12.340Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10225ms). Cost: $0.
-[2026-08-29T03:00:12.330Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10160ms). Cost: $0.
-[2026-08-29T03:15:12.864Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10447ms). Cost: $0.
-[2026-08-29T03:30:12.671Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10029ms). Cost: $0.
-[2026-08-29T03:45:12.481Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10668ms). Cost: $0.
-[2026-08-29T04:00:13.010Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10551ms). Cost: $0.
-[2026-08-29T04:15:12.237Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9987ms). Cost: $0.
-[2026-08-29T04:30:12.286Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-08-29T04:45:12.400Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-08-29T05:00:13.389Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10633ms). Cost: $0.
-[2026-08-29T05:15:12.010Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10187ms). Cost: $0.
-[2026-08-29T05:30:12.872Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10260ms). Cost: $0.
-[2026-08-29T05:45:12.441Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9930ms). Cost: $0.
-[2026-08-29T06:00:12.044Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10029ms). Cost: $0.
-[2026-08-29T06:15:12.000Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10199ms). Cost: $0.
-[2026-08-29T06:30:11.727Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9960ms). Cost: $0.
-[2026-08-29T06:45:11.994Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9778ms). Cost: $0.
-[2026-08-29T07:00:12.543Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-08-29T07:15:12.083Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-08-29T07:30:13.179Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10161ms). Cost: $0.
-[2026-08-29T07:45:12.343Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10164ms). Cost: $0.
-[2026-08-29T08:00:12.574Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10500ms). Cost: $0.
-[2026-08-29T08:15:12.459Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10399ms). Cost: $0.
-[2026-08-29T08:30:11.980Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9958ms). Cost: $0.
-[2026-08-29T08:45:12.641Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10195ms). Cost: $0.
-[2026-08-29T09:00:12.804Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-08-29T09:15:11.719Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-08-29T09:30:13.345Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10658ms). Cost: $0.
-[2026-08-29T09:45:12.173Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10073ms). Cost: $0.
-[2026-08-29T10:00:12.227Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10316ms). Cost: $0.
-[2026-08-29T10:15:12.966Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10727ms). Cost: $0.
-[2026-08-29T10:30:13.419Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10536ms). Cost: $0.
-[2026-08-29T10:45:13.092Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10606ms). Cost: $0.
-[2026-08-29T11:00:13.196Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10175ms). Cost: $0.
-[2026-08-29T11:15:12.435Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10022ms). Cost: $0.
-[2026-08-29T11:30:12.133Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10242ms). Cost: $0.
-[2026-08-29T11:45:12.850Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10235ms). Cost: $0.
-[2026-08-29T12:00:12.807Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10121ms). Cost: $0.
-[2026-08-29T12:15:12.445Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10041ms). Cost: $0.
-[2026-08-29T12:30:12.530Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10276ms). Cost: $0.
-[2026-08-29T12:45:12.656Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-08-29T13:00:12.690Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10252ms). Cost: $0.
-[2026-08-29T13:15:12.275Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10106ms). Cost: $0.
-[2026-08-29T13:30:12.217Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10197ms). Cost: $0.
-[2026-08-29T13:45:11.881Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-08-29T14:00:13.790Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10403ms). Cost: $0.
-[2026-08-29T14:15:13.130Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10013ms). Cost: $0.
-[2026-08-29T14:30:12.704Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-08-29T14:45:12.964Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10502ms). Cost: $0.
-[2026-08-29T15:00:13.588Z] liveness: tier1 expired=23, tier2 checked=40 removed=0 (10375ms). Cost: $0.
-[2026-08-29T15:15:12.926Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10048ms). Cost: $0.
-[2026-08-29T15:30:12.467Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-08-29T15:45:12.324Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-08-29T16:00:13.731Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (11631ms). Cost: $0.
-[2026-08-29T16:15:12.450Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-08-29T16:30:12.900Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10561ms). Cost: $0.
-[2026-08-29T16:45:12.687Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10103ms). Cost: $0.
-[2026-08-29T17:00:12.985Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10295ms). Cost: $0.
-[2026-08-29T17:15:13.252Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10123ms). Cost: $0.
-[2026-08-29T17:30:11.948Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10200ms). Cost: $0.
-[2026-08-29T17:45:11.919Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10164ms). Cost: $0.
-[2026-08-29T18:00:12.774Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10148ms). Cost: $0.
-[2026-08-29T18:15:13.165Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10396ms). Cost: $0.
-[2026-08-29T18:30:12.080Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10130ms). Cost: $0.
-[2026-08-29T18:45:13.063Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-08-29T19:00:12.026Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10098ms). Cost: $0.
-[2026-08-29T19:15:12.948Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9960ms). Cost: $0.
-[2026-08-29T19:30:12.865Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10193ms). Cost: $0.
-[2026-08-29T19:45:12.176Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9977ms). Cost: $0.
-[2026-08-29T20:00:12.855Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10601ms). Cost: $0.
-[2026-08-29T20:15:12.064Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10085ms). Cost: $0.
-[2026-08-29T20:30:12.133Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10291ms). Cost: $0.
-[2026-08-29T20:45:12.281Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-08-29T21:00:12.304Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10144ms). Cost: $0.
-[2026-08-29T21:15:12.622Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10147ms). Cost: $0.
-[2026-08-29T21:30:12.589Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10111ms). Cost: $0.
-[2026-08-29T21:45:11.944Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10122ms). Cost: $0.
-[2026-08-29T22:00:14.486Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10975ms). Cost: $0.
-[2026-08-29T22:15:12.569Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-08-29T22:30:12.625Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-08-29T22:45:12.885Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-08-29T23:00:12.409Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-08-29T23:15:13.140Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-08-29T23:30:12.557Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10148ms). Cost: $0.
-[2026-08-29T23:45:12.086Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-08-30T00:00:13.006Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10285ms). Cost: $0.
-[2026-08-30T00:15:12.486Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-08-30T00:30:12.476Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10202ms). Cost: $0.
-[2026-08-30T00:45:12.789Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10494ms). Cost: $0.
-[2026-08-30T01:00:12.255Z] liveness: tier1 expired=40, tier2 checked=40 removed=0 (10311ms). Cost: $0.
-[2026-08-30T01:15:12.199Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10389ms). Cost: $0.
-[2026-08-30T01:30:13.147Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10170ms). Cost: $0.
-[2026-08-30T01:45:12.315Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10040ms). Cost: $0.
-[2026-08-30T02:00:13.752Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10574ms). Cost: $0.
-[2026-08-30T02:15:12.206Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-08-30T02:30:13.191Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10273ms). Cost: $0.
-[2026-08-30T02:45:12.211Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10102ms). Cost: $0.
-[2026-08-30T03:00:12.360Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9917ms). Cost: $0.
-[2026-08-30T03:15:12.223Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-08-30T03:30:12.534Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10196ms). Cost: $0.
-[2026-08-30T03:45:11.818Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-08-30T04:00:12.179Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10292ms). Cost: $0.
-[2026-08-30T04:15:12.399Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9971ms). Cost: $0.
-[2026-08-30T04:30:12.874Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10185ms). Cost: $0.
-[2026-08-30T04:45:13.046Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10709ms). Cost: $0.
-[2026-08-30T05:00:12.448Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10285ms). Cost: $0.
-[2026-08-30T05:15:12.450Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10464ms). Cost: $0.
-[2026-08-30T05:30:11.798Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-08-30T05:45:12.202Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10067ms). Cost: $0.
-[2026-08-30T06:00:12.167Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10285ms). Cost: $0.
-[2026-08-30T06:15:12.025Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10162ms). Cost: $0.
-[2026-08-30T06:30:12.268Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10167ms). Cost: $0.
-[2026-08-30T06:45:11.641Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9943ms). Cost: $0.
-[2026-08-30T07:00:12.493Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10271ms). Cost: $0.
-[2026-08-30T07:15:11.992Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10087ms). Cost: $0.
-[2026-08-30T07:30:13.116Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-08-30T07:45:11.854Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10014ms). Cost: $0.
-[2026-08-30T08:00:12.831Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10066ms). Cost: $0.
-[2026-08-30T08:15:12.695Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10412ms). Cost: $0.
-[2026-08-30T08:30:13.013Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10539ms). Cost: $0.
-[2026-08-30T08:45:12.765Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10424ms). Cost: $0.
-[2026-08-30T09:00:13.286Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10725ms). Cost: $0.
-[2026-08-30T09:15:13.198Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10502ms). Cost: $0.
-[2026-08-30T09:30:11.854Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-08-30T09:45:12.159Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-08-30T10:00:12.969Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10148ms). Cost: $0.
-[2026-08-30T10:15:12.372Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-08-30T10:30:12.830Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10342ms). Cost: $0.
-[2026-08-30T10:45:12.726Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10214ms). Cost: $0.
-[2026-08-30T11:00:13.243Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-08-30T11:15:12.976Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10288ms). Cost: $0.
-[2026-08-30T11:30:12.030Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-08-30T11:45:11.636Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9991ms). Cost: $0.
-[2026-08-30T12:00:12.539Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10145ms). Cost: $0.
-[2026-08-30T12:15:12.531Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10042ms). Cost: $0.
-[2026-08-30T12:30:12.765Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-08-30T12:45:12.220Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-08-30T13:00:12.563Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10431ms). Cost: $0.
-[2026-08-30T13:15:12.381Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-08-30T13:30:12.442Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10097ms). Cost: $0.
-[2026-08-30T13:45:12.137Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10259ms). Cost: $0.
-[2026-08-30T14:00:12.386Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10183ms). Cost: $0.
-[2026-08-30T14:15:12.220Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10035ms). Cost: $0.
-[2026-08-30T14:30:11.955Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10101ms). Cost: $0.
-[2026-08-30T14:45:12.300Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10096ms). Cost: $0.
-[2026-08-30T15:00:12.812Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10127ms). Cost: $0.
-[2026-08-30T15:15:13.029Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10150ms). Cost: $0.
-[2026-08-30T15:30:12.384Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-08-30T15:45:12.516Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10011ms). Cost: $0.
-[2026-08-30T16:00:12.670Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10258ms). Cost: $0.
-[2026-08-30T16:15:12.335Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10108ms). Cost: $0.
-[2026-08-30T16:30:11.870Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-08-30T16:45:11.889Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10056ms). Cost: $0.
-[2026-08-30T17:00:12.698Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10721ms). Cost: $0.
-[2026-08-30T17:15:12.640Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10254ms). Cost: $0.
-[2026-08-30T17:30:12.475Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10295ms). Cost: $0.
-[2026-08-30T17:45:11.712Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9726ms). Cost: $0.
-[2026-08-30T18:00:12.759Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-08-30T18:15:13.003Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10357ms). Cost: $0.
-[2026-08-30T18:30:11.988Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10109ms). Cost: $0.
-[2026-08-30T18:45:12.434Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10067ms). Cost: $0.
-[2026-08-30T19:00:13.199Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10331ms). Cost: $0.
-[2026-08-30T19:15:12.991Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10243ms). Cost: $0.
-[2026-08-30T19:30:12.480Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10105ms). Cost: $0.
-[2026-08-30T19:45:12.441Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9758ms). Cost: $0.
-[2026-08-30T20:00:12.896Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10542ms). Cost: $0.
-[2026-08-30T20:15:11.990Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-08-30T20:30:12.487Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-08-30T20:45:13.000Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10374ms). Cost: $0.
-[2026-08-30T21:00:12.823Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10490ms). Cost: $0.
-[2026-08-30T21:15:12.769Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-08-30T21:30:12.097Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-08-30T21:45:12.652Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-08-30T22:00:12.664Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10222ms). Cost: $0.
-[2026-08-30T22:15:12.292Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10134ms). Cost: $0.
-[2026-08-30T22:30:12.197Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-08-30T22:45:13.296Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10320ms). Cost: $0.
-[2026-08-30T23:00:13.647Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (11062ms). Cost: $0.
-[2026-08-30T23:15:12.742Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-08-30T23:30:12.498Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10099ms). Cost: $0.
-[2026-08-30T23:45:11.992Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-08-31T00:00:12.871Z] liveness: tier1 expired=75, tier2 checked=40 removed=0 (10256ms). Cost: $0.
-[2026-08-31T00:15:12.233Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-08-31T00:30:12.720Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10288ms). Cost: $0.
-[2026-08-31T00:45:11.901Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9984ms). Cost: $0.
-[2026-08-31T01:00:13.094Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10304ms). Cost: $0.
-[2026-08-31T01:15:13.370Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10181ms). Cost: $0.
-[2026-08-31T01:30:12.668Z] liveness: tier1 expired=21, tier2 checked=40 removed=0 (10277ms). Cost: $0.
-[2026-08-31T01:45:13.948Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (11658ms). Cost: $0.
-[2026-08-31T02:00:13.142Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10472ms). Cost: $0.
-[2026-08-31T02:15:11.999Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10051ms). Cost: $0.
-[2026-08-31T02:30:13.284Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-08-31T02:45:12.681Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10090ms). Cost: $0.
-[2026-08-31T03:00:13.153Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10221ms). Cost: $0.
-[2026-08-31T03:15:12.744Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10181ms). Cost: $0.
-[2026-08-31T03:30:12.986Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9829ms). Cost: $0.
-[2026-08-31T03:45:12.724Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-08-31T04:00:13.731Z] liveness: tier1 expired=32, tier2 checked=40 removed=0 (10231ms). Cost: $0.
-[2026-08-31T04:15:12.199Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10069ms). Cost: $0.
-[2026-08-31T04:30:12.603Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-08-31T04:45:11.983Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10160ms). Cost: $0.
-[2026-08-31T05:00:12.464Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10587ms). Cost: $0.
-[2026-08-31T05:15:12.174Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10381ms). Cost: $0.
-[2026-08-31T05:30:12.128Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10247ms). Cost: $0.
-[2026-08-31T05:45:12.418Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10055ms). Cost: $0.
-[2026-08-31T06:00:12.639Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10363ms). Cost: $0.
-[2026-08-31T06:15:12.099Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10137ms). Cost: $0.
-[2026-08-31T06:30:11.933Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-08-31T06:45:12.423Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10097ms). Cost: $0.
-[2026-08-31T07:00:13.232Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10272ms). Cost: $0.
-[2026-08-31T07:15:12.113Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10285ms). Cost: $0.
-[2026-08-31T07:30:12.593Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10073ms). Cost: $0.
-[2026-08-31T07:45:12.471Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10383ms). Cost: $0.
-[2026-08-31T08:00:12.903Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10476ms). Cost: $0.
-[2026-08-31T08:15:12.605Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-08-31T08:30:12.891Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10186ms). Cost: $0.
-[2026-08-31T08:45:13.228Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-08-31T09:00:12.044Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10272ms). Cost: $0.
-[2026-08-31T09:15:12.461Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10145ms). Cost: $0.
-[2026-08-31T09:30:12.795Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10156ms). Cost: $0.
-[2026-08-31T09:45:12.582Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10111ms). Cost: $0.
-[2026-08-31T10:00:14.825Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10420ms). Cost: $0.
-[2026-08-31T10:15:12.986Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-08-31T10:30:12.904Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10490ms). Cost: $0.
-[2026-08-31T10:45:12.988Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-08-31T11:00:12.271Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10384ms). Cost: $0.
-[2026-08-31T11:15:13.417Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10401ms). Cost: $0.
-[2026-08-31T11:30:13.360Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10517ms). Cost: $0.
-[2026-08-31T11:45:12.662Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10493ms). Cost: $0.
-[2026-08-31T12:00:13.749Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10391ms). Cost: $0.
-[2026-08-31T12:15:13.449Z] liveness: tier1 expired=78, tier2 checked=40 removed=0 (10318ms). Cost: $0.
-[2026-08-31T12:30:13.552Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10765ms). Cost: $0.
-[2026-08-31T12:45:13.373Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10314ms). Cost: $0.
-[2026-08-31T13:00:13.313Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10158ms). Cost: $0.
-[2026-08-31T13:15:12.956Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-08-31T13:30:12.984Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10257ms). Cost: $0.
-[2026-08-31T13:45:12.925Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10568ms). Cost: $0.
-[2026-08-31T14:00:13.122Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10415ms). Cost: $0.
-[2026-08-31T14:15:12.432Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10539ms). Cost: $0.
-[2026-08-31T14:30:12.490Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10230ms). Cost: $0.
-[2026-08-31T14:45:12.445Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10024ms). Cost: $0.
-[2026-08-31T15:00:13.308Z] liveness: tier1 expired=20, tier2 checked=40 removed=0 (10106ms). Cost: $0.
-[2026-08-31T15:15:13.406Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10187ms). Cost: $0.
-[2026-08-31T15:30:13.231Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10158ms). Cost: $0.
-[2026-08-31T15:45:13.172Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10391ms). Cost: $0.
-[2026-08-31T16:00:13.434Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10390ms). Cost: $0.
-[2026-08-31T16:15:12.618Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-08-31T16:30:13.405Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10315ms). Cost: $0.
-[2026-08-31T16:45:12.783Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10143ms). Cost: $0.
-[2026-08-31T17:00:13.116Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-08-31T17:15:12.435Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10149ms). Cost: $0.
-[2026-08-31T17:30:12.877Z] liveness: tier1 expired=20, tier2 checked=40 removed=0 (10219ms). Cost: $0.
-[2026-08-31T17:45:12.749Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10023ms). Cost: $0.
-[2026-08-31T18:00:12.898Z] liveness: tier1 expired=21, tier2 checked=40 removed=0 (10141ms). Cost: $0.
-[2026-08-31T18:15:12.869Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10273ms). Cost: $0.
-[2026-08-31T18:30:12.940Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10117ms). Cost: $0.
-[2026-08-31T18:45:13.094Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10191ms). Cost: $0.
-[2026-08-31T19:00:12.736Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (10395ms). Cost: $0.
-[2026-08-31T19:15:12.407Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10158ms). Cost: $0.
-[2026-08-31T19:30:13.134Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-08-31T19:45:12.736Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10247ms). Cost: $0.
-[2026-08-31T20:00:13.140Z] liveness: tier1 expired=22, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-08-31T20:15:12.689Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-08-31T20:30:12.429Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-08-31T20:45:12.909Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9926ms). Cost: $0.
-[2026-08-31T21:00:13.391Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10270ms). Cost: $0.
-[2026-08-31T21:15:11.996Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10135ms). Cost: $0.
-[2026-08-31T21:30:12.379Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10236ms). Cost: $0.
-[2026-08-31T21:45:12.993Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9994ms). Cost: $0.
-[2026-08-31T22:00:12.489Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10346ms). Cost: $0.
-[2026-08-31T22:15:12.643Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10087ms). Cost: $0.
-[2026-08-31T22:30:12.167Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9877ms). Cost: $0.
-[2026-08-31T22:45:12.372Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10002ms). Cost: $0.
-[2026-08-31T23:00:13.469Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10185ms). Cost: $0.
-[2026-08-31T23:15:12.702Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10203ms). Cost: $0.
-[2026-08-31T23:30:12.954Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10260ms). Cost: $0.
-[2026-08-31T23:45:12.488Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10461ms). Cost: $0.
-[2026-09-01T00:00:13.035Z] liveness: tier1 expired=72, tier2 checked=40 removed=0 (10539ms). Cost: $0.
-[2026-09-01T00:15:12.862Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10057ms). Cost: $0.
-[2026-09-01T00:30:12.108Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9948ms). Cost: $0.
-[2026-09-01T00:45:11.834Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10139ms). Cost: $0.
-[2026-09-01T01:00:13.723Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10336ms). Cost: $0.
-[2026-09-01T01:15:12.353Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10255ms). Cost: $0.
-[2026-09-01T01:30:13.510Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10208ms). Cost: $0.
-[2026-09-01T01:45:12.219Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10142ms). Cost: $0.
-[2026-09-01T02:00:12.914Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10243ms). Cost: $0.
-[2026-09-01T02:15:12.239Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10145ms). Cost: $0.
-[2026-09-01T02:30:13.268Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10232ms). Cost: $0.
-[2026-09-01T02:45:13.295Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10530ms). Cost: $0.
-[2026-09-01T03:00:13.055Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10145ms). Cost: $0.
-[2026-09-01T03:15:12.462Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-09-01T03:30:12.974Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10504ms). Cost: $0.
-[2026-09-01T03:45:12.985Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10288ms). Cost: $0.
-[2026-09-01T04:00:12.140Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10227ms). Cost: $0.
-[2026-09-01T04:15:12.425Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-09-01T04:30:13.465Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10317ms). Cost: $0.
-[2026-09-01T04:45:13.202Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10408ms). Cost: $0.
-[2026-09-01T05:00:12.490Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10312ms). Cost: $0.
-[2026-09-01T05:15:12.276Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10364ms). Cost: $0.
-[2026-09-01T05:30:13.572Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10603ms). Cost: $0.
-[2026-09-01T05:45:12.190Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-09-01T06:00:12.830Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10374ms). Cost: $0.
-[2026-09-01T06:15:12.740Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-09-01T06:30:12.625Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10387ms). Cost: $0.
-[2026-09-01T06:45:11.782Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-09-01T07:00:13.860Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10225ms). Cost: $0.
-[2026-09-01T07:15:13.687Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10625ms). Cost: $0.
-[2026-09-01T07:30:13.832Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10500ms). Cost: $0.
-[2026-09-01T07:45:13.245Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10098ms). Cost: $0.
-[2026-09-01T08:00:14.282Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10493ms). Cost: $0.
-[2026-09-01T08:15:13.070Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10086ms). Cost: $0.
-[2026-09-01T08:30:12.872Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10110ms). Cost: $0.
-[2026-09-01T08:45:12.283Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10083ms). Cost: $0.
-[2026-09-01T09:00:12.447Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10192ms). Cost: $0.
-[2026-09-01T09:15:13.752Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10897ms). Cost: $0.
-[2026-09-01T09:30:12.424Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10096ms). Cost: $0.
-[2026-09-01T09:45:12.220Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10161ms). Cost: $0.
-[2026-09-01T10:00:12.532Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10443ms). Cost: $0.
-[2026-09-01T10:15:12.583Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10033ms). Cost: $0.
-[2026-09-01T10:30:12.429Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10562ms). Cost: $0.
-[2026-09-01T10:45:12.674Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10117ms). Cost: $0.
-[2026-09-01T11:00:15.047Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (11147ms). Cost: $0.
-[2026-09-01T11:15:13.305Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10655ms). Cost: $0.
-[2026-09-01T11:30:12.211Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10045ms). Cost: $0.
-[2026-09-01T11:45:12.525Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10237ms). Cost: $0.
-[2026-09-01T12:00:13.284Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10093ms). Cost: $0.
-[2026-09-01T12:15:13.265Z] liveness: tier1 expired=98, tier2 checked=40 removed=0 (10599ms). Cost: $0.
-[2026-09-01T12:30:13.451Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10539ms). Cost: $0.
-[2026-09-01T12:45:12.446Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10085ms). Cost: $0.
-[2026-09-01T13:00:14.515Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (11355ms). Cost: $0.
-[2026-09-01T13:15:12.807Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10620ms). Cost: $0.
-[2026-09-01T13:30:14.385Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (11207ms). Cost: $0.
-[2026-09-01T13:45:12.884Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10638ms). Cost: $0.
-[2026-09-01T14:00:12.989Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10394ms). Cost: $0.
-[2026-09-01T14:15:12.497Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10412ms). Cost: $0.
-[2026-09-01T14:30:11.935Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9973ms). Cost: $0.
-[2026-09-01T14:45:11.797Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10048ms). Cost: $0.
-[2026-09-01T15:00:12.803Z] liveness: tier1 expired=23, tier2 checked=40 removed=0 (10183ms). Cost: $0.
-[2026-09-01T15:15:12.544Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-09-01T15:30:12.560Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-09-01T15:45:12.562Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10025ms). Cost: $0.
-[2026-09-01T16:00:12.487Z] liveness: tier1 expired=26, tier2 checked=40 removed=0 (10332ms). Cost: $0.
-[2026-09-01T16:15:12.764Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10146ms). Cost: $0.
-[2026-09-01T16:30:13.166Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10257ms). Cost: $0.
-[2026-09-01T16:45:12.234Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10061ms). Cost: $0.
-[2026-09-01T17:00:13.083Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10781ms). Cost: $0.
-[2026-09-01T17:15:13.354Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-09-01T17:30:12.238Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10118ms). Cost: $0.
-[2026-09-01T17:45:11.768Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9981ms). Cost: $0.
-[2026-09-01T18:00:13.048Z] liveness: tier1 expired=21, tier2 checked=40 removed=0 (10352ms). Cost: $0.
-[2026-09-01T18:15:12.251Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10192ms). Cost: $0.
-[2026-09-01T18:30:12.940Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10214ms). Cost: $0.
-[2026-09-01T18:45:13.326Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10264ms). Cost: $0.
-[2026-09-01T19:00:12.591Z] liveness: tier1 expired=23, tier2 checked=40 removed=0 (10043ms). Cost: $0.
-[2026-09-01T19:15:12.119Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-09-01T19:30:12.723Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10474ms). Cost: $0.
-[2026-09-01T19:45:12.949Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10209ms). Cost: $0.
-[2026-09-01T20:00:12.112Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10244ms). Cost: $0.
-[2026-09-01T20:15:12.564Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10070ms). Cost: $0.
-[2026-09-01T20:30:13.054Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10172ms). Cost: $0.
-[2026-09-01T20:45:11.863Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10131ms). Cost: $0.
-[2026-09-01T21:00:12.122Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10379ms). Cost: $0.
-[2026-09-01T21:15:12.311Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-09-01T21:30:12.072Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-09-01T21:45:12.833Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10138ms). Cost: $0.
-[2026-09-01T22:00:13.182Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10435ms). Cost: $0.
-[2026-09-01T22:15:11.942Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10077ms). Cost: $0.
-[2026-09-01T22:30:13.221Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10066ms). Cost: $0.
-[2026-09-01T22:45:12.139Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10242ms). Cost: $0.
-[2026-09-01T23:00:12.839Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10379ms). Cost: $0.
-[2026-09-01T23:15:12.321Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10107ms). Cost: $0.
-[2026-09-01T23:30:12.374Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10088ms). Cost: $0.
-[2026-09-01T23:45:12.380Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10005ms). Cost: $0.
-[2026-09-02T00:00:12.884Z] liveness: tier1 expired=62, tier2 checked=40 removed=0 (10299ms). Cost: $0.
-[2026-09-02T00:15:12.384Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-09-02T00:30:12.156Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9999ms). Cost: $0.
-[2026-09-02T00:45:12.440Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9994ms). Cost: $0.
-[2026-09-02T01:00:13.006Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10259ms). Cost: $0.
-[2026-09-02T01:15:12.392Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10163ms). Cost: $0.
-[2026-09-02T01:30:12.253Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10250ms). Cost: $0.
-[2026-09-02T01:45:11.885Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9970ms). Cost: $0.
-[2026-09-02T02:00:13.009Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10680ms). Cost: $0.
-[2026-09-02T02:15:12.708Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9943ms). Cost: $0.
-[2026-09-02T02:30:12.439Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10185ms). Cost: $0.
-[2026-09-02T02:45:12.325Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10160ms). Cost: $0.
-[2026-09-02T03:00:13.041Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10200ms). Cost: $0.
-[2026-09-02T03:15:12.722Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10210ms). Cost: $0.
-[2026-09-02T03:30:13.364Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10422ms). Cost: $0.
-[2026-09-02T03:45:12.491Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9991ms). Cost: $0.
-[2026-09-02T04:00:12.044Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10220ms). Cost: $0.
-[2026-09-02T04:15:12.507Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9928ms). Cost: $0.
-[2026-09-02T04:30:12.229Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10182ms). Cost: $0.
-[2026-09-02T04:45:12.306Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10312ms). Cost: $0.
-[2026-09-02T05:00:13.206Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10084ms). Cost: $0.
-[2026-09-02T05:15:13.017Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10730ms). Cost: $0.
-[2026-09-02T05:30:12.433Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-09-02T05:45:12.152Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-09-02T06:00:11.800Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-09-02T06:15:13.093Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10689ms). Cost: $0.
-[2026-09-02T06:30:12.407Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9985ms). Cost: $0.
-[2026-09-02T06:45:12.270Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-09-02T07:00:12.363Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10116ms). Cost: $0.
-[2026-09-02T07:15:12.607Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10153ms). Cost: $0.
-[2026-09-02T07:30:12.739Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10179ms). Cost: $0.
-[2026-09-02T07:45:12.766Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10211ms). Cost: $0.
-[2026-09-02T08:00:13.150Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10573ms). Cost: $0.
-[2026-09-02T08:15:13.051Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-09-02T08:30:13.083Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10343ms). Cost: $0.
-[2026-09-02T08:45:12.825Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-09-02T09:00:13.443Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10726ms). Cost: $0.
-[2026-09-02T09:15:12.122Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10396ms). Cost: $0.
-[2026-09-02T09:30:12.434Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10382ms). Cost: $0.
-[2026-09-02T09:45:12.031Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-09-02T10:00:13.408Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10628ms). Cost: $0.
-[2026-09-02T10:15:12.249Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9955ms). Cost: $0.
-[2026-09-02T10:30:12.716Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9986ms). Cost: $0.
-[2026-09-02T10:45:13.060Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-09-02T11:00:12.256Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10071ms). Cost: $0.
-[2026-09-02T11:15:13.095Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10452ms). Cost: $0.
-[2026-09-02T11:30:12.431Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10291ms). Cost: $0.
-[2026-09-02T11:45:12.347Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10303ms). Cost: $0.
-[2026-09-02T12:00:12.721Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10431ms). Cost: $0.
-[2026-09-02T12:15:12.117Z] liveness: tier1 expired=135, tier2 checked=40 removed=0 (9939ms). Cost: $0.
-[2026-09-02T12:30:12.854Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10371ms). Cost: $0.
-[2026-09-02T12:45:12.579Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-09-02T13:00:13.209Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10616ms). Cost: $0.
-[2026-09-02T13:15:12.525Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10362ms). Cost: $0.
-[2026-09-02T13:30:13.225Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10703ms). Cost: $0.
-[2026-09-02T13:45:11.950Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10060ms). Cost: $0.
-[2026-09-02T14:00:12.688Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10195ms). Cost: $0.
-[2026-09-02T14:15:13.232Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10092ms). Cost: $0.
-[2026-09-02T14:30:12.218Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (10439ms). Cost: $0.
-[2026-09-02T14:45:13.142Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10693ms). Cost: $0.
-[2026-09-02T15:00:13.350Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10422ms). Cost: $0.
-[2026-09-02T15:15:13.069Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10252ms). Cost: $0.
-[2026-09-02T15:30:13.097Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10049ms). Cost: $0.
-[2026-09-02T15:45:12.161Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-09-02T16:00:12.771Z] liveness: tier1 expired=25, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-09-02T16:15:11.717Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9769ms). Cost: $0.
-[2026-09-02T16:30:13.309Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9975ms). Cost: $0.
-[2026-09-02T16:45:12.096Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10042ms). Cost: $0.
-[2026-09-02T17:00:13.055Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (10171ms). Cost: $0.
-[2026-09-02T17:15:12.882Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10090ms). Cost: $0.
-[2026-09-02T17:30:12.042Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10215ms). Cost: $0.
-[2026-09-02T17:45:12.236Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-09-02T18:00:13.244Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10123ms). Cost: $0.
-[2026-09-02T18:15:12.620Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9786ms). Cost: $0.
-[2026-09-02T18:30:12.650Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10036ms). Cost: $0.
-[2026-09-02T18:45:12.983Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10151ms). Cost: $0.
-[2026-09-02T19:00:12.140Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10196ms). Cost: $0.
-[2026-09-02T19:15:12.885Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10088ms). Cost: $0.
-[2026-09-02T19:30:13.144Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10175ms). Cost: $0.
-[2026-09-02T19:45:12.301Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9806ms). Cost: $0.
-[2026-09-02T20:00:13.241Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10108ms). Cost: $0.
-[2026-09-02T20:15:12.854Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10170ms). Cost: $0.
-[2026-09-02T20:30:12.762Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10654ms). Cost: $0.
-[2026-09-02T20:45:12.410Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10213ms). Cost: $0.
-[2026-09-02T21:00:13.117Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10711ms). Cost: $0.
-[2026-09-02T21:15:12.927Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10052ms). Cost: $0.
-[2026-09-02T21:30:12.804Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10098ms). Cost: $0.
-[2026-09-02T21:45:12.471Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-09-02T22:00:13.019Z] liveness: tier1 expired=28, tier2 checked=40 removed=0 (9814ms). Cost: $0.
-[2026-09-02T22:15:12.649Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-09-02T22:30:13.505Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10260ms). Cost: $0.
-[2026-09-02T22:45:12.294Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10096ms). Cost: $0.
-[2026-09-02T23:00:12.974Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10158ms). Cost: $0.
-[2026-09-02T23:15:11.966Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10093ms). Cost: $0.
-[2026-09-02T23:30:13.161Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9962ms). Cost: $0.
-[2026-09-02T23:45:13.057Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9953ms). Cost: $0.
-[2026-09-03T00:00:13.533Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10453ms). Cost: $0.
-[2026-09-03T00:15:12.492Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-09-03T00:30:12.316Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10084ms). Cost: $0.
-[2026-09-03T00:45:12.231Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10220ms). Cost: $0.
-[2026-09-03T01:00:13.635Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (11360ms). Cost: $0.
-[2026-09-03T01:15:12.815Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-09-03T01:30:12.679Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10266ms). Cost: $0.
-[2026-09-03T01:45:12.254Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10012ms). Cost: $0.
-[2026-09-03T02:00:12.972Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10265ms). Cost: $0.
-[2026-09-03T02:15:12.969Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10009ms). Cost: $0.
-[2026-09-03T02:30:11.774Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-09-03T02:45:12.415Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10076ms). Cost: $0.
-[2026-09-03T03:00:12.981Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-09-03T03:15:12.577Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10080ms). Cost: $0.
-[2026-09-03T03:30:12.284Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10311ms). Cost: $0.
-[2026-09-03T03:45:12.146Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9944ms). Cost: $0.
-[2026-09-03T04:00:12.337Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10163ms). Cost: $0.
-[2026-09-03T04:15:11.896Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10072ms). Cost: $0.
-[2026-09-03T04:30:12.569Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10145ms). Cost: $0.
-[2026-09-03T04:45:12.803Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9989ms). Cost: $0.
-[2026-09-03T05:00:13.001Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-09-03T05:15:12.058Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10009ms). Cost: $0.
-[2026-09-03T05:30:11.379Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9750ms). Cost: $0.
-[2026-09-03T05:45:11.603Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9938ms). Cost: $0.
-[2026-09-03T06:00:12.313Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-09-03T06:15:13.000Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (10169ms). Cost: $0.
-[2026-09-03T06:30:11.977Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10159ms). Cost: $0.
-[2026-09-03T06:45:12.545Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10130ms). Cost: $0.
-[2026-09-03T07:00:12.283Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10150ms). Cost: $0.
-[2026-09-03T07:15:12.318Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9764ms). Cost: $0.
-[2026-09-03T07:30:12.161Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9768ms). Cost: $0.
-[2026-09-03T07:45:12.742Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-09-03T08:00:12.695Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10270ms). Cost: $0.
-[2026-09-03T08:15:12.509Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10534ms). Cost: $0.
-[2026-09-03T08:30:12.170Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10121ms). Cost: $0.
-[2026-09-03T08:45:12.903Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-09-03T09:00:12.762Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10102ms). Cost: $0.
-[2026-09-03T09:15:12.104Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10128ms). Cost: $0.
-[2026-09-03T09:30:12.724Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10255ms). Cost: $0.
-[2026-09-03T09:45:12.165Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10005ms). Cost: $0.
-[2026-09-03T10:00:12.551Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10662ms). Cost: $0.
-[2026-09-03T10:15:13.364Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10420ms). Cost: $0.
-[2026-09-03T10:30:13.460Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10124ms). Cost: $0.
-[2026-09-03T10:45:12.338Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10306ms). Cost: $0.
-[2026-09-03T11:00:13.167Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10727ms). Cost: $0.
-[2026-09-03T11:15:13.248Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10148ms). Cost: $0.
-[2026-09-03T11:30:12.878Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10195ms). Cost: $0.
-[2026-09-03T11:45:12.792Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10179ms). Cost: $0.
-[2026-09-03T12:00:13.110Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10154ms). Cost: $0.
-[2026-09-03T12:15:12.832Z] liveness: tier1 expired=87, tier2 checked=40 removed=0 (10341ms). Cost: $0.
-[2026-09-03T12:30:12.809Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10257ms). Cost: $0.
-[2026-09-03T12:45:13.087Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10545ms). Cost: $0.
-[2026-09-03T13:00:13.403Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10708ms). Cost: $0.
-[2026-09-03T13:15:12.217Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10228ms). Cost: $0.
-[2026-09-03T13:30:13.413Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10304ms). Cost: $0.
-[2026-09-03T13:45:13.027Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10404ms). Cost: $0.
-[2026-09-03T14:00:13.778Z] liveness: tier1 expired=29, tier2 checked=40 removed=0 (10327ms). Cost: $0.
-[2026-09-03T14:15:13.537Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10183ms). Cost: $0.
-[2026-09-03T14:30:13.637Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10407ms). Cost: $0.
-[2026-09-03T14:45:12.621Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9935ms). Cost: $0.
-[2026-09-03T15:00:13.683Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10468ms). Cost: $0.
-[2026-09-03T15:15:12.446Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10395ms). Cost: $0.
-[2026-09-03T15:30:13.795Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10588ms). Cost: $0.
-[2026-09-03T15:45:12.646Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10175ms). Cost: $0.
-[2026-09-03T16:00:12.915Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10411ms). Cost: $0.
-[2026-09-03T16:15:12.048Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (10325ms). Cost: $0.
-[2026-09-03T16:30:12.525Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10412ms). Cost: $0.
-[2026-09-03T16:45:13.258Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10213ms). Cost: $0.
-[2026-09-03T17:00:13.002Z] liveness: tier1 expired=39, tier2 checked=40 removed=0 (10002ms). Cost: $0.
-[2026-09-03T17:15:12.190Z] liveness: tier1 expired=76, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-09-03T17:30:12.709Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9787ms). Cost: $0.
-[2026-09-03T17:45:12.460Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-09-03T18:00:12.334Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10095ms). Cost: $0.
-[2026-09-03T18:15:13.283Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10191ms). Cost: $0.
-[2026-09-03T18:30:13.146Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9952ms). Cost: $0.
-[2026-09-03T18:45:13.502Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10112ms). Cost: $0.
-[2026-09-03T19:00:13.215Z] liveness: tier1 expired=18, tier2 checked=40 removed=0 (10306ms). Cost: $0.
-[2026-09-03T19:15:12.519Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9956ms). Cost: $0.
-[2026-09-03T19:30:12.470Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-09-03T19:45:12.062Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9901ms). Cost: $0.
-[2026-09-03T20:00:12.558Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (10074ms). Cost: $0.
-[2026-09-03T20:15:11.936Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-09-03T20:30:13.144Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10027ms). Cost: $0.
-[2026-09-03T20:45:12.236Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9892ms). Cost: $0.
-[2026-09-03T21:00:13.061Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10299ms). Cost: $0.
-[2026-09-03T21:15:12.319Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9869ms). Cost: $0.
-[2026-09-03T21:30:12.380Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10246ms). Cost: $0.
-[2026-09-03T21:45:11.953Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9760ms). Cost: $0.
-[2026-09-03T22:00:12.868Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9976ms). Cost: $0.
-[2026-09-03T22:15:12.523Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9809ms). Cost: $0.
-[2026-09-03T22:30:12.777Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9908ms). Cost: $0.
-[2026-09-03T22:45:12.490Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9977ms). Cost: $0.
-[2026-09-03T23:00:13.048Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-09-03T23:15:12.666Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10214ms). Cost: $0.
-[2026-09-03T23:30:12.398Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-09-03T23:45:12.028Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9829ms). Cost: $0.
-[2026-09-04T00:00:11.725Z] liveness: tier1 expired=52, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-09-04T00:15:12.904Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10896ms). Cost: $0.
-[2026-09-04T00:30:12.923Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9844ms). Cost: $0.
-[2026-09-04T00:45:11.993Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9909ms). Cost: $0.
-[2026-09-04T01:00:12.436Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9889ms). Cost: $0.
-[2026-09-04T01:15:13.395Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9786ms). Cost: $0.
-[2026-09-04T01:30:12.201Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9878ms). Cost: $0.
-[2026-09-04T01:45:12.130Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9936ms). Cost: $0.
-[2026-09-04T02:00:13.110Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (9965ms). Cost: $0.
-[2026-09-04T02:15:12.457Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-09-04T02:30:12.085Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9879ms). Cost: $0.
-[2026-09-04T02:45:11.791Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9912ms). Cost: $0.
-[2026-09-04T03:00:12.434Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9823ms). Cost: $0.
-[2026-09-04T03:15:12.484Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9933ms). Cost: $0.
-[2026-09-04T03:30:12.442Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10109ms). Cost: $0.
-[2026-09-04T03:45:12.265Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9937ms). Cost: $0.
-[2026-09-04T04:00:13.440Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9893ms). Cost: $0.
-[2026-09-04T04:15:12.833Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-09-04T04:30:12.565Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9946ms). Cost: $0.
-[2026-09-04T04:45:12.806Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9808ms). Cost: $0.
-[2026-09-04T05:00:13.162Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10006ms). Cost: $0.
-[2026-09-04T05:15:12.204Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9868ms). Cost: $0.
-[2026-09-04T05:30:11.971Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9861ms). Cost: $0.
-[2026-09-04T05:45:12.376Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9802ms). Cost: $0.
-[2026-09-04T06:00:11.997Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9935ms). Cost: $0.
-[2026-09-04T06:15:12.393Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9943ms). Cost: $0.
-[2026-09-04T06:30:12.367Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9983ms). Cost: $0.
-[2026-09-04T06:45:11.963Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9862ms). Cost: $0.
-[2026-09-04T07:00:12.657Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9970ms). Cost: $0.
-[2026-09-04T07:15:12.888Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-09-04T07:30:12.503Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10168ms). Cost: $0.
-[2026-09-04T07:45:11.848Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9802ms). Cost: $0.
-[2026-09-04T08:00:12.450Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9994ms). Cost: $0.
-[2026-09-04T08:15:11.914Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9861ms). Cost: $0.
-[2026-09-04T08:30:13.113Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-09-04T08:45:11.894Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-09-04T09:00:13.431Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-09-04T09:15:12.045Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-09-04T09:30:12.466Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9817ms). Cost: $0.
-[2026-09-04T09:45:11.901Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9822ms). Cost: $0.
-[2026-09-04T10:00:12.749Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10132ms). Cost: $0.
-[2026-09-04T10:15:11.839Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10227ms). Cost: $0.
-[2026-09-04T10:30:13.113Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10333ms). Cost: $0.
-[2026-09-04T10:45:12.769Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-09-04T11:00:12.831Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9910ms). Cost: $0.
-[2026-09-04T11:15:12.327Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-09-04T11:30:12.717Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10063ms). Cost: $0.
-[2026-09-04T11:45:12.301Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9828ms). Cost: $0.
-[2026-09-04T12:00:12.176Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10050ms). Cost: $0.
-[2026-09-04T12:15:12.783Z] liveness: tier1 expired=132, tier2 checked=40 removed=0 (10142ms). Cost: $0.
-[2026-09-04T12:30:12.684Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-09-04T12:45:12.473Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9972ms). Cost: $0.
-[2026-09-04T13:00:12.758Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10378ms). Cost: $0.
-[2026-09-04T13:15:12.527Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9963ms). Cost: $0.
-[2026-09-04T13:30:13.032Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10178ms). Cost: $0.
-[2026-09-04T13:45:12.536Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-09-04T14:00:12.829Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10242ms). Cost: $0.
-[2026-09-04T14:15:12.929Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9850ms). Cost: $0.
-[2026-09-04T14:30:12.950Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9807ms). Cost: $0.
-[2026-09-04T14:45:12.841Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9812ms). Cost: $0.
-[2026-09-04T15:00:13.780Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10161ms). Cost: $0.
-[2026-09-04T15:15:12.749Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10456ms). Cost: $0.
-[2026-09-04T15:30:13.080Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-09-04T15:45:12.028Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-09-04T16:00:12.148Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10009ms). Cost: $0.
-[2026-09-04T16:15:11.527Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9798ms). Cost: $0.
-[2026-09-04T16:30:12.505Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10033ms). Cost: $0.
-[2026-09-04T16:45:12.247Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-09-04T17:00:12.878Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9941ms). Cost: $0.
-[2026-09-04T17:15:12.955Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9847ms). Cost: $0.
-[2026-09-04T17:30:12.853Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9937ms). Cost: $0.
-[2026-09-04T17:45:12.491Z] liveness: tier1 expired=124, tier2 checked=40 removed=0 (10053ms). Cost: $0.
-[2026-09-04T18:00:12.399Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-09-04T18:15:11.679Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-09-04T18:30:12.761Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9822ms). Cost: $0.
-[2026-09-04T18:45:12.865Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9765ms). Cost: $0.
-[2026-09-04T19:00:12.710Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-09-04T19:15:11.722Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9822ms). Cost: $0.
-[2026-09-04T19:30:12.630Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-09-04T19:45:12.242Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9889ms). Cost: $0.
-[2026-09-04T20:00:12.111Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9943ms). Cost: $0.
-[2026-09-04T20:15:12.427Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9812ms). Cost: $0.
-[2026-09-04T20:30:12.069Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9986ms). Cost: $0.
-[2026-09-04T20:45:11.923Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9774ms). Cost: $0.
-[2026-09-04T21:00:12.803Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9880ms). Cost: $0.
-[2026-09-04T21:15:12.808Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9767ms). Cost: $0.
-[2026-09-04T21:30:11.996Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9966ms). Cost: $0.
-[2026-09-04T21:45:11.792Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9836ms). Cost: $0.
-[2026-09-04T22:00:11.832Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9909ms). Cost: $0.
-[2026-09-04T22:15:12.549Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-09-04T22:30:12.617Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9982ms). Cost: $0.
-[2026-09-04T22:45:12.132Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10265ms). Cost: $0.
-[2026-09-04T23:00:12.085Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10067ms). Cost: $0.
-[2026-09-04T23:15:12.075Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9910ms). Cost: $0.
-[2026-09-04T23:30:12.140Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9970ms). Cost: $0.
-[2026-09-04T23:45:11.793Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9908ms). Cost: $0.
-[2026-09-05T00:00:13.949Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10292ms). Cost: $0.
-[2026-09-05T00:15:12.100Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-09-05T00:30:13.038Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-09-05T00:45:12.458Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-09-05T01:00:12.967Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-09-05T01:15:12.844Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10157ms). Cost: $0.
-[2026-09-05T01:30:12.036Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10141ms). Cost: $0.
-[2026-09-05T01:45:12.153Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-09-05T02:00:12.377Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-09-05T02:15:11.996Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9774ms). Cost: $0.
-[2026-09-05T02:30:11.855Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10108ms). Cost: $0.
-[2026-09-05T02:45:12.482Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-09-05T03:00:12.987Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10744ms). Cost: $0.
-[2026-09-05T03:15:12.780Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10018ms). Cost: $0.
-[2026-09-05T03:30:12.384Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10123ms). Cost: $0.
-[2026-09-05T03:45:12.233Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9839ms). Cost: $0.
-[2026-09-05T04:00:13.208Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9993ms). Cost: $0.
-[2026-09-05T04:15:12.157Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9879ms). Cost: $0.
-[2026-09-05T04:30:12.174Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9828ms). Cost: $0.
-[2026-09-05T04:45:11.967Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-09-05T05:00:13.531Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10013ms). Cost: $0.
-[2026-09-05T05:15:12.588Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10018ms). Cost: $0.
-[2026-09-05T05:30:12.543Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9892ms). Cost: $0.
-[2026-09-05T05:45:12.027Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9898ms). Cost: $0.
-[2026-09-05T06:00:12.512Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9924ms). Cost: $0.
-[2026-09-05T06:15:11.834Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9866ms). Cost: $0.
-[2026-09-05T06:30:12.686Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9849ms). Cost: $0.
-[2026-09-05T06:45:12.353Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9908ms). Cost: $0.
-[2026-09-05T07:00:12.200Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10211ms). Cost: $0.
-[2026-09-05T07:15:12.642Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10134ms). Cost: $0.
-[2026-09-05T07:30:12.503Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9817ms). Cost: $0.
-[2026-09-05T07:45:11.819Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-09-05T08:00:12.220Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-09-05T08:15:12.453Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9942ms). Cost: $0.
-[2026-09-05T08:30:11.825Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9852ms). Cost: $0.
-[2026-09-05T08:45:12.387Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9704ms). Cost: $0.
-[2026-09-05T09:00:12.397Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9929ms). Cost: $0.
-[2026-09-05T09:15:11.901Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-09-05T09:30:11.477Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-09-05T09:45:11.968Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9806ms). Cost: $0.
-[2026-09-05T10:00:12.041Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9938ms). Cost: $0.
-[2026-09-05T10:15:12.498Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10200ms). Cost: $0.
-[2026-09-05T10:30:12.548Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9749ms). Cost: $0.
-[2026-09-05T10:45:12.800Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9807ms). Cost: $0.
-[2026-09-05T11:00:12.562Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9949ms). Cost: $0.
-[2026-09-05T11:15:12.876Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9942ms). Cost: $0.
-[2026-09-05T11:30:12.511Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-09-05T11:45:11.842Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9910ms). Cost: $0.
-[2026-09-05T12:00:12.854Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10075ms). Cost: $0.
-[2026-09-05T12:15:12.051Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-09-05T12:30:11.682Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9782ms). Cost: $0.
-[2026-09-05T12:45:12.267Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9838ms). Cost: $0.
-[2026-09-05T13:00:11.908Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9865ms). Cost: $0.
-[2026-09-05T13:15:11.933Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9768ms). Cost: $0.
-[2026-09-05T13:30:12.427Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9869ms). Cost: $0.
-[2026-09-05T13:45:11.892Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-09-05T14:00:12.778Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-09-05T14:15:11.778Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9850ms). Cost: $0.
-[2026-09-05T14:30:12.188Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9771ms). Cost: $0.
-[2026-09-05T14:45:11.610Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-09-05T15:00:12.445Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9920ms). Cost: $0.
-[2026-09-05T15:15:13.081Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-09-05T15:30:11.720Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9917ms). Cost: $0.
-[2026-09-05T15:45:12.204Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9834ms). Cost: $0.
-[2026-09-05T16:00:12.098Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-09-05T16:15:12.338Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-09-05T16:30:12.280Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9908ms). Cost: $0.
-[2026-09-05T16:45:12.065Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9854ms). Cost: $0.
-[2026-09-05T17:00:12.804Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-09-05T17:15:12.572Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9853ms). Cost: $0.
-[2026-09-05T17:30:12.213Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9842ms). Cost: $0.
-[2026-09-05T17:45:11.366Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9743ms). Cost: $0.
-[2026-09-05T18:00:11.861Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9784ms). Cost: $0.
-[2026-09-05T18:15:12.280Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9740ms). Cost: $0.
-[2026-09-05T18:30:12.332Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9904ms). Cost: $0.
-[2026-09-05T18:45:12.016Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-09-05T19:00:12.681Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9960ms). Cost: $0.
-[2026-09-05T19:15:11.788Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9906ms). Cost: $0.
-[2026-09-05T19:30:12.379Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9880ms). Cost: $0.
-[2026-09-05T19:45:12.097Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9819ms). Cost: $0.
-[2026-09-05T20:00:11.819Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9842ms). Cost: $0.
-[2026-09-05T20:15:12.385Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9761ms). Cost: $0.
-[2026-09-05T20:30:11.796Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9834ms). Cost: $0.
-[2026-09-05T20:45:12.792Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9817ms). Cost: $0.
-[2026-09-05T21:00:12.440Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-09-05T21:15:12.941Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9838ms). Cost: $0.
-[2026-09-05T21:30:12.944Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-09-05T21:45:12.542Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9741ms). Cost: $0.
-[2026-09-05T22:00:12.468Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-09-05T22:15:12.316Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9788ms). Cost: $0.
-[2026-09-05T22:30:12.518Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10105ms). Cost: $0.
-[2026-09-05T22:45:12.232Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9686ms). Cost: $0.
-[2026-09-05T23:00:11.887Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9841ms). Cost: $0.
-[2026-09-05T23:15:11.776Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9924ms). Cost: $0.
-[2026-09-05T23:30:12.428Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9811ms). Cost: $0.
-[2026-09-05T23:45:17.626Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (14914ms). Cost: $0.
-[2026-09-06T00:00:13.601Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9793ms). Cost: $0.
-[2026-09-06T00:15:12.859Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9930ms). Cost: $0.
-[2026-09-06T00:30:12.124Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-09-06T00:45:11.790Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9910ms). Cost: $0.
-[2026-09-06T01:00:13.033Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-09-06T01:15:12.360Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9791ms). Cost: $0.
-[2026-09-06T01:30:12.266Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-09-06T01:45:11.840Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9881ms). Cost: $0.
-[2026-09-06T02:00:12.400Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9847ms). Cost: $0.
-[2026-09-06T02:15:12.171Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9967ms). Cost: $0.
-[2026-09-06T02:30:11.815Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9866ms). Cost: $0.
-[2026-09-06T02:45:12.397Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9822ms). Cost: $0.
-[2026-09-06T03:00:11.982Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9813ms). Cost: $0.
-[2026-09-06T03:15:11.814Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9883ms). Cost: $0.
-[2026-09-06T03:30:12.631Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9836ms). Cost: $0.
-[2026-09-06T03:45:12.578Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9816ms). Cost: $0.
-[2026-09-06T04:00:12.000Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9881ms). Cost: $0.
-[2026-09-06T04:15:12.072Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9913ms). Cost: $0.
-[2026-09-06T04:30:11.776Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9854ms). Cost: $0.
-[2026-09-06T04:45:11.616Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9859ms). Cost: $0.
-[2026-09-06T05:00:13.022Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10046ms). Cost: $0.
-[2026-09-06T05:15:11.866Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-09-06T05:30:12.244Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9806ms). Cost: $0.
-[2026-09-06T05:45:11.512Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9752ms). Cost: $0.
-[2026-09-06T06:00:11.880Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-09-06T06:15:12.500Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-09-06T06:30:12.010Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9938ms). Cost: $0.
-[2026-09-06T06:45:11.605Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9892ms). Cost: $0.
-[2026-09-06T07:00:12.031Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-09-06T07:15:12.431Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9952ms). Cost: $0.
-[2026-09-06T07:30:13.024Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9781ms). Cost: $0.
-[2026-09-06T07:45:12.486Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9916ms). Cost: $0.
-[2026-09-06T08:00:11.897Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-09-06T08:15:12.005Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-09-06T08:30:12.262Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9773ms). Cost: $0.
-[2026-09-06T08:45:12.180Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9970ms). Cost: $0.
-[2026-09-06T09:00:11.761Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9925ms). Cost: $0.
-[2026-09-06T09:15:11.891Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10100ms). Cost: $0.
-[2026-09-06T09:30:12.608Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9928ms). Cost: $0.
-[2026-09-06T09:45:12.231Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9898ms). Cost: $0.
-[2026-09-06T10:00:11.730Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9894ms). Cost: $0.
-[2026-09-06T10:15:12.255Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9784ms). Cost: $0.
-[2026-09-06T10:30:11.963Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9850ms). Cost: $0.
-[2026-09-06T10:45:13.182Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9925ms). Cost: $0.
-[2026-09-06T11:00:12.094Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9843ms). Cost: $0.
-[2026-09-06T11:15:13.049Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9853ms). Cost: $0.
-[2026-09-06T11:30:12.768Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-09-06T11:45:12.174Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9873ms). Cost: $0.
-[2026-09-06T12:00:12.682Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10034ms). Cost: $0.
-[2026-09-06T12:15:11.594Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9695ms). Cost: $0.
-[2026-09-06T12:30:12.134Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-09-06T12:45:11.913Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-09-06T13:00:11.877Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10094ms). Cost: $0.
-[2026-09-06T13:15:11.753Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9823ms). Cost: $0.
-[2026-09-06T13:30:12.347Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9941ms). Cost: $0.
-[2026-09-06T13:45:11.807Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-09-06T14:00:12.538Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9879ms). Cost: $0.
-[2026-09-06T14:15:11.741Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-09-06T14:30:12.527Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9962ms). Cost: $0.
-[2026-09-06T14:45:12.018Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9779ms). Cost: $0.
-[2026-09-06T15:00:13.326Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9912ms). Cost: $0.
-[2026-09-06T15:15:12.678Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9947ms). Cost: $0.
-[2026-09-06T15:30:11.585Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-09-06T15:45:11.767Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9646ms). Cost: $0.
-[2026-09-06T16:00:13.038Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9885ms). Cost: $0.
-[2026-09-06T16:15:12.471Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9890ms). Cost: $0.
-[2026-09-06T16:30:12.270Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9851ms). Cost: $0.
-[2026-09-06T16:45:11.861Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9825ms). Cost: $0.
-[2026-09-06T17:00:12.487Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9957ms). Cost: $0.
-[2026-09-06T17:15:12.182Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9866ms). Cost: $0.
-[2026-09-06T17:30:11.750Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9796ms). Cost: $0.
-[2026-09-06T17:45:12.843Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9797ms). Cost: $0.
-[2026-09-06T18:00:12.379Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9864ms). Cost: $0.
-[2026-09-06T18:15:12.806Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9754ms). Cost: $0.
-[2026-09-06T18:30:12.808Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9780ms). Cost: $0.
-[2026-09-06T18:45:13.147Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10000ms). Cost: $0.
-[2026-09-06T19:00:12.035Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9844ms). Cost: $0.
-[2026-09-06T19:15:11.991Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9839ms). Cost: $0.
-[2026-09-06T19:30:11.771Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9873ms). Cost: $0.
-[2026-09-06T19:45:12.223Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9791ms). Cost: $0.
-[2026-09-06T20:00:12.119Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10021ms). Cost: $0.
-[2026-09-06T20:15:12.568Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-09-06T20:30:12.333Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10037ms). Cost: $0.
-[2026-09-06T20:45:11.869Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9746ms). Cost: $0.
-[2026-09-06T21:00:13.580Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9934ms). Cost: $0.
-[2026-09-06T21:15:12.690Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-09-06T21:30:11.975Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9760ms). Cost: $0.
-[2026-09-06T21:45:12.443Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9760ms). Cost: $0.
-[2026-09-06T22:00:13.079Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10198ms). Cost: $0.
-[2026-09-06T22:15:12.387Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9991ms). Cost: $0.
-[2026-09-06T22:30:11.688Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9780ms). Cost: $0.
-[2026-09-06T22:45:12.654Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9829ms). Cost: $0.
-[2026-09-06T23:00:13.089Z] liveness: tier1 expired=21, tier2 checked=40 removed=0 (10067ms). Cost: $0.
-[2026-09-06T23:15:12.490Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9867ms). Cost: $0.
-[2026-09-06T23:30:12.131Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9884ms). Cost: $0.
-[2026-09-06T23:45:11.996Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9992ms). Cost: $0.
-[2026-09-07T00:00:11.790Z] liveness: tier1 expired=102, tier2 checked=40 removed=0 (9915ms). Cost: $0.
-[2026-09-07T00:15:12.607Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9834ms). Cost: $0.
-[2026-09-07T00:30:12.243Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9774ms). Cost: $0.
-[2026-09-07T00:45:12.367Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9777ms). Cost: $0.
-[2026-09-07T01:00:12.554Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9882ms). Cost: $0.
-[2026-09-07T01:15:13.146Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9867ms). Cost: $0.
-[2026-09-07T01:30:12.282Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (9841ms). Cost: $0.
-[2026-09-07T01:45:12.157Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9776ms). Cost: $0.
-[2026-09-07T02:00:12.332Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9843ms). Cost: $0.
-[2026-09-07T02:15:12.166Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-09-07T02:30:11.976Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9755ms). Cost: $0.
-[2026-09-07T02:45:12.782Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9882ms). Cost: $0.
-[2026-09-07T03:00:12.422Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9943ms). Cost: $0.
-[2026-09-07T03:15:11.942Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9954ms). Cost: $0.
-[2026-09-07T03:30:11.846Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10003ms). Cost: $0.
-[2026-09-07T03:45:11.391Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9786ms). Cost: $0.
-[2026-09-07T04:00:12.600Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10031ms). Cost: $0.
-[2026-09-07T04:15:11.828Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9754ms). Cost: $0.
-[2026-09-07T04:30:12.732Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10068ms). Cost: $0.
-[2026-09-07T04:45:12.240Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9789ms). Cost: $0.
-[2026-09-07T05:00:12.628Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-09-07T05:15:12.386Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-09-07T05:30:12.313Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9931ms). Cost: $0.
-[2026-09-07T05:45:11.840Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9988ms). Cost: $0.
-[2026-09-07T06:00:12.448Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9895ms). Cost: $0.
-[2026-09-07T06:15:11.927Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9877ms). Cost: $0.
-[2026-09-07T06:30:12.730Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10047ms). Cost: $0.
-[2026-09-07T06:45:12.022Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-09-07T07:00:12.727Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9881ms). Cost: $0.
-[2026-09-07T07:15:12.530Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-09-07T07:30:12.423Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10001ms). Cost: $0.
-[2026-09-07T07:45:11.843Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9884ms). Cost: $0.
-[2026-09-07T08:00:12.565Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-09-07T08:15:12.353Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9830ms). Cost: $0.
-[2026-09-07T08:30:12.031Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9964ms). Cost: $0.
-[2026-09-07T08:45:12.429Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9845ms). Cost: $0.
-[2026-09-07T09:00:12.509Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10286ms). Cost: $0.
-[2026-09-07T09:15:11.857Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9895ms). Cost: $0.
-[2026-09-07T09:30:12.210Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9778ms). Cost: $0.
-[2026-09-07T09:45:11.552Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9847ms). Cost: $0.
-[2026-09-07T10:00:12.160Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10014ms). Cost: $0.
-[2026-09-07T10:15:12.341Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9877ms). Cost: $0.
-[2026-09-07T10:30:12.384Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-09-07T10:45:12.564Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9909ms). Cost: $0.
-[2026-09-07T11:00:12.446Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10150ms). Cost: $0.
-[2026-09-07T11:15:11.859Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9841ms). Cost: $0.
-[2026-09-07T11:30:13.110Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10104ms). Cost: $0.
-[2026-09-07T11:45:12.362Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9719ms). Cost: $0.
-[2026-09-07T12:00:11.949Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10203ms). Cost: $0.
-[2026-09-07T12:15:12.065Z] liveness: tier1 expired=101, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-09-07T12:30:12.112Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9717ms). Cost: $0.
-[2026-09-07T12:45:11.537Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9859ms). Cost: $0.
-[2026-09-07T13:00:11.712Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9771ms). Cost: $0.
-[2026-09-07T13:15:11.309Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9780ms). Cost: $0.
-[2026-09-07T13:30:11.380Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9869ms). Cost: $0.
-[2026-09-07T13:45:11.448Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-09-07T14:00:11.686Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-09-07T14:15:11.504Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9814ms). Cost: $0.
-[2026-09-07T14:30:12.263Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9954ms). Cost: $0.
-[2026-09-07T14:45:11.602Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9859ms). Cost: $0.
-[2026-09-07T15:00:11.772Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9761ms). Cost: $0.
-[2026-09-07T15:15:12.233Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9808ms). Cost: $0.
-[2026-09-07T15:30:11.369Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9684ms). Cost: $0.
-[2026-09-07T15:45:11.851Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9728ms). Cost: $0.
-[2026-09-07T16:00:12.539Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9771ms). Cost: $0.
-[2026-09-07T16:15:11.838Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9709ms). Cost: $0.
-[2026-09-07T16:30:12.329Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9823ms). Cost: $0.
-[2026-09-07T16:45:11.584Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9729ms). Cost: $0.
-[2026-09-07T17:00:12.012Z] liveness: tier1 expired=10, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-09-07T17:15:11.780Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9761ms). Cost: $0.
-[2026-09-07T17:30:11.865Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9692ms). Cost: $0.
-[2026-09-07T17:45:12.067Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9721ms). Cost: $0.
-[2026-09-07T18:00:11.968Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9884ms). Cost: $0.
-[2026-09-07T18:15:12.584Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9691ms). Cost: $0.
-[2026-09-07T18:30:12.020Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9932ms). Cost: $0.
-[2026-09-07T18:45:12.438Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9743ms). Cost: $0.
-[2026-09-07T19:00:12.004Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (9854ms). Cost: $0.
-[2026-09-07T19:15:11.995Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9699ms). Cost: $0.
-[2026-09-07T19:30:11.886Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9787ms). Cost: $0.
-[2026-09-07T19:45:12.292Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9918ms). Cost: $0.
-[2026-09-07T20:00:11.706Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9712ms). Cost: $0.
-[2026-09-07T20:15:11.954Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9690ms). Cost: $0.
-[2026-09-07T20:30:11.516Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9750ms). Cost: $0.
-[2026-09-07T20:45:11.781Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9643ms). Cost: $0.
-[2026-09-07T21:00:12.474Z] liveness: tier1 expired=34, tier2 checked=40 removed=0 (9932ms). Cost: $0.
-[2026-09-07T21:15:11.623Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9812ms). Cost: $0.
-[2026-09-07T21:30:12.377Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-09-07T21:45:11.865Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9884ms). Cost: $0.
-[2026-09-07T22:00:12.362Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-09-07T22:15:12.556Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10015ms). Cost: $0.
-[2026-09-07T22:30:12.449Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9847ms). Cost: $0.
-[2026-09-07T22:45:11.837Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9795ms). Cost: $0.
-[2026-09-07T23:00:13.580Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (11065ms). Cost: $0.
-[2026-09-07T23:15:12.430Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9726ms). Cost: $0.
-[2026-09-07T23:30:12.610Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10164ms). Cost: $0.
-[2026-09-07T23:45:12.496Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10260ms). Cost: $0.
-[2026-09-08T00:00:12.653Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (10432ms). Cost: $0.
-[2026-09-08T00:15:12.175Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9808ms). Cost: $0.
-[2026-09-08T00:30:11.296Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9675ms). Cost: $0.
-[2026-09-08T00:45:11.445Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9660ms). Cost: $0.
-[2026-09-08T01:00:11.930Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9825ms). Cost: $0.
-[2026-09-08T01:15:12.285Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10135ms). Cost: $0.
-[2026-09-08T01:30:12.278Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10153ms). Cost: $0.
-[2026-09-08T01:45:12.272Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10091ms). Cost: $0.
-[2026-09-08T02:00:12.685Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (10255ms). Cost: $0.
-[2026-09-08T02:15:12.697Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10199ms). Cost: $0.
-[2026-09-08T02:30:12.437Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9754ms). Cost: $0.
-[2026-09-08T02:45:12.154Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9716ms). Cost: $0.
-[2026-09-08T03:00:12.428Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10232ms). Cost: $0.
-[2026-09-08T03:15:12.357Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10174ms). Cost: $0.
-[2026-09-08T03:30:11.767Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9754ms). Cost: $0.
-[2026-09-08T03:45:12.159Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9669ms). Cost: $0.
-[2026-09-08T04:00:11.629Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9745ms). Cost: $0.
-[2026-09-08T04:15:12.100Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9755ms). Cost: $0.
-[2026-09-08T04:30:12.375Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9806ms). Cost: $0.
-[2026-09-08T04:45:12.032Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-09-08T05:00:13.014Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9847ms). Cost: $0.
-[2026-09-08T05:15:12.109Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9760ms). Cost: $0.
-[2026-09-08T05:30:11.492Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9773ms). Cost: $0.
-[2026-09-08T05:45:11.809Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9871ms). Cost: $0.
-[2026-09-08T06:00:12.066Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9763ms). Cost: $0.
-[2026-09-08T06:15:11.432Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9737ms). Cost: $0.
-[2026-09-08T06:30:12.587Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9732ms). Cost: $0.
-[2026-09-08T06:45:12.508Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9782ms). Cost: $0.
-[2026-09-08T07:00:11.574Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9752ms). Cost: $0.
-[2026-09-08T07:15:12.174Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9721ms). Cost: $0.
-[2026-09-08T07:30:12.445Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9814ms). Cost: $0.
-[2026-09-08T07:45:11.863Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9702ms). Cost: $0.
-[2026-09-08T08:00:12.486Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9863ms). Cost: $0.
-[2026-09-08T08:15:12.532Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9702ms). Cost: $0.
-[2026-09-08T08:30:11.974Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9714ms). Cost: $0.
-[2026-09-08T08:45:12.432Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9724ms). Cost: $0.
-[2026-09-08T09:00:11.832Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9858ms). Cost: $0.
-[2026-09-08T09:15:12.461Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10009ms). Cost: $0.
-[2026-09-08T09:30:11.894Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9655ms). Cost: $0.
-[2026-09-08T09:45:12.223Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9743ms). Cost: $0.
-[2026-09-08T10:00:11.523Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9776ms). Cost: $0.
-[2026-09-08T10:15:12.175Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-09-08T10:30:12.090Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9944ms). Cost: $0.
-[2026-09-08T10:45:11.863Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9725ms). Cost: $0.
-[2026-09-08T11:00:12.576Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-09-08T11:15:12.852Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9894ms). Cost: $0.
-[2026-09-08T11:30:12.456Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9700ms). Cost: $0.
-[2026-09-08T11:45:11.733Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9724ms). Cost: $0.
-[2026-09-08T12:00:12.338Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9750ms). Cost: $0.
-[2026-09-08T12:15:12.057Z] liveness: tier1 expired=96, tier2 checked=40 removed=0 (9719ms). Cost: $0.
-[2026-09-08T12:30:12.739Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9776ms). Cost: $0.
-[2026-09-08T12:45:11.938Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9709ms). Cost: $0.
-[2026-09-08T13:00:12.475Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9793ms). Cost: $0.
-[2026-09-08T13:15:12.473Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9763ms). Cost: $0.
-[2026-09-08T13:30:12.074Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-09-08T13:45:12.316Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9705ms). Cost: $0.
-[2026-09-08T14:00:12.076Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9692ms). Cost: $0.
-[2026-09-08T14:15:11.670Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-09-08T14:30:12.462Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9750ms). Cost: $0.
-[2026-09-08T14:45:11.758Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9698ms). Cost: $0.
-[2026-09-08T15:00:12.387Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (9715ms). Cost: $0.
-[2026-09-08T15:15:12.379Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9880ms). Cost: $0.
-[2026-09-08T15:30:12.665Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9751ms). Cost: $0.
-[2026-09-08T15:45:12.344Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9725ms). Cost: $0.
-[2026-09-08T16:00:12.080Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (9800ms). Cost: $0.
-[2026-09-08T16:15:12.740Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9881ms). Cost: $0.
-[2026-09-08T16:30:12.514Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9847ms). Cost: $0.
-[2026-09-08T16:45:11.819Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9747ms). Cost: $0.
-[2026-09-08T17:00:12.271Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9716ms). Cost: $0.
-[2026-09-08T17:15:11.524Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9796ms). Cost: $0.
-[2026-09-08T17:30:11.959Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-09-08T17:45:11.797Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9717ms). Cost: $0.
-[2026-09-08T18:00:12.619Z] liveness: tier1 expired=14, tier2 checked=40 removed=0 (9714ms). Cost: $0.
-[2026-09-08T18:15:12.583Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9718ms). Cost: $0.
-[2026-09-08T18:30:12.271Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-09-08T18:45:12.035Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-09-08T19:00:11.999Z] liveness: tier1 expired=13, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-09-08T19:15:12.232Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9746ms). Cost: $0.
-[2026-09-08T19:30:12.005Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9695ms). Cost: $0.
-[2026-09-08T19:45:11.711Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9666ms). Cost: $0.
-[2026-09-08T20:00:12.713Z] liveness: tier1 expired=28, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-09-08T20:15:11.778Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9660ms). Cost: $0.
-[2026-09-08T20:30:12.335Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9922ms). Cost: $0.
-[2026-09-08T20:45:11.906Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9681ms). Cost: $0.
-[2026-09-08T21:00:12.870Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (10102ms). Cost: $0.
-[2026-09-08T21:15:12.533Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9684ms). Cost: $0.
-[2026-09-08T21:30:12.103Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9691ms). Cost: $0.
-[2026-09-08T21:45:12.183Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9856ms). Cost: $0.
-[2026-09-08T22:00:12.071Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9863ms). Cost: $0.
-[2026-09-08T22:15:12.527Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10053ms). Cost: $0.
-[2026-09-08T22:30:12.193Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9754ms). Cost: $0.
-[2026-09-08T22:45:11.749Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9716ms). Cost: $0.
-[2026-09-08T23:00:12.613Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9714ms). Cost: $0.
-[2026-09-08T23:15:12.604Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9736ms). Cost: $0.
-[2026-09-08T23:30:12.316Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9733ms). Cost: $0.
-[2026-09-08T23:45:12.542Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10007ms). Cost: $0.
-[2026-09-09T00:00:12.359Z] liveness: tier1 expired=74, tier2 checked=40 removed=0 (9950ms). Cost: $0.
-[2026-09-09T00:15:11.774Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10030ms). Cost: $0.
-[2026-09-09T00:30:12.214Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9699ms). Cost: $0.
-[2026-09-09T00:45:12.012Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9713ms). Cost: $0.
-[2026-09-09T01:00:12.966Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9949ms). Cost: $0.
-[2026-09-09T01:15:12.540Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9873ms). Cost: $0.
-[2026-09-09T01:30:12.295Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9791ms). Cost: $0.
-[2026-09-09T01:45:12.004Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9795ms). Cost: $0.
-[2026-09-09T02:00:11.828Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9775ms). Cost: $0.
-[2026-09-09T02:15:11.907Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9683ms). Cost: $0.
-[2026-09-09T02:30:12.954Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-09-09T02:45:12.719Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-09-09T03:00:12.399Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9781ms). Cost: $0.
-[2026-09-09T03:15:11.731Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9739ms). Cost: $0.
-[2026-09-09T03:30:12.318Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9798ms). Cost: $0.
-[2026-09-09T03:45:11.875Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9746ms). Cost: $0.
-[2026-09-09T04:00:11.685Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9745ms). Cost: $0.
-[2026-09-09T04:15:12.282Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9766ms). Cost: $0.
-[2026-09-09T04:30:12.534Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10202ms). Cost: $0.
-[2026-09-09T04:45:12.649Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9725ms). Cost: $0.
-[2026-09-09T05:00:13.051Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9801ms). Cost: $0.
-[2026-09-09T05:15:12.250Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9695ms). Cost: $0.
-[2026-09-09T05:30:11.537Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9687ms). Cost: $0.
-[2026-09-09T05:45:11.649Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9705ms). Cost: $0.
-[2026-09-09T06:00:11.799Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9691ms). Cost: $0.
-[2026-09-09T06:15:12.723Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9793ms). Cost: $0.
-[2026-09-09T06:30:12.069Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9758ms). Cost: $0.
-[2026-09-09T06:45:12.333Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9744ms). Cost: $0.
-[2026-09-09T07:00:11.519Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9794ms). Cost: $0.
-[2026-09-09T07:15:12.563Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9709ms). Cost: $0.
-[2026-09-09T07:30:12.673Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9738ms). Cost: $0.
-[2026-09-09T07:45:12.302Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9815ms). Cost: $0.
-[2026-09-09T08:00:12.186Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9905ms). Cost: $0.
-[2026-09-09T08:15:12.526Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9770ms). Cost: $0.
-[2026-09-09T08:30:12.022Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9838ms). Cost: $0.
-[2026-09-09T08:45:12.544Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9720ms). Cost: $0.
-[2026-09-09T09:00:11.887Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9782ms). Cost: $0.
-[2026-09-09T09:15:11.485Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9691ms). Cost: $0.
-[2026-09-09T09:30:11.898Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9766ms). Cost: $0.
-[2026-09-09T09:45:12.193Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9707ms). Cost: $0.
-[2026-09-09T10:00:12.577Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9833ms). Cost: $0.
-[2026-09-09T10:15:12.051Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9753ms). Cost: $0.
-[2026-09-09T10:30:11.752Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9769ms). Cost: $0.
-[2026-09-09T10:45:12.506Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9799ms). Cost: $0.
-[2026-09-09T11:00:12.150Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9865ms). Cost: $0.
-[2026-09-09T11:15:12.465Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9746ms). Cost: $0.
-[2026-09-09T11:30:12.053Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9708ms). Cost: $0.
-[2026-09-09T11:45:12.767Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9850ms). Cost: $0.
-[2026-09-09T12:00:12.369Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9751ms). Cost: $0.
-[2026-09-09T12:15:12.340Z] liveness: tier1 expired=127, tier2 checked=40 removed=0 (9849ms). Cost: $0.
-[2026-09-09T12:30:11.859Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9781ms). Cost: $0.
-[2026-09-09T12:45:11.832Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10221ms). Cost: $0.
-[2026-09-09T13:00:12.099Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9909ms). Cost: $0.
-[2026-09-09T13:15:12.092Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9772ms). Cost: $0.
-[2026-09-09T13:30:12.360Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9751ms). Cost: $0.
-[2026-09-09T13:45:12.003Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9770ms). Cost: $0.
-npm notice
-npm notice New major version of npm available! 10.9.4 -> 12.0.2
-npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.0.2
-npm notice To update run: npm install -g npm@12.0.2
-npm notice
-[2026-09-09T14:00:12.782Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9815ms). Cost: $0.
-[2026-09-09T14:15:12.092Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9765ms). Cost: $0.
-[2026-09-09T14:30:12.109Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9874ms). Cost: $0.
-[2026-09-09T14:45:12.945Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9823ms). Cost: $0.
-[2026-09-09T15:00:13.117Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (10136ms). Cost: $0.
-[2026-09-09T15:15:13.483Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10464ms). Cost: $0.
-[2026-09-09T15:30:13.346Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9916ms). Cost: $0.
-[2026-09-09T15:45:12.529Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10004ms). Cost: $0.
-[2026-09-09T16:00:13.438Z] liveness: tier1 expired=22, tier2 checked=40 removed=0 (10296ms). Cost: $0.
-[2026-09-09T16:15:12.961Z] liveness: tier1 expired=15, tier2 checked=40 removed=0 (10210ms). Cost: $0.
-[2026-09-09T16:30:13.054Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10220ms). Cost: $0.
-[2026-09-09T16:45:13.136Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10008ms). Cost: $0.
-[2026-09-09T17:00:14.131Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10155ms). Cost: $0.
-[2026-09-09T17:15:13.290Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (10431ms). Cost: $0.
-[2026-09-09T17:30:13.983Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10114ms). Cost: $0.
-[2026-09-09T17:45:12.748Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9918ms). Cost: $0.
-[2026-09-09T18:00:13.270Z] liveness: tier1 expired=12, tier2 checked=40 removed=0 (9867ms). Cost: $0.
-[2026-09-09T18:15:13.227Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-09-09T18:30:12.404Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9940ms). Cost: $0.
-[2026-09-09T18:45:13.121Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9973ms). Cost: $0.
-[2026-09-09T19:00:13.829Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (10467ms). Cost: $0.
-[2026-09-09T19:15:13.411Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10381ms). Cost: $0.
-[2026-09-09T19:30:13.165Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10058ms). Cost: $0.
-[2026-09-09T19:45:12.065Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9919ms). Cost: $0.
-[2026-09-09T20:00:12.962Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9974ms). Cost: $0.
-[2026-09-09T20:15:12.396Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9891ms). Cost: $0.
-[2026-09-09T20:30:13.527Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9959ms). Cost: $0.
-[2026-09-09T20:45:13.385Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9888ms). Cost: $0.
-[2026-09-09T21:00:13.369Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9868ms). Cost: $0.
-[2026-09-09T21:15:13.145Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10594ms). Cost: $0.
-[2026-09-09T21:30:13.030Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (10082ms). Cost: $0.
-[2026-09-09T21:45:13.023Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9990ms). Cost: $0.
-[2026-09-09T22:00:12.288Z] liveness: tier1 expired=17, tier2 checked=40 removed=0 (9721ms). Cost: $0.
-[2026-09-09T22:15:12.368Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9785ms). Cost: $0.
-[2026-09-09T22:30:12.200Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-09-09T22:45:11.751Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9764ms). Cost: $0.
-[2026-09-09T23:00:13.323Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10065ms). Cost: $0.
-[2026-09-09T23:15:11.617Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9799ms). Cost: $0.
-[2026-09-09T23:30:11.976Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9690ms). Cost: $0.
-[2026-09-09T23:45:11.858Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9759ms). Cost: $0.
-[2026-09-10T00:00:12.489Z] liveness: tier1 expired=30, tier2 checked=40 removed=0 (9869ms). Cost: $0.
-[2026-09-10T00:15:12.211Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-09-10T00:30:11.956Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9701ms). Cost: $0.
-[2026-09-10T00:45:11.900Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9741ms). Cost: $0.
-[2026-09-10T01:00:12.858Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9746ms). Cost: $0.
-[2026-09-10T01:15:12.564Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9702ms). Cost: $0.
-[2026-09-10T01:30:12.456Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9788ms). Cost: $0.
-[2026-09-10T01:45:12.431Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9687ms). Cost: $0.
-[2026-09-10T02:00:12.317Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9733ms). Cost: $0.
-[2026-09-10T02:15:12.354Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-09-10T02:30:12.027Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9925ms). Cost: $0.
-[2026-09-10T02:45:11.414Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9674ms). Cost: $0.
-[2026-09-10T03:00:12.373Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9746ms). Cost: $0.
-[2026-09-10T03:15:12.514Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9727ms). Cost: $0.
-[2026-09-10T03:30:12.366Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9828ms). Cost: $0.
-[2026-09-10T03:45:11.874Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9743ms). Cost: $0.
-[2026-09-10T04:00:11.880Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9754ms). Cost: $0.
-[2026-09-10T04:15:11.897Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9696ms). Cost: $0.
-[2026-09-10T04:30:12.628Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9799ms). Cost: $0.
-[2026-09-10T04:45:12.398Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9917ms). Cost: $0.
-[2026-09-10T05:00:12.259Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9748ms). Cost: $0.
-[2026-09-10T05:15:12.505Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-09-10T05:30:12.291Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9883ms). Cost: $0.
-[2026-09-10T05:45:11.480Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9701ms). Cost: $0.
-[2026-09-10T06:00:12.015Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9819ms). Cost: $0.
-[2026-09-10T06:15:12.387Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10126ms). Cost: $0.
-[2026-09-10T06:30:12.079Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9831ms). Cost: $0.
-[2026-09-10T06:45:12.258Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9782ms). Cost: $0.
-[2026-09-10T07:00:11.862Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9812ms). Cost: $0.
-[2026-09-10T07:15:12.519Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9902ms). Cost: $0.
-[2026-09-10T07:30:11.600Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9880ms). Cost: $0.
-[2026-09-10T07:45:12.149Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-09-10T08:00:12.261Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-09-10T08:15:12.452Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9806ms). Cost: $0.
-[2026-09-10T08:30:12.770Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-09-10T08:45:12.434Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9804ms). Cost: $0.
-[2026-09-10T09:00:12.376Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9842ms). Cost: $0.
-[2026-09-10T09:15:11.533Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9863ms). Cost: $0.
-[2026-09-10T09:30:12.919Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9976ms). Cost: $0.
-[2026-09-10T09:45:11.899Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9723ms). Cost: $0.
-[2026-09-10T10:00:11.874Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9980ms). Cost: $0.
-[2026-09-10T10:15:11.964Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9749ms). Cost: $0.
-[2026-09-10T10:30:12.982Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9949ms). Cost: $0.
-[2026-09-10T10:45:12.111Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9796ms). Cost: $0.
-[2026-09-10T11:00:12.260Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9868ms). Cost: $0.
-[2026-09-10T11:15:12.990Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9749ms). Cost: $0.
-[2026-09-10T11:30:11.971Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9751ms). Cost: $0.
-[2026-09-10T11:45:11.529Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9782ms). Cost: $0.
-[2026-09-10T12:00:12.418Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9729ms). Cost: $0.
-[2026-09-10T12:15:12.148Z] liveness: tier1 expired=123, tier2 checked=40 removed=0 (9758ms). Cost: $0.
-[2026-09-10T12:30:11.792Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9832ms). Cost: $0.
-[2026-09-10T12:45:12.722Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10209ms). Cost: $0.
-[2026-09-10T13:00:12.676Z] liveness: tier1 expired=21, tier2 checked=40 removed=0 (9889ms). Cost: $0.
-[2026-09-10T13:15:11.617Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9792ms). Cost: $0.
-[2026-09-10T13:30:11.978Z] liveness: tier1 expired=30, tier2 checked=40 removed=0 (9770ms). Cost: $0.
-[2026-09-10T13:45:12.037Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9876ms). Cost: $0.
-[2026-09-10T14:00:12.246Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9829ms). Cost: $0.
-[2026-09-10T14:15:12.428Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9803ms). Cost: $0.
-[2026-09-10T14:30:12.573Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (9995ms). Cost: $0.
-[2026-09-10T14:45:12.625Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9813ms). Cost: $0.
-[2026-09-10T15:00:12.356Z] liveness: tier1 expired=28, tier2 checked=40 removed=0 (9821ms). Cost: $0.
-[2026-09-10T15:15:12.160Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9953ms). Cost: $0.
-[2026-09-10T15:30:11.923Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9744ms). Cost: $0.
-[2026-09-10T15:45:11.568Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9757ms). Cost: $0.
-[2026-09-10T16:00:12.205Z] liveness: tier1 expired=19, tier2 checked=40 removed=0 (9704ms). Cost: $0.
-[2026-09-10T16:15:11.970Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9835ms). Cost: $0.
-[2026-09-10T16:30:11.486Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9636ms). Cost: $0.
-[2026-09-10T16:45:12.467Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9863ms). Cost: $0.
-[2026-09-10T17:00:12.488Z] liveness: tier1 expired=18, tier2 checked=40 removed=0 (9867ms). Cost: $0.
-[2026-09-10T17:15:11.965Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9781ms). Cost: $0.
-[2026-09-10T17:30:12.119Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9807ms). Cost: $0.
-[2026-09-10T17:45:12.106Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9720ms). Cost: $0.
-[2026-09-10T18:00:12.103Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9803ms). Cost: $0.
-[2026-09-10T18:15:12.767Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9812ms). Cost: $0.
-[2026-09-10T18:30:13.058Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9842ms). Cost: $0.
-[2026-09-10T18:45:12.165Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9770ms). Cost: $0.
-[2026-09-10T19:00:11.781Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9741ms). Cost: $0.
-[2026-09-10T19:15:12.055Z] liveness: tier1 expired=16, tier2 checked=40 removed=0 (9784ms). Cost: $0.
-[2026-09-10T19:30:11.611Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9732ms). Cost: $0.
-[2026-09-10T19:45:12.091Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9731ms). Cost: $0.
-[2026-09-10T20:00:12.162Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9714ms). Cost: $0.
-[2026-09-10T20:15:12.039Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9731ms). Cost: $0.
-[2026-09-10T20:30:11.614Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9764ms). Cost: $0.
-[2026-09-10T20:45:12.338Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9708ms). Cost: $0.
-[2026-09-10T21:00:11.791Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9766ms). Cost: $0.
-[2026-09-10T21:15:12.224Z] liveness: tier1 expired=8, tier2 checked=40 removed=0 (9714ms). Cost: $0.
-[2026-09-10T21:30:12.350Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9872ms). Cost: $0.
-[2026-09-10T21:45:12.091Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9683ms). Cost: $0.
-[2026-09-10T22:00:12.123Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9855ms). Cost: $0.
-[2026-09-10T22:15:12.007Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9698ms). Cost: $0.
-[2026-09-10T22:30:12.810Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9811ms). Cost: $0.
-[2026-09-10T22:45:12.251Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9728ms). Cost: $0.
-[2026-09-10T23:00:11.775Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9756ms). Cost: $0.
-[2026-09-10T23:15:11.704Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9749ms). Cost: $0.
-[2026-09-10T23:30:12.175Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9744ms). Cost: $0.
-[2026-09-10T23:45:12.021Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9727ms). Cost: $0.
-[2026-09-11T00:00:12.421Z] liveness: tier1 expired=41, tier2 checked=40 removed=0 (9744ms). Cost: $0.
-[2026-09-11T00:15:12.662Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9760ms). Cost: $0.
-[2026-09-11T00:30:12.670Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9865ms). Cost: $0.
-[2026-09-11T00:45:12.622Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-09-11T01:00:12.818Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9883ms). Cost: $0.
-[2026-09-11T01:15:12.015Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9797ms). Cost: $0.
-[2026-09-11T01:30:12.210Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9921ms). Cost: $0.
-[2026-09-11T01:45:12.121Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9811ms). Cost: $0.
-[2026-09-11T02:00:12.145Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9836ms). Cost: $0.
-[2026-09-11T02:15:11.889Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9746ms). Cost: $0.
-[2026-09-11T02:30:12.391Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9754ms). Cost: $0.
-[2026-09-11T02:45:11.858Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9729ms). Cost: $0.
-[2026-09-11T03:00:13.211Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9785ms). Cost: $0.
-[2026-09-11T03:15:12.468Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9724ms). Cost: $0.
-[2026-09-11T03:30:12.527Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9748ms). Cost: $0.
-[2026-09-11T03:45:12.215Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9752ms). Cost: $0.
-[2026-09-11T04:00:12.191Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-09-11T04:15:12.321Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9761ms). Cost: $0.
-[2026-09-11T04:30:12.406Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9836ms). Cost: $0.
-[2026-09-11T04:45:12.439Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9773ms). Cost: $0.
-[2026-09-11T05:00:12.141Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9778ms). Cost: $0.
-[2026-09-11T05:15:12.328Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9907ms). Cost: $0.
-[2026-09-11T05:30:12.006Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9887ms). Cost: $0.
-[2026-09-11T05:45:12.244Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9692ms). Cost: $0.
-[2026-09-11T06:00:11.902Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9913ms). Cost: $0.
-[2026-09-11T06:15:12.509Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9890ms). Cost: $0.
-[2026-09-11T06:30:12.376Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9846ms). Cost: $0.
-[2026-09-11T06:45:12.175Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9777ms). Cost: $0.
-[2026-09-11T07:00:11.882Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9827ms). Cost: $0.
-[2026-09-11T07:15:12.072Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9816ms). Cost: $0.
-[2026-09-11T07:30:12.925Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9969ms). Cost: $0.
-[2026-09-11T07:45:13.020Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9979ms). Cost: $0.
-[2026-09-11T08:00:11.705Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9886ms). Cost: $0.
-[2026-09-11T08:15:12.113Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9776ms). Cost: $0.
-[2026-09-11T08:30:12.038Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9840ms). Cost: $0.
-[2026-09-11T08:45:11.484Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9773ms). Cost: $0.
-[2026-09-11T09:00:12.493Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9809ms). Cost: $0.
-[2026-09-11T09:15:12.263Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9849ms). Cost: $0.
-[2026-09-11T09:30:11.584Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9721ms). Cost: $0.
-[2026-09-11T09:45:12.391Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9833ms). Cost: $0.
-[2026-09-11T10:00:12.892Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9797ms). Cost: $0.
-[2026-09-11T10:15:12.099Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9819ms). Cost: $0.
-[2026-09-11T10:30:12.960Z] liveness: tier1 expired=5, tier2 checked=40 removed=0 (10154ms). Cost: $0.
-[2026-09-11T10:45:12.138Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10020ms). Cost: $0.
-[2026-09-11T11:00:12.223Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9826ms). Cost: $0.
-[2026-09-11T11:15:12.483Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10393ms). Cost: $0.
-[2026-09-11T11:30:12.277Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9845ms). Cost: $0.
-[2026-09-11T11:45:12.002Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9900ms). Cost: $0.
-[2026-09-11T12:00:11.610Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9786ms). Cost: $0.
-[2026-09-11T12:15:11.601Z] liveness: tier1 expired=161, tier2 checked=40 removed=0 (9859ms). Cost: $0.
-[2026-09-11T12:30:12.366Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9897ms). Cost: $0.
-[2026-09-11T12:45:12.434Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (10090ms). Cost: $0.
-[2026-09-11T13:00:12.071Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9820ms). Cost: $0.
-[2026-09-11T13:15:12.712Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9884ms). Cost: $0.
-[2026-09-11T13:30:12.582Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9798ms). Cost: $0.
-[2026-09-11T13:45:12.578Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9837ms). Cost: $0.
-[2026-09-11T14:00:12.622Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9809ms). Cost: $0.
-[2026-09-11T14:15:12.208Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9724ms). Cost: $0.
-[2026-09-11T14:30:12.145Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10022ms). Cost: $0.
-[2026-09-11T14:45:11.967Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9870ms). Cost: $0.
-[2026-09-11T15:00:12.727Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9710ms). Cost: $0.
-[2026-09-11T15:15:13.183Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (10089ms). Cost: $0.
-[2026-09-11T15:30:12.633Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9844ms). Cost: $0.
-[2026-09-11T15:45:11.878Z] liveness: tier1 expired=11, tier2 checked=40 removed=0 (9731ms). Cost: $0.
-[2026-09-11T16:00:11.724Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9841ms). Cost: $0.
-[2026-09-11T16:15:11.714Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9745ms). Cost: $0.
-[2026-09-11T16:30:12.215Z] liveness: tier1 expired=4, tier2 checked=40 removed=0 (9792ms). Cost: $0.
-[2026-09-11T16:45:12.679Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9794ms). Cost: $0.
-[2026-09-11T17:00:12.680Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9810ms). Cost: $0.
-[2026-09-11T17:15:12.358Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9866ms). Cost: $0.
-[2026-09-11T17:30:12.489Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9968ms). Cost: $0.
-[2026-09-11T17:45:12.079Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9951ms). Cost: $0.
-[2026-09-11T18:00:13.082Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10227ms). Cost: $0.
-[2026-09-11T18:15:12.144Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9911ms). Cost: $0.
-[2026-09-11T18:30:12.020Z] liveness: tier1 expired=7, tier2 checked=40 removed=0 (9780ms). Cost: $0.
-[2026-09-11T18:45:11.969Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (9791ms). Cost: $0.
-[2026-09-11T19:00:13.117Z] liveness: tier1 expired=3, tier2 checked=40 removed=0 (9773ms). Cost: $0.
-[2026-09-11T19:15:12.450Z] liveness: tier1 expired=0, tier2 checked=40 removed=0 (10044ms). Cost: $0.
-[2026-09-11T19:30:11.948Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9859ms). Cost: $0.
-[2026-09-11T19:45:11.750Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (10016ms). Cost: $0.
-[2026-09-11T20:00:12.918Z] liveness: tier1 expired=9, tier2 checked=40 removed=0 (9760ms). Cost: $0.
-[2026-09-11T20:15:12.155Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9735ms). Cost: $0.
-[2026-09-11T20:30:12.331Z] liveness: tier1 expired=2, tier2 checked=40 removed=0 (9815ms). Cost: $0.
-[2026-09-11T20:45:12.176Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9724ms). Cost: $0.
-[2026-09-11T21:00:12.048Z] liveness: tier1 expired=6, tier2 checked=40 removed=0 (9739ms). Cost: $0.
-[2026-09-11T21:15:12.769Z] liveness: tier1 expired=1, tier2 checked=40 removed=0 (9755ms). Cost: $0.
diff --git a/govarbitrage/logs/newsletter-digest.err.log b/govarbitrage/logs/newsletter-digest.err.log
deleted file mode 100644
index e69de29..0000000
diff --git a/govarbitrage/logs/newsletter-digest.out.log b/govarbitrage/logs/newsletter-digest.out.log
deleted file mode 100644
index 77016dc..0000000
--- a/govarbitrage/logs/newsletter-digest.out.log
+++ /dev/null
@@ -1,28 +0,0 @@
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=1 sent=1 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
-[newsletter-digest] mode=live subscribers=0 sent=0 errors=0 deals=0
diff --git a/govarbitrage/next.config.ts b/govarbitrage/next.config.ts
deleted file mode 100644
index 00e5e73..0000000
--- a/govarbitrage/next.config.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import type { NextConfig } from "next";
-import { fileURLToPath } from "node:url";
-
-const nextConfig: NextConfig = {
- // Pin the workspace root (a stray parent lockfile confuses Turbopack's inference).
- turbopack: { root: fileURLToPath(new URL(".", import.meta.url)) },
- // Prisma 7 client is generated into node_modules; keep it external to the
- // server bundle so the query engine binary resolves at runtime.
- serverExternalPackages: ["@prisma/client", "bullmq", "ioredis"],
- images: {
- remotePatterns: [
- { protocol: "https", hostname: "**" },
- { protocol: "http", hostname: "**" },
- ],
- },
-};
-
-export default nextConfig;
diff --git a/govarbitrage/package-lock.json b/govarbitrage/package-lock.json
deleted file mode 100644
index 6497e70..0000000
--- a/govarbitrage/package-lock.json
+++ /dev/null
@@ -1,9133 +0,0 @@
-{
- "name": "govarbitrage",
- "version": "0.5.1",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "govarbitrage",
- "version": "0.5.1",
- "dependencies": {
- "@prisma/client": "6.19.3",
- "@tanstack/react-table": "8.21.3",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "csv-parse": "^5.6.0",
- "jose": "^6.2.3",
- "lucide-react": "^0.469.0",
- "next": "16.2.10",
- "react": "19.2.7",
- "react-dom": "19.2.7",
- "stripe": "^22.3.1",
- "tailwind-merge": "^2.6.0",
- "zod": "^3.24.1"
- },
- "devDependencies": {
- "@eslint/eslintrc": "^3.3.5",
- "@playwright/test": "^1.49.1",
- "@tailwindcss/postcss": "^4.0.0",
- "@types/node": "^22.10.5",
- "@types/react": "^19",
- "@types/react-dom": "^19",
- "@vitejs/plugin-react": "^4.3.4",
- "eslint": "^9.18.0",
- "eslint-config-next": "16.2.10",
- "postcss": "^8.4.49",
- "prisma": "6.19.3",
- "tailwindcss": "^4.0.0",
- "tsx": "^4.19.2",
- "typescript": "^5.7.3",
- "vitest": "4.1.10"
- },
- "optionalDependencies": {
- "bullmq": "5.80.0",
- "ioredis": "^5.4.2"
- }
- },
- "node_modules/@alloc/quick-lru": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
- "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
- "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.29.7",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.1.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
- "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
- "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.29.7",
- "@babel/generator": "^7.29.7",
- "@babel/helper-compilation-targets": "^7.29.7",
- "@babel/helper-module-transforms": "^7.29.7",
- "@babel/helpers": "^7.29.7",
- "@babel/parser": "^7.29.7",
- "@babel/template": "^7.29.7",
- "@babel/traverse": "^7.29.7",
- "@babel/types": "^7.29.7",
- "@jridgewell/remapping": "^2.3.5",
- "convert-source-map": "^2.0.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/generator": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz",
- "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.29.7",
- "@babel/types": "^7.29.7",
- "@jridgewell/gen-mapping": "^0.3.12",
- "@jridgewell/trace-mapping": "^0.3.28",
- "jsesc": "^3.0.2"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
- "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.29.7",
- "@babel/helper-validator-option": "^7.29.7",
- "browserslist": "^4.24.0",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-globals": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
- "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
- "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
- "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.29.7",
- "@babel/helper-validator-identifier": "^7.29.7",
- "@babel/traverse": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
- "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
- "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
- "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
- "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
- "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz",
- "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.29.7"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-self": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz",
- "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-source": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz",
- "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
- "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.29.7",
- "@babel/parser": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz",
- "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.29.7",
- "@babel/generator": "^7.29.7",
- "@babel/helper-globals": "^7.29.7",
- "@babel/parser": "^7.29.7",
- "@babel/template": "^7.29.7",
- "@babel/types": "^7.29.7",
- "debug": "^4.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz",
- "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-string-parser": "^7.29.7",
- "@babel/helper-validator-identifier": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@emnapi/core": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
- "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/wasi-threads": "1.2.1",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@emnapi/runtime": {
- "version": "1.11.2",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz",
- "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@emnapi/wasi-threads": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
- "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz",
- "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz",
- "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz",
- "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz",
- "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz",
- "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz",
- "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz",
- "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz",
- "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz",
- "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz",
- "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz",
- "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz",
- "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz",
- "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz",
- "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz",
- "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz",
- "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz",
- "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz",
- "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz",
- "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz",
- "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz",
- "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openharmony-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz",
- "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz",
- "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz",
- "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz",
- "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz",
- "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
- "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.2",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
- "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/config-array": {
- "version": "0.21.2",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
- "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/object-schema": "^2.1.7",
- "debug": "^4.3.1",
- "minimatch": "^3.1.5"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/config-helpers": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
- "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^0.17.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/core": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
- "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
- "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^6.14.0",
- "debug": "^4.3.2",
- "espree": "^10.0.1",
- "globals": "^14.0.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.1",
- "minimatch": "^3.1.5",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/js": {
- "version": "9.39.4",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
- "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- }
- },
- "node_modules/@eslint/object-schema": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
- "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/plugin-kit": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
- "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^0.17.0",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@humanfs/core": {
- "version": "0.19.2",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
- "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/types": "^0.15.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/node": {
- "version": "0.16.8",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
- "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/core": "^0.19.2",
- "@humanfs/types": "^0.15.0",
- "@humanwhocodes/retry": "^0.4.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/types": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
- "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/retry": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
- "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@img/colour": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
- "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@img/sharp-darwin-arm64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
- "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-darwin-arm64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-darwin-x64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
- "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-darwin-x64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-libvips-darwin-arm64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
- "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
- "cpu": [
- "arm64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "darwin"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-darwin-x64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
- "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
- "cpu": [
- "x64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "darwin"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-arm": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
- "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
- "cpu": [
- "arm"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-arm64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
- "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
- "cpu": [
- "arm64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-ppc64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
- "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
- "cpu": [
- "ppc64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-riscv64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
- "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
- "cpu": [
- "riscv64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-s390x": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
- "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
- "cpu": [
- "s390x"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-x64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
- "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
- "cpu": [
- "x64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
- "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
- "cpu": [
- "arm64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linuxmusl-x64": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
- "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
- "cpu": [
- "x64"
- ],
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-linux-arm": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
- "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
- "cpu": [
- "arm"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-arm": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linux-arm64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
- "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-arm64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linux-ppc64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
- "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
- "cpu": [
- "ppc64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-ppc64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linux-riscv64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
- "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
- "cpu": [
- "riscv64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-riscv64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linux-s390x": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
- "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
- "cpu": [
- "s390x"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-s390x": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linux-x64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
- "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-x64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linuxmusl-arm64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
- "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-linuxmusl-x64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
- "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
- }
- },
- "node_modules/@img/sharp-wasm32": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
- "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
- "cpu": [
- "wasm32"
- ],
- "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/runtime": "^1.7.0"
- },
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-win32-arm64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
- "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0 AND LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-win32-ia32": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
- "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
- "cpu": [
- "ia32"
- ],
- "license": "Apache-2.0 AND LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-win32-x64": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
- "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0 AND LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@ioredis/commands": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.10.0.tgz",
- "integrity": "sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/remapping": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
- "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.31",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz",
- "integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz",
- "integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz",
- "integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==",
- "cpu": [
- "arm"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz",
- "integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz",
- "integrity": "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz",
- "integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@napi-rs/wasm-runtime": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz",
- "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@tybys/wasm-util": "^0.10.3"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Brooooooklyn"
- },
- "peerDependencies": {
- "@emnapi/core": "^1.7.1",
- "@emnapi/runtime": "^1.7.1"
- }
- },
- "node_modules/@next/env": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.10.tgz",
- "integrity": "sha512-zLPxg9M0MEHmygpj5OuxjQ+vHMiy/K7cSp74G8ecYolmgUWw0RwN02tF56npup/+qaI8JB97hQgS/r2Hb6QwVA==",
- "license": "MIT"
- },
- "node_modules/@next/eslint-plugin-next": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.10.tgz",
- "integrity": "sha512-Gs8D2m21VnJeFo9qvYIIqJH94frWerWYu41BprU1pLtRVF7PCQNLiFZZ3fG+iPuj3K83Cwv/rt+msLOy8Qgu3Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-glob": "3.3.1"
- }
- },
- "node_modules/@next/swc-darwin-arm64": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.10.tgz",
- "integrity": "sha512-v9IdJCa0H0mbo+8z5zwUpOk1Vj7RjkcI5uNYf5Ws1y6szf/p3Mzl9hLaST8SCt6L9h8NGnruZcd2+o0NTNwDhA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-darwin-x64": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.10.tgz",
- "integrity": "sha512-17IS0jJRViROGmA9uGdNR8VPJpfbnaVG7E9qhso5jDLkmyd0lSDORWxbcKINzcFqzZqGwGtMSnrFRxBpuUYjLQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-gnu": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.10.tgz",
- "integrity": "sha512-GRQRsRtuciNJvB54AvvuQTiq0oZtFwa1owQqtZD8wwnGpM2L39MV22kpI72YSXLKIyY40LC66EiLFv4PiicXxg==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-musl": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.10.tgz",
- "integrity": "sha512-zkN9MQYS7UQBro+FnISUq1itaQjXI9xqISzuQ+2bc921NcJ1x4yPCqrn77tVN6/dOOXaaWVX3k6/bR07pPwK+A==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-gnu": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.10.tgz",
- "integrity": "sha512-iCVJnwvrPYECvA6WM/7+oo+OiTvedIKLxtCLAZP4xZR3nXa1zmzZyLPbYCmWvpd4CvMYF1EMTafd0ii3DygLvA==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-musl": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.10.tgz",
- "integrity": "sha512-ov2g4H0dHY9bPoOU83m91hWT7Iq5qy13bUnyyshLU3HGR1Ownn0X9QpmDPc5iIUaahTp7f7LeGAhV4DSFtackw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-arm64-msvc": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.10.tgz",
- "integrity": "sha512-DwAnhLX76HQiFFQNgWlcK+JzlnD1rZ+UK/WY0ZMI/deXpvgnesjNYrqcfo1JzBuz4Kf7o3brIBL0glI1junatA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-x64-msvc": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.10.tgz",
- "integrity": "sha512-0JXq3b85Jk9Jg4ntLUbXSPvoDw3gpZou7twuKdoFG2jOw635v7+IiXfTaa0TxVMyx78pUjnrVYwLgjKfX4e6/A==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nolyfill/is-core-module": {
- "version": "1.0.39",
- "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
- "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.4.0"
- }
- },
- "node_modules/@playwright/test": {
- "version": "1.61.1",
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz",
- "integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==",
- "devOptional": true,
- "license": "Apache-2.0",
- "dependencies": {
- "playwright": "1.61.1"
- },
- "bin": {
- "playwright": "cli.js"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@prisma/client": {
- "version": "6.19.3",
- "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.3.tgz",
- "integrity": "sha512-mKq3jQFhjvko5LTJFHGilsuQs+W+T3Gm451NzuTDGQxwCzwXHYnIu2zGkRoW+Exq3Rob7yp2MfzSrdIiZVhrBg==",
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "peerDependencies": {
- "prisma": "*",
- "typescript": ">=5.1.0"
- },
- "peerDependenciesMeta": {
- "prisma": {
- "optional": true
- },
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@prisma/config": {
- "version": "6.19.3",
- "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.3.tgz",
- "integrity": "sha512-CBPT44BjlQxEt8kiMEauji2WHTDoVBOKl7UlewXmUgBPnr/oPRZC3psci5chJnYmH0ivEIog2OU9PGWoki3DLQ==",
- "devOptional": true,
- "license": "Apache-2.0",
- "dependencies": {
- "c12": "3.1.0",
- "deepmerge-ts": "7.1.5",
- "effect": "3.21.0",
- "empathic": "2.0.0"
- }
- },
- "node_modules/@prisma/debug": {
- "version": "6.19.3",
- "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.3.tgz",
- "integrity": "sha512-ljkJ+SgpXNktLG0Q/n4JGYCkKf0f8oYLyjImS2I8e2q2WCfdRRtWER062ZV/ixaNP2M2VKlWXVJiGzZaUgbKZw==",
- "devOptional": true,
- "license": "Apache-2.0"
- },
- "node_modules/@prisma/engines": {
- "version": "6.19.3",
- "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.3.tgz",
- "integrity": "sha512-RSYxtlYFl5pJ8ZePgMv0lZ9IzVCOdTPOegrs2qcbAEFrBI1G33h6wyC9kjQvo0DnYEhEVY0X4LsuFHXLKQk88g==",
- "devOptional": true,
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@prisma/debug": "6.19.3",
- "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
- "@prisma/fetch-engine": "6.19.3",
- "@prisma/get-platform": "6.19.3"
- }
- },
- "node_modules/@prisma/engines-version": {
- "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
- "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz",
- "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==",
- "devOptional": true,
- "license": "Apache-2.0"
- },
- "node_modules/@prisma/fetch-engine": {
- "version": "6.19.3",
- "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.3.tgz",
- "integrity": "sha512-tKtl/qco9Nt7LU5iKhpultD8O4vMCZcU2CHjNTnRrL1QvSUr5W/GcyFPjNL87GtRrwBc7ubXXD9xy4EvLvt8JA==",
- "devOptional": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@prisma/debug": "6.19.3",
- "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
- "@prisma/get-platform": "6.19.3"
- }
- },
- "node_modules/@prisma/get-platform": {
- "version": "6.19.3",
- "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.3.tgz",
- "integrity": "sha512-xFj1VcJ1N3MKooOQAGO0W5tsd0W2QzIvW7DD7c/8H14Zmp4jseeWAITm+w2LLoLrlhoHdPPh0NMZ8mfL6puoHA==",
- "devOptional": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@prisma/debug": "6.19.3"
- }
- },
- "node_modules/@rolldown/pluginutils": {
- "version": "1.0.0-beta.27",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
- "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz",
- "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz",
- "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz",
- "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz",
- "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz",
- "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz",
- "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz",
- "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz",
- "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz",
- "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz",
- "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz",
- "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-musl": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz",
- "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz",
- "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-musl": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz",
- "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz",
- "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz",
- "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz",
- "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz",
- "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz",
- "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-openbsd-x64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz",
- "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ]
- },
- "node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz",
- "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz",
- "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz",
- "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-gnu": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz",
- "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz",
- "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rtsao/scc": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
- "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@standard-schema/spec": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
- "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/@swc/helpers": {
- "version": "0.5.15",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
- "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
- "license": "Apache-2.0",
- "dependencies": {
- "tslib": "^2.8.0"
- }
- },
- "node_modules/@tailwindcss/node": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz",
- "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/remapping": "^2.3.5",
- "enhanced-resolve": "5.21.6",
- "jiti": "^2.7.0",
- "lightningcss": "1.32.0",
- "magic-string": "^0.30.21",
- "source-map-js": "^1.2.1",
- "tailwindcss": "4.3.2"
- }
- },
- "node_modules/@tailwindcss/oxide": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz",
- "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 20"
- },
- "optionalDependencies": {
- "@tailwindcss/oxide-android-arm64": "4.3.2",
- "@tailwindcss/oxide-darwin-arm64": "4.3.2",
- "@tailwindcss/oxide-darwin-x64": "4.3.2",
- "@tailwindcss/oxide-freebsd-x64": "4.3.2",
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2",
- "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2",
- "@tailwindcss/oxide-linux-arm64-musl": "4.3.2",
- "@tailwindcss/oxide-linux-x64-gnu": "4.3.2",
- "@tailwindcss/oxide-linux-x64-musl": "4.3.2",
- "@tailwindcss/oxide-wasm32-wasi": "4.3.2",
- "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2",
- "@tailwindcss/oxide-win32-x64-msvc": "4.3.2"
- }
- },
- "node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz",
- "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz",
- "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz",
- "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz",
- "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz",
- "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz",
- "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz",
- "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz",
- "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz",
- "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz",
- "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==",
- "bundleDependencies": [
- "@napi-rs/wasm-runtime",
- "@emnapi/core",
- "@emnapi/runtime",
- "@tybys/wasm-util",
- "@emnapi/wasi-threads",
- "tslib"
- ],
- "cpu": [
- "wasm32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/core": "^1.11.1",
- "@emnapi/runtime": "^1.11.1",
- "@emnapi/wasi-threads": "^1.2.2",
- "@napi-rs/wasm-runtime": "^1.1.4",
- "@tybys/wasm-util": "^0.10.2",
- "tslib": "^2.8.1"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz",
- "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz",
- "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/postcss": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.2.tgz",
- "integrity": "sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@alloc/quick-lru": "^5.2.0",
- "@tailwindcss/node": "4.3.2",
- "@tailwindcss/oxide": "4.3.2",
- "postcss": "^8.5.15",
- "tailwindcss": "4.3.2"
- }
- },
- "node_modules/@tanstack/react-table": {
- "version": "8.21.3",
- "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz",
- "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==",
- "license": "MIT",
- "dependencies": {
- "@tanstack/table-core": "8.21.3"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/tannerlinsley"
- },
- "peerDependencies": {
- "react": ">=16.8",
- "react-dom": ">=16.8"
- }
- },
- "node_modules/@tanstack/table-core": {
- "version": "8.21.3",
- "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz",
- "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/tannerlinsley"
- }
- },
- "node_modules/@tybys/wasm-util": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
- "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "node_modules/@types/babel__generator": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
- "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__traverse": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
- "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.28.2"
- }
- },
- "node_modules/@types/chai": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
- "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/deep-eql": "*",
- "assertion-error": "^2.0.1"
- }
- },
- "node_modules/@types/deep-eql": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
- "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/estree": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
- "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/json5": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "22.20.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz",
- "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~6.21.0"
- }
- },
- "node_modules/@types/react": {
- "version": "19.2.17",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz",
- "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "csstype": "^3.2.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "19.2.3",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
- "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "^19.2.0"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.63.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.63.0.tgz",
- "integrity": "sha512-rvwSgqT+DHpWdzfSzPatRLm02a0GlESt++9iy3hLCDY4BgkaLcl8LBi9Yh7XGFBpwcBE/K3024QuXWTpbz4FfQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/regexpp": "^4.12.2",
- "@typescript-eslint/scope-manager": "8.63.0",
- "@typescript-eslint/type-utils": "8.63.0",
- "@typescript-eslint/utils": "8.63.0",
- "@typescript-eslint/visitor-keys": "8.63.0",
- "ignore": "^7.0.5",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^8.63.0",
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "8.63.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.63.0.tgz",
- "integrity": "sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.63.0",
- "@typescript-eslint/types": "8.63.0",
- "@typescript-eslint/typescript-estree": "8.63.0",
- "@typescript-eslint/visitor-keys": "8.63.0",
- "debug": "^4.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/project-service": {
- "version": "8.63.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.63.0.tgz",
- "integrity": "sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.63.0",
- "@typescript-eslint/types": "^8.63.0",
- "debug": "^4.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.63.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.63.0.tgz",
- "integrity": "sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.63.0",
- "@typescript-eslint/visitor-keys": "8.63.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.63.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.63.0.tgz",
- "integrity": "sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "8.63.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.63.0.tgz",
- "integrity": "sha512-Nzzh/OGxVCOjObjaj1CQF2RUasyYy2Jfuh+zZ3PjLzG2fYRriAiZLib9UKtO+CpQAS3YHiAS+ckZDclwqI1TPA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.63.0",
- "@typescript-eslint/typescript-estree": "8.63.0",
- "@typescript-eslint/utils": "8.63.0",
- "debug": "^4.4.3",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "8.63.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.63.0.tgz",
- "integrity": "sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.63.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.63.0.tgz",
- "integrity": "sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/project-service": "8.63.0",
- "@typescript-eslint/tsconfig-utils": "8.63.0",
- "@typescript-eslint/types": "8.63.0",
- "@typescript-eslint/visitor-keys": "8.63.0",
- "debug": "^4.4.3",
- "minimatch": "^10.2.2",
- "semver": "^7.7.3",
- "tinyglobby": "^0.2.15",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
- "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "18 || 20 || >=22"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz",
- "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^4.0.2"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
- "version": "10.2.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
- "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.5"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
- "version": "7.8.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
- "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "8.63.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.63.0.tgz",
- "integrity": "sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.9.1",
- "@typescript-eslint/scope-manager": "8.63.0",
- "@typescript-eslint/types": "8.63.0",
- "@typescript-eslint/typescript-estree": "8.63.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.63.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.63.0.tgz",
- "integrity": "sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.63.0",
- "eslint-visitor-keys": "^5.0.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
- "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@unrs/resolver-binding-android-arm-eabi": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz",
- "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@unrs/resolver-binding-android-arm64": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz",
- "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@unrs/resolver-binding-darwin-arm64": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz",
- "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@unrs/resolver-binding-darwin-x64": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz",
- "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@unrs/resolver-binding-freebsd-x64": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz",
- "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz",
- "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz",
- "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz",
- "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz",
- "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-loong64-gnu": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz",
- "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-loong64-musl": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz",
- "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz",
- "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz",
- "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz",
- "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz",
- "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz",
- "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-linux-x64-musl": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz",
- "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@unrs/resolver-binding-openharmony-arm64": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz",
- "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ]
- },
- "node_modules/@unrs/resolver-binding-wasm32-wasi": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz",
- "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==",
- "cpu": [
- "wasm32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/core": "1.10.0",
- "@emnapi/runtime": "1.10.0",
- "@napi-rs/wasm-runtime": "^1.1.4"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@emnapi/runtime": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
- "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz",
- "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz",
- "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz",
- "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@vitejs/plugin-react": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
- "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.28.0",
- "@babel/plugin-transform-react-jsx-self": "^7.27.1",
- "@babel/plugin-transform-react-jsx-source": "^7.27.1",
- "@rolldown/pluginutils": "1.0.0-beta.27",
- "@types/babel__core": "^7.20.5",
- "react-refresh": "^0.17.0"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "peerDependencies": {
- "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
- }
- },
- "node_modules/@vitest/expect": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz",
- "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@standard-schema/spec": "^1.1.0",
- "@types/chai": "^5.2.2",
- "@vitest/spy": "4.1.10",
- "@vitest/utils": "4.1.10",
- "chai": "^6.2.2",
- "tinyrainbow": "^3.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/mocker": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz",
- "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vitest/spy": "4.1.10",
- "estree-walker": "^3.0.3",
- "magic-string": "^0.30.21"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- },
- "peerDependencies": {
- "msw": "^2.4.9",
- "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "msw": {
- "optional": true
- },
- "vite": {
- "optional": true
- }
- }
- },
- "node_modules/@vitest/pretty-format": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz",
- "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tinyrainbow": "^3.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/runner": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz",
- "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vitest/utils": "4.1.10",
- "pathe": "^2.0.3"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/snapshot": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz",
- "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vitest/pretty-format": "4.1.10",
- "@vitest/utils": "4.1.10",
- "magic-string": "^0.30.21",
- "pathe": "^2.0.3"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/spy": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz",
- "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/utils": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz",
- "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vitest/pretty-format": "4.1.10",
- "convert-source-map": "^2.0.0",
- "tinyrainbow": "^3.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/acorn": {
- "version": "8.17.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
- "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
- "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
- },
- "node_modules/aria-query": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
- "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/array-buffer-byte-length": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
- "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "is-array-buffer": "^3.0.5"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-includes": {
- "version": "3.1.9",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
- "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.24.0",
- "es-object-atoms": "^1.1.1",
- "get-intrinsic": "^1.3.0",
- "is-string": "^1.1.1",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.findlast": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
- "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.findlastindex": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
- "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.9",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "es-shim-unscopables": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flat": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
- "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
- "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.tosorted": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
- "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.3",
- "es-errors": "^1.3.0",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
- "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "is-array-buffer": "^3.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/assertion-error": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
- "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/ast-types-flow": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
- "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/async-function": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
- "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/available-typed-arrays": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
- "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "possible-typed-array-names": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/axe-core": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.12.1.tgz",
- "integrity": "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==",
- "dev": true,
- "license": "MPL-2.0",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/axobject-query": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
- "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/baseline-browser-mapping": {
- "version": "2.10.42",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz",
- "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==",
- "license": "Apache-2.0",
- "bin": {
- "baseline-browser-mapping": "dist/cli.cjs"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.16",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz",
- "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.28.5",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz",
- "integrity": "sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "baseline-browser-mapping": "^2.10.42",
- "caniuse-lite": "^1.0.30001800",
- "electron-to-chromium": "^1.5.387",
- "node-releases": "^2.0.50",
- "update-browserslist-db": "^1.2.3"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/bullmq": {
- "version": "5.80.0",
- "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.80.0.tgz",
- "integrity": "sha512-xrCjINZcW6P4irrGZrOXPizzBbvgaP01u2oXGmqY1O5fll56z7OOf9vdnTzK7X4P34vo6ayMPQjyhJN+KwAMWA==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "cron-parser": "4.9.0",
- "ioredis": "5.10.1",
- "msgpackr": "2.0.4",
- "node-abort-controller": "3.1.1",
- "semver": "7.8.5",
- "tslib": "2.8.1"
- },
- "engines": {
- "node": ">=12.22.0"
- },
- "peerDependencies": {
- "redis": ">=5.0.0"
- },
- "peerDependenciesMeta": {
- "redis": {
- "optional": true
- }
- }
- },
- "node_modules/bullmq/node_modules/@ioredis/commands": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.1.tgz",
- "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/bullmq/node_modules/ioredis": {
- "version": "5.10.1",
- "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.10.1.tgz",
- "integrity": "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ioredis/commands": "1.5.1",
- "cluster-key-slot": "^1.1.0",
- "debug": "^4.3.4",
- "denque": "^2.1.0",
- "lodash.defaults": "^4.2.0",
- "lodash.isarguments": "^3.1.0",
- "redis-errors": "^1.2.0",
- "redis-parser": "^3.0.0",
- "standard-as-callback": "^2.1.0"
- },
- "engines": {
- "node": ">=12.22.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/ioredis"
- }
- },
- "node_modules/bullmq/node_modules/semver": {
- "version": "7.8.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
- "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
- "license": "ISC",
- "optional": true,
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/c12": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz",
- "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "chokidar": "^4.0.3",
- "confbox": "^0.2.2",
- "defu": "^6.1.4",
- "dotenv": "^16.6.1",
- "exsolve": "^1.0.7",
- "giget": "^2.0.0",
- "jiti": "^2.4.2",
- "ohash": "^2.0.11",
- "pathe": "^2.0.3",
- "perfect-debounce": "^1.0.0",
- "pkg-types": "^2.2.0",
- "rc9": "^2.1.2"
- },
- "peerDependencies": {
- "magicast": "^0.3.5"
- },
- "peerDependenciesMeta": {
- "magicast": {
- "optional": true
- }
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
- "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "get-intrinsic": "^1.3.0",
- "set-function-length": "^1.2.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/call-bind-apply-helpers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/call-bound": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
- "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "get-intrinsic": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001803",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz",
- "integrity": "sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/chai": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
- "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/chokidar": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
- "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "readdirp": "^4.0.1"
- },
- "engines": {
- "node": ">= 14.16.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/citty": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
- "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "consola": "^3.2.3"
- }
- },
- "node_modules/class-variance-authority": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
- "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
- "license": "Apache-2.0",
- "dependencies": {
- "clsx": "^2.1.1"
- },
- "funding": {
- "url": "https://polar.sh/cva"
- }
- },
- "node_modules/client-only": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
- "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
- "license": "MIT"
- },
- "node_modules/clsx": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/cluster-key-slot": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz",
- "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==",
- "license": "Apache-2.0",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/confbox": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz",
- "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/consola": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
- "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": "^14.18.0 || >=16.10.0"
- }
- },
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/cron-parser": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz",
- "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "luxon": "^3.2.1"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/csstype": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
- "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/csv-parse": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.6.0.tgz",
- "integrity": "sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==",
- "license": "MIT"
- },
- "node_modules/damerau-levenshtein": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
- "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/data-view-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
- "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/data-view-byte-length": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
- "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/inspect-js"
- }
- },
- "node_modules/data-view-byte-offset": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
- "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/deepmerge-ts": {
- "version": "7.1.5",
- "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz",
- "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==",
- "devOptional": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/defu": {
- "version": "6.1.7",
- "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
- "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/denque": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
- "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
- "license": "Apache-2.0",
- "optional": true,
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/destr": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
- "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/detect-libc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
- "devOptional": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/dotenv": {
- "version": "16.6.1",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
- "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
- "devOptional": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
- }
- },
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/effect": {
- "version": "3.21.0",
- "resolved": "https://registry.npmjs.org/effect/-/effect-3.21.0.tgz",
- "integrity": "sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "@standard-schema/spec": "^1.0.0",
- "fast-check": "^3.23.1"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.389",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz",
- "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/empathic": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz",
- "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/enhanced-resolve": {
- "version": "5.21.6",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz",
- "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.3.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.24.2",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz",
- "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "array-buffer-byte-length": "^1.0.2",
- "arraybuffer.prototype.slice": "^1.0.4",
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "data-view-buffer": "^1.0.2",
- "data-view-byte-length": "^1.0.2",
- "data-view-byte-offset": "^1.0.1",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "es-set-tostringtag": "^2.1.0",
- "es-to-primitive": "^1.3.0",
- "function.prototype.name": "^1.1.8",
- "get-intrinsic": "^1.3.0",
- "get-proto": "^1.0.1",
- "get-symbol-description": "^1.1.0",
- "globalthis": "^1.0.4",
- "gopd": "^1.2.0",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "internal-slot": "^1.1.0",
- "is-array-buffer": "^3.0.5",
- "is-callable": "^1.2.7",
- "is-data-view": "^1.0.2",
- "is-negative-zero": "^2.0.3",
- "is-regex": "^1.2.1",
- "is-set": "^2.0.3",
- "is-shared-array-buffer": "^1.0.4",
- "is-string": "^1.1.1",
- "is-typed-array": "^1.1.15",
- "is-weakref": "^1.1.1",
- "math-intrinsics": "^1.1.0",
- "object-inspect": "^1.13.4",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.7",
- "own-keys": "^1.0.1",
- "regexp.prototype.flags": "^1.5.4",
- "safe-array-concat": "^1.1.3",
- "safe-push-apply": "^1.0.0",
- "safe-regex-test": "^1.1.0",
- "set-proto": "^1.0.0",
- "stop-iteration-iterator": "^1.1.0",
- "string.prototype.trim": "^1.2.10",
- "string.prototype.trimend": "^1.0.9",
- "string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.3",
- "typed-array-byte-length": "^1.0.3",
- "typed-array-byte-offset": "^1.0.4",
- "typed-array-length": "^1.0.7",
- "unbox-primitive": "^1.1.0",
- "which-typed-array": "^1.1.19"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-abstract-get": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz",
- "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.2",
- "is-callable": "^1.2.7",
- "object-inspect": "^1.13.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-iterator-helpers": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.3.tgz",
- "integrity": "sha512-0PuBxFi+4uPanB97iDxCLWuHeYud2FALrw5HFZGtAF38UpJDbDC8frwp2cnDyae692CQ0dou60UwWfhgsa4U/g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.9",
- "call-bound": "^1.0.4",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.24.2",
- "es-errors": "^1.3.0",
- "es-set-tostringtag": "^2.1.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.3.0",
- "globalthis": "^1.0.4",
- "gopd": "^1.2.0",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.2.0",
- "has-symbols": "^1.1.0",
- "internal-slot": "^1.1.0",
- "iterator.prototype": "^1.1.5",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-module-lexer": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.0.tgz",
- "integrity": "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/es-object-atoms": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
- "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-shim-unscopables": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
- "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-to-primitive": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz",
- "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-abstract-get": "^1.0.0",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "is-callable": "^1.2.7",
- "is-date-object": "^1.1.0",
- "is-symbol": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/esbuild": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz",
- "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.28.1",
- "@esbuild/android-arm": "0.28.1",
- "@esbuild/android-arm64": "0.28.1",
- "@esbuild/android-x64": "0.28.1",
- "@esbuild/darwin-arm64": "0.28.1",
- "@esbuild/darwin-x64": "0.28.1",
- "@esbuild/freebsd-arm64": "0.28.1",
- "@esbuild/freebsd-x64": "0.28.1",
- "@esbuild/linux-arm": "0.28.1",
- "@esbuild/linux-arm64": "0.28.1",
- "@esbuild/linux-ia32": "0.28.1",
- "@esbuild/linux-loong64": "0.28.1",
- "@esbuild/linux-mips64el": "0.28.1",
- "@esbuild/linux-ppc64": "0.28.1",
- "@esbuild/linux-riscv64": "0.28.1",
- "@esbuild/linux-s390x": "0.28.1",
- "@esbuild/linux-x64": "0.28.1",
- "@esbuild/netbsd-arm64": "0.28.1",
- "@esbuild/netbsd-x64": "0.28.1",
- "@esbuild/openbsd-arm64": "0.28.1",
- "@esbuild/openbsd-x64": "0.28.1",
- "@esbuild/openharmony-arm64": "0.28.1",
- "@esbuild/sunos-x64": "0.28.1",
- "@esbuild/win32-arm64": "0.28.1",
- "@esbuild/win32-ia32": "0.28.1",
- "@esbuild/win32-x64": "0.28.1"
- }
- },
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint": {
- "version": "9.39.4",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
- "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.8.0",
- "@eslint-community/regexpp": "^4.12.1",
- "@eslint/config-array": "^0.21.2",
- "@eslint/config-helpers": "^0.4.2",
- "@eslint/core": "^0.17.0",
- "@eslint/eslintrc": "^3.3.5",
- "@eslint/js": "9.39.4",
- "@eslint/plugin-kit": "^0.4.1",
- "@humanfs/node": "^0.16.6",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@humanwhocodes/retry": "^0.4.2",
- "@types/estree": "^1.0.6",
- "ajv": "^6.14.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.6",
- "debug": "^4.3.2",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^8.4.0",
- "eslint-visitor-keys": "^4.2.1",
- "espree": "^10.4.0",
- "esquery": "^1.5.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^8.0.0",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.5",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "jiti": "*"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-config-next": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.10.tgz",
- "integrity": "sha512-HSybLOY0QKf39i4FWUqPN0xWiNDi6A6UqJmZtgDkS3zMqjXTqULvj/sueXx3cdCG0mVG+qH6k5/qdegklH1d1w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@next/eslint-plugin-next": "16.2.10",
- "eslint-import-resolver-node": "^0.3.6",
- "eslint-import-resolver-typescript": "^3.5.2",
- "eslint-plugin-import": "^2.32.0",
- "eslint-plugin-jsx-a11y": "^6.10.0",
- "eslint-plugin-react": "^7.37.0",
- "eslint-plugin-react-hooks": "^7.0.0",
- "globals": "16.4.0",
- "typescript-eslint": "^8.46.0"
- },
- "peerDependencies": {
- "eslint": ">=9.0.0",
- "typescript": ">=3.3.1"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-config-next/node_modules/globals": {
- "version": "16.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz",
- "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.10",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz",
- "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.16.1",
- "resolve": "^2.0.0-next.6"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-import-resolver-typescript": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz",
- "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "@nolyfill/is-core-module": "1.0.39",
- "debug": "^4.4.0",
- "get-tsconfig": "^4.10.0",
- "is-bun-module": "^2.0.0",
- "stable-hash": "^0.0.5",
- "tinyglobby": "^0.2.13",
- "unrs-resolver": "^1.6.2"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint-import-resolver-typescript"
- },
- "peerDependencies": {
- "eslint": "*",
- "eslint-plugin-import": "*",
- "eslint-plugin-import-x": "*"
- },
- "peerDependenciesMeta": {
- "eslint-plugin-import": {
- "optional": true
- },
- "eslint-plugin-import-x": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-module-utils": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz",
- "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^3.2.7"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-module-utils/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import": {
- "version": "2.32.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
- "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@rtsao/scc": "^1.1.0",
- "array-includes": "^3.1.9",
- "array.prototype.findlastindex": "^1.2.6",
- "array.prototype.flat": "^1.3.3",
- "array.prototype.flatmap": "^1.3.3",
- "debug": "^3.2.7",
- "doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.9",
- "eslint-module-utils": "^2.12.1",
- "hasown": "^2.0.2",
- "is-core-module": "^2.16.1",
- "is-glob": "^4.0.3",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.8",
- "object.groupby": "^1.0.3",
- "object.values": "^1.2.1",
- "semver": "^6.3.1",
- "string.prototype.trimend": "^1.0.9",
- "tsconfig-paths": "^3.15.0"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-jsx-a11y": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
- "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "aria-query": "^5.3.2",
- "array-includes": "^3.1.8",
- "array.prototype.flatmap": "^1.3.2",
- "ast-types-flow": "^0.0.8",
- "axe-core": "^4.10.0",
- "axobject-query": "^4.1.0",
- "damerau-levenshtein": "^1.0.8",
- "emoji-regex": "^9.2.2",
- "hasown": "^2.0.2",
- "jsx-ast-utils": "^3.3.5",
- "language-tags": "^1.0.9",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.8",
- "safe-regex-test": "^1.0.3",
- "string.prototype.includes": "^2.0.1"
- },
- "engines": {
- "node": ">=4.0"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
- }
- },
- "node_modules/eslint-plugin-react": {
- "version": "7.37.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
- "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "array-includes": "^3.1.8",
- "array.prototype.findlast": "^1.2.5",
- "array.prototype.flatmap": "^1.3.3",
- "array.prototype.tosorted": "^1.1.4",
- "doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.2.1",
- "estraverse": "^5.3.0",
- "hasown": "^2.0.2",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.9",
- "object.fromentries": "^2.0.8",
- "object.values": "^1.2.1",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.5",
- "semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.12",
- "string.prototype.repeat": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
- }
- },
- "node_modules/eslint-plugin-react-hooks": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz",
- "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.24.4",
- "@babel/parser": "^7.24.4",
- "hermes-parser": "^0.25.1",
- "zod": "^3.25.0 || ^4.0.0",
- "zod-validation-error": "^3.5.0 || ^4.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0"
- }
- },
- "node_modules/eslint-scope": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
- "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/espree": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
- "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "acorn": "^8.15.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/esquery": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
- "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/expect-type": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz",
- "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/exsolve": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz",
- "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/fast-check": {
- "version": "3.23.2",
- "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz",
- "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==",
- "devOptional": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/dubzzz"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fast-check"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "pure-rand": "^6.1.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-glob": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
- "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fastq": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
- "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flat-cache": "^4.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/flatted": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
- "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/for-each": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
- "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-callable": "^1.2.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/function.prototype.name": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz",
- "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.9",
- "call-bound": "^1.0.4",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.2",
- "hasown": "^2.0.4",
- "is-callable": "^1.2.7",
- "is-document.all": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/generator-function": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
- "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/get-symbol-description": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
- "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-tsconfig": {
- "version": "4.14.0",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz",
- "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "resolve-pkg-maps": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
- }
- },
- "node_modules/giget": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz",
- "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "citty": "^0.1.6",
- "consola": "^3.4.0",
- "defu": "^6.1.4",
- "node-fetch-native": "^1.6.6",
- "nypm": "^0.6.0",
- "pathe": "^2.0.3"
- },
- "bin": {
- "giget": "dist/cli.mjs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/globalthis": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
- "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-properties": "^1.2.1",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/has-bigints": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
- "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
- "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
- "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/hermes-estree": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
- "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/hermes-parser": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
- "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hermes-estree": "0.25.1"
- }
- },
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
- "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/internal-slot": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
- "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "hasown": "^2.0.2",
- "side-channel": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/ioredis": {
- "version": "5.11.1",
- "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.11.1.tgz",
- "integrity": "sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ioredis/commands": "1.10.0",
- "cluster-key-slot": "1.1.1",
- "debug": "4.4.3",
- "denque": "2.1.0",
- "redis-errors": "1.2.0",
- "redis-parser": "3.0.0",
- "standard-as-callback": "2.1.0"
- },
- "engines": {
- "node": ">=12.22.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/ioredis"
- }
- },
- "node_modules/is-array-buffer": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
- "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "get-intrinsic": "^1.2.6"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-async-function": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
- "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "async-function": "^1.0.0",
- "call-bound": "^1.0.3",
- "get-proto": "^1.0.1",
- "has-tostringtag": "^1.0.2",
- "safe-regex-test": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-bigint": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
- "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-bigints": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-boolean-object": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
- "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-bun-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
- "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "semver": "^7.7.1"
- }
- },
- "node_modules/is-bun-module/node_modules/semver": {
- "version": "7.8.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
- "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.16.2",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
- "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-data-view": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
- "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "get-intrinsic": "^1.2.6",
- "is-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-date-object": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
- "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-document.all": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz",
- "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-finalizationregistry": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
- "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-generator-function": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
- "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.4",
- "generator-function": "^2.0.0",
- "get-proto": "^1.0.1",
- "has-tostringtag": "^1.0.2",
- "safe-regex-test": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
- "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
- "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-number-object": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
- "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-regex": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
- "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "gopd": "^1.2.0",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-set": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
- "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
- "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-string": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
- "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-symbol": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
- "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "has-symbols": "^1.1.0",
- "safe-regex-test": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
- "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "which-typed-array": "^1.1.16"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakmap": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
- "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakref": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
- "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakset": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
- "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "get-intrinsic": "^1.2.6"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/iterator.prototype": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
- "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.6",
- "get-proto": "^1.0.0",
- "has-symbols": "^1.1.0",
- "set-function-name": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/jiti": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
- "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
- "devOptional": true,
- "license": "MIT",
- "bin": {
- "jiti": "lib/jiti-cli.mjs"
- }
- },
- "node_modules/jose": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz",
- "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/panva"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/js-yaml": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
- "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/puzrin"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/nodeca"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsesc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/jsx-ast-utils": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
- "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flat": "^1.3.1",
- "object.assign": "^4.1.4",
- "object.values": "^1.1.6"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/language-subtag-registry": {
- "version": "0.3.23",
- "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
- "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
- "dev": true,
- "license": "CC0-1.0"
- },
- "node_modules/language-tags": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
- "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "language-subtag-registry": "^0.3.20"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lightningcss": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
- "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "detect-libc": "^2.0.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "lightningcss-android-arm64": "1.32.0",
- "lightningcss-darwin-arm64": "1.32.0",
- "lightningcss-darwin-x64": "1.32.0",
- "lightningcss-freebsd-x64": "1.32.0",
- "lightningcss-linux-arm-gnueabihf": "1.32.0",
- "lightningcss-linux-arm64-gnu": "1.32.0",
- "lightningcss-linux-arm64-musl": "1.32.0",
- "lightningcss-linux-x64-gnu": "1.32.0",
- "lightningcss-linux-x64-musl": "1.32.0",
- "lightningcss-win32-arm64-msvc": "1.32.0",
- "lightningcss-win32-x64-msvc": "1.32.0"
- }
- },
- "node_modules/lightningcss-android-arm64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
- "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-arm64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
- "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-x64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
- "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-freebsd-x64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
- "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
- "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
- "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
- "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
- "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-musl": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
- "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
- "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
- "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash.defaults": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
- "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/lodash.isarguments": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
- "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/lucide-react": {
- "version": "0.469.0",
- "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.469.0.tgz",
- "integrity": "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw==",
- "license": "ISC",
- "peerDependencies": {
- "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/luxon": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz",
- "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==",
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/magic-string": {
- "version": "0.30.21",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
- "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.5"
- }
- },
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
- "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/msgpackr": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-2.0.4.tgz",
- "integrity": "sha512-o1C5KRmuRt+apqMr1HuGSqWStZoRBUpEsCsl15uM9VdAF1qHLtvMOU2En747EnTyEl6c4pzPewRMFF31s1CNbA==",
- "license": "MIT",
- "optional": true,
- "optionalDependencies": {
- "msgpackr-extract": "^3.0.4"
- }
- },
- "node_modules/msgpackr-extract": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz",
- "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==",
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "node-gyp-build-optional-packages": "5.2.2"
- },
- "bin": {
- "download-msgpackr-prebuilds": "bin/download-prebuilds.js"
- },
- "optionalDependencies": {
- "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4",
- "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4",
- "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4",
- "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4",
- "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4",
- "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.15",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz",
- "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/napi-postinstall": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz",
- "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "napi-postinstall": "lib/cli.js"
- },
- "engines": {
- "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/napi-postinstall"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/next": {
- "version": "16.2.10",
- "resolved": "https://registry.npmjs.org/next/-/next-16.2.10.tgz",
- "integrity": "sha512-2som5AVXb3kE6Yjine3/mNbBayYF58eguBWIVVUdr1y/L426xyVEgYxgBG+1QC34P2x5E+tcDup6XkuOAX3dCA==",
- "license": "MIT",
- "dependencies": {
- "@next/env": "16.2.10",
- "@swc/helpers": "0.5.15",
- "baseline-browser-mapping": "^2.9.19",
- "caniuse-lite": "^1.0.30001579",
- "postcss": "8.4.31",
- "styled-jsx": "5.1.6"
- },
- "bin": {
- "next": "dist/bin/next"
- },
- "engines": {
- "node": ">=20.9.0"
- },
- "optionalDependencies": {
- "@next/swc-darwin-arm64": "16.2.10",
- "@next/swc-darwin-x64": "16.2.10",
- "@next/swc-linux-arm64-gnu": "16.2.10",
- "@next/swc-linux-arm64-musl": "16.2.10",
- "@next/swc-linux-x64-gnu": "16.2.10",
- "@next/swc-linux-x64-musl": "16.2.10",
- "@next/swc-win32-arm64-msvc": "16.2.10",
- "@next/swc-win32-x64-msvc": "16.2.10",
- "sharp": "^0.34.5"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.1.0",
- "@playwright/test": "^1.51.1",
- "babel-plugin-react-compiler": "*",
- "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
- "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
- "sass": "^1.3.0"
- },
- "peerDependenciesMeta": {
- "@opentelemetry/api": {
- "optional": true
- },
- "@playwright/test": {
- "optional": true
- },
- "babel-plugin-react-compiler": {
- "optional": true
- },
- "sass": {
- "optional": true
- }
- }
- },
- "node_modules/next/node_modules/postcss": {
- "version": "8.4.31",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
- "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.6",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/node-abort-controller": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
- "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/node-exports-info": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz",
- "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "array.prototype.flatmap": "^1.3.3",
- "es-errors": "^1.3.0",
- "object.entries": "^1.1.9",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/node-fetch-native": {
- "version": "1.6.7",
- "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz",
- "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/node-gyp-build-optional-packages": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz",
- "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "detect-libc": "^2.0.1"
- },
- "bin": {
- "node-gyp-build-optional-packages": "bin.js",
- "node-gyp-build-optional-packages-optional": "optional.js",
- "node-gyp-build-optional-packages-test": "build-test.js"
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.51",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz",
- "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/nypm": {
- "version": "0.6.8",
- "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.8.tgz",
- "integrity": "sha512-Q9K4Diu6l5u6xJQogeFSs/zKtyMSgFKFtRQV+tHP4kL7KPm2grpBU0dFIwFaXwNxN0MtfKWc43VpCugAa+LPsw==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "citty": "^0.2.2",
- "pathe": "^2.0.3",
- "tinyexec": "^1.2.4"
- },
- "bin": {
- "nypm": "dist/cli.mjs"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/nypm/node_modules/citty": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz",
- "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
- "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.7",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
- "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0",
- "has-symbols": "^1.1.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.entries": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
- "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.4",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.fromentries": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
- "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.groupby": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
- "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.values": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
- "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/obug": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz",
- "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==",
- "dev": true,
- "funding": [
- "https://github.com/sponsors/sxzz",
- "https://opencollective.com/debug"
- ],
- "license": "MIT",
- "engines": {
- "node": ">=12.20.0"
- }
- },
- "node_modules/ohash": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz",
- "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/optionator": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
- "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/own-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
- "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "get-intrinsic": "^1.2.6",
- "object-keys": "^1.1.1",
- "safe-push-apply": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/pathe": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
- "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/perfect-debounce": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
- "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
- "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pkg-types": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz",
- "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.2.4",
- "exsolve": "^1.0.8",
- "pathe": "^2.0.3"
- }
- },
- "node_modules/playwright": {
- "version": "1.61.1",
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz",
- "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==",
- "devOptional": true,
- "license": "Apache-2.0",
- "dependencies": {
- "playwright-core": "1.61.1"
- },
- "bin": {
- "playwright": "cli.js"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "fsevents": "2.3.2"
- }
- },
- "node_modules/playwright-core": {
- "version": "1.61.1",
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz",
- "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==",
- "devOptional": true,
- "license": "Apache-2.0",
- "bin": {
- "playwright-core": "cli.js"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/possible-typed-array-names": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
- "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.16",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz",
- "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.12",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prisma": {
- "version": "6.19.3",
- "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.3.tgz",
- "integrity": "sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==",
- "devOptional": true,
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@prisma/config": "6.19.3",
- "@prisma/engines": "6.19.3"
- },
- "bin": {
- "prisma": "build/index.js"
- },
- "engines": {
- "node": ">=18.18"
- },
- "peerDependencies": {
- "typescript": ">=5.1.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/prop-types": {
- "version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pure-rand": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
- "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
- "devOptional": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/dubzzz"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fast-check"
- }
- ],
- "license": "MIT"
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/rc9": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz",
- "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "defu": "^6.1.4",
- "destr": "^2.0.3"
- }
- },
- "node_modules/react": {
- "version": "19.2.7",
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz",
- "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-dom": {
- "version": "19.2.7",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz",
- "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==",
- "license": "MIT",
- "dependencies": {
- "scheduler": "^0.27.0"
- },
- "peerDependencies": {
- "react": "^19.2.7"
- }
- },
- "node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/react-refresh": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
- "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/readdirp": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
- "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": ">= 14.18.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/redis-errors": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
- "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==",
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/redis-parser": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
- "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "redis-errors": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/reflect.getprototypeof": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
- "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.9",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.7",
- "get-proto": "^1.0.1",
- "which-builtin-type": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/regexp.prototype.flags": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
- "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "define-properties": "^1.2.1",
- "es-errors": "^1.3.0",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "set-function-name": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve": {
- "version": "2.0.0-next.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz",
- "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "is-core-module": "^2.16.2",
- "node-exports-info": "^1.6.0",
- "object-keys": "^1.1.1",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/resolve-pkg-maps": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
- "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
- }
- },
- "node_modules/reusify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rollup": {
- "version": "4.62.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz",
- "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "1.0.9"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.62.2",
- "@rollup/rollup-android-arm64": "4.62.2",
- "@rollup/rollup-darwin-arm64": "4.62.2",
- "@rollup/rollup-darwin-x64": "4.62.2",
- "@rollup/rollup-freebsd-arm64": "4.62.2",
- "@rollup/rollup-freebsd-x64": "4.62.2",
- "@rollup/rollup-linux-arm-gnueabihf": "4.62.2",
- "@rollup/rollup-linux-arm-musleabihf": "4.62.2",
- "@rollup/rollup-linux-arm64-gnu": "4.62.2",
- "@rollup/rollup-linux-arm64-musl": "4.62.2",
- "@rollup/rollup-linux-loong64-gnu": "4.62.2",
- "@rollup/rollup-linux-loong64-musl": "4.62.2",
- "@rollup/rollup-linux-ppc64-gnu": "4.62.2",
- "@rollup/rollup-linux-ppc64-musl": "4.62.2",
- "@rollup/rollup-linux-riscv64-gnu": "4.62.2",
- "@rollup/rollup-linux-riscv64-musl": "4.62.2",
- "@rollup/rollup-linux-s390x-gnu": "4.62.2",
- "@rollup/rollup-linux-x64-gnu": "4.62.2",
- "@rollup/rollup-linux-x64-musl": "4.62.2",
- "@rollup/rollup-openbsd-x64": "4.62.2",
- "@rollup/rollup-openharmony-arm64": "4.62.2",
- "@rollup/rollup-win32-arm64-msvc": "4.62.2",
- "@rollup/rollup-win32-ia32-msvc": "4.62.2",
- "@rollup/rollup-win32-x64-gnu": "4.62.2",
- "@rollup/rollup-win32-x64-msvc": "4.62.2",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-array-concat": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz",
- "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.9",
- "call-bound": "^1.0.4",
- "get-intrinsic": "^1.3.0",
- "has-symbols": "^1.1.0",
- "isarray": "^2.0.5"
- },
- "engines": {
- "node": ">=0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/safe-push-apply": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
- "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "isarray": "^2.0.5"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/safe-regex-test": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
- "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "is-regex": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/scheduler": {
- "version": "0.27.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
- "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
- "license": "MIT"
- },
- "node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/set-function-length": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/set-function-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
- "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/set-proto": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
- "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/sharp": {
- "version": "0.34.5",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
- "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "optional": true,
- "dependencies": {
- "@img/colour": "^1.0.0",
- "detect-libc": "^2.1.2",
- "semver": "^7.7.3"
- },
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-darwin-arm64": "0.34.5",
- "@img/sharp-darwin-x64": "0.34.5",
- "@img/sharp-libvips-darwin-arm64": "1.2.4",
- "@img/sharp-libvips-darwin-x64": "1.2.4",
- "@img/sharp-libvips-linux-arm": "1.2.4",
- "@img/sharp-libvips-linux-arm64": "1.2.4",
- "@img/sharp-libvips-linux-ppc64": "1.2.4",
- "@img/sharp-libvips-linux-riscv64": "1.2.4",
- "@img/sharp-libvips-linux-s390x": "1.2.4",
- "@img/sharp-libvips-linux-x64": "1.2.4",
- "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
- "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
- "@img/sharp-linux-arm": "0.34.5",
- "@img/sharp-linux-arm64": "0.34.5",
- "@img/sharp-linux-ppc64": "0.34.5",
- "@img/sharp-linux-riscv64": "0.34.5",
- "@img/sharp-linux-s390x": "0.34.5",
- "@img/sharp-linux-x64": "0.34.5",
- "@img/sharp-linuxmusl-arm64": "0.34.5",
- "@img/sharp-linuxmusl-x64": "0.34.5",
- "@img/sharp-wasm32": "0.34.5",
- "@img/sharp-win32-arm64": "0.34.5",
- "@img/sharp-win32-ia32": "0.34.5",
- "@img/sharp-win32-x64": "0.34.5"
- }
- },
- "node_modules/sharp/node_modules/semver": {
- "version": "7.8.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
- "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
- "license": "ISC",
- "optional": true,
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/side-channel": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
- "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.4",
- "side-channel-list": "^1.0.1",
- "side-channel-map": "^1.0.1",
- "side-channel-weakmap": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-list": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
- "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
- "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-weakmap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
- "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3",
- "side-channel-map": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/siginfo": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
- "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/source-map-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/stable-hash": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
- "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/stackback": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
- "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/standard-as-callback": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
- "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/std-env": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz",
- "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/stop-iteration-iterator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
- "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "internal-slot": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/string.prototype.includes": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
- "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.3"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/string.prototype.matchall": {
- "version": "4.0.12",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
- "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.6",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.6",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "internal-slot": "^1.1.0",
- "regexp.prototype.flags": "^1.5.3",
- "set-function-name": "^2.0.2",
- "side-channel": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.repeat": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
- "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5"
- }
- },
- "node_modules/string.prototype.trim": {
- "version": "1.2.11",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz",
- "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.9",
- "call-bound": "^1.0.4",
- "define-data-property": "^1.1.4",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.24.2",
- "es-object-atoms": "^1.1.2",
- "has-property-descriptors": "^1.0.2",
- "safe-regex-test": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimend": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz",
- "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.9",
- "call-bound": "^1.0.4",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
- "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/stripe": {
- "version": "22.3.1",
- "resolved": "https://registry.npmjs.org/stripe/-/stripe-22.3.1.tgz",
- "integrity": "sha512-6XSLN0KK0IdfXqDHqMg6CDoO3eO62ye9dhzw0fZp55AUOzHR1YRJOqYHTsuCi4QJ4Ni/usEmXtq69c9ghKDmYw==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@types/node": ">=18"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
- }
- },
- "node_modules/styled-jsx": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
- "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
- "license": "MIT",
- "dependencies": {
- "client-only": "0.0.1"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "peerDependencies": {
- "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
- },
- "peerDependenciesMeta": {
- "@babel/core": {
- "optional": true
- },
- "babel-plugin-macros": {
- "optional": true
- }
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/tailwind-merge": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz",
- "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/dcastil"
- }
- },
- "node_modules/tailwindcss": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz",
- "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tapable": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
- "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/tinybench": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
- "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tinyexec": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz",
- "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/tinyglobby": {
- "version": "0.2.17",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
- "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fdir": "^6.5.0",
- "picomatch": "^4.0.4"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/SuperchupuDev"
- }
- },
- "node_modules/tinyglobby/node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/tinyglobby/node_modules/picomatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
- "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/tinyrainbow": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz",
- "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/ts-api-utils": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
- "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18.12"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4"
- }
- },
- "node_modules/tsconfig-paths": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
- "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
- }
- },
- "node_modules/tsconfig-paths/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minimist": "^1.2.0"
- },
- "bin": {
- "json5": "lib/cli.js"
- }
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
- },
- "node_modules/tsx": {
- "version": "4.23.0",
- "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.0.tgz",
- "integrity": "sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "esbuild": "~0.28.0"
- },
- "bin": {
- "tsx": "dist/cli.mjs"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- }
- },
- "node_modules/tsx/node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/typed-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "es-errors": "^1.3.0",
- "is-typed-array": "^1.1.14"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/typed-array-byte-length": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
- "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.8",
- "for-each": "^0.3.3",
- "gopd": "^1.2.0",
- "has-proto": "^1.2.0",
- "is-typed-array": "^1.1.14"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-byte-offset": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
- "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.8",
- "for-each": "^0.3.3",
- "gopd": "^1.2.0",
- "has-proto": "^1.2.0",
- "is-typed-array": "^1.1.15",
- "reflect.getprototypeof": "^1.0.9"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-length": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz",
- "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.9",
- "for-each": "^0.3.5",
- "gopd": "^1.2.0",
- "is-typed-array": "^1.1.15",
- "possible-typed-array-names": "^1.1.0",
- "reflect.getprototypeof": "^1.0.10"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
- "devOptional": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/typescript-eslint": {
- "version": "8.63.0",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.63.0.tgz",
- "integrity": "sha512-xgwXyzG4sK9ALkBxbyGkTMMOS+imnW65iPhxCQMK83KhxyoDNW7l+IDqEf9vMdoUidHpOoS967RCq4eMiTexwQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/eslint-plugin": "8.63.0",
- "@typescript-eslint/parser": "8.63.0",
- "@typescript-eslint/typescript-estree": "8.63.0",
- "@typescript-eslint/utils": "8.63.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/unbox-primitive": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
- "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.3",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.1.0",
- "which-boxed-primitive": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/undici-types": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
- "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/unrs-resolver": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz",
- "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "napi-postinstall": "^0.3.4"
- },
- "funding": {
- "url": "https://opencollective.com/unrs-resolver"
- },
- "optionalDependencies": {
- "@unrs/resolver-binding-android-arm-eabi": "1.12.2",
- "@unrs/resolver-binding-android-arm64": "1.12.2",
- "@unrs/resolver-binding-darwin-arm64": "1.12.2",
- "@unrs/resolver-binding-darwin-x64": "1.12.2",
- "@unrs/resolver-binding-freebsd-x64": "1.12.2",
- "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2",
- "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2",
- "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2",
- "@unrs/resolver-binding-linux-arm64-musl": "1.12.2",
- "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2",
- "@unrs/resolver-binding-linux-loong64-musl": "1.12.2",
- "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2",
- "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2",
- "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2",
- "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2",
- "@unrs/resolver-binding-linux-x64-gnu": "1.12.2",
- "@unrs/resolver-binding-linux-x64-musl": "1.12.2",
- "@unrs/resolver-binding-openharmony-arm64": "1.12.2",
- "@unrs/resolver-binding-wasm32-wasi": "1.12.2",
- "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2",
- "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2",
- "@unrs/resolver-binding-win32-x64-msvc": "1.12.2"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
- "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/vite": {
- "version": "7.3.6",
- "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz",
- "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "esbuild": "^0.27.0 || ^0.28.0",
- "fdir": "^6.5.0",
- "picomatch": "^4.0.3",
- "postcss": "^8.5.6",
- "rollup": "^4.43.0",
- "tinyglobby": "^0.2.15"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^20.19.0 || >=22.12.0",
- "jiti": ">=1.21.0",
- "less": "^4.0.0",
- "lightningcss": "^1.21.0",
- "sass": "^1.70.0",
- "sass-embedded": "^1.70.0",
- "stylus": ">=0.54.8",
- "sugarss": "^5.0.0",
- "terser": "^5.16.0",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "jiti": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "sass-embedded": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
- "node_modules/vite/node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/vite/node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/vite/node_modules/picomatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
- "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/vitest": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz",
- "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vitest/expect": "4.1.10",
- "@vitest/mocker": "4.1.10",
- "@vitest/pretty-format": "4.1.10",
- "@vitest/runner": "4.1.10",
- "@vitest/snapshot": "4.1.10",
- "@vitest/spy": "4.1.10",
- "@vitest/utils": "4.1.10",
- "es-module-lexer": "^2.0.0",
- "expect-type": "^1.3.0",
- "magic-string": "^0.30.21",
- "obug": "^2.1.1",
- "pathe": "^2.0.3",
- "picomatch": "^4.0.3",
- "std-env": "^4.0.0-rc.1",
- "tinybench": "^2.9.0",
- "tinyexec": "^1.0.2",
- "tinyglobby": "^0.2.15",
- "tinyrainbow": "^3.1.0",
- "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
- "why-is-node-running": "^2.3.0"
- },
- "bin": {
- "vitest": "vitest.mjs"
- },
- "engines": {
- "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- },
- "peerDependencies": {
- "@edge-runtime/vm": "*",
- "@opentelemetry/api": "^1.9.0",
- "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
- "@vitest/browser-playwright": "4.1.10",
- "@vitest/browser-preview": "4.1.10",
- "@vitest/browser-webdriverio": "4.1.10",
- "@vitest/coverage-istanbul": "4.1.10",
- "@vitest/coverage-v8": "4.1.10",
- "@vitest/ui": "4.1.10",
- "happy-dom": "*",
- "jsdom": "*",
- "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "@edge-runtime/vm": {
- "optional": true
- },
- "@opentelemetry/api": {
- "optional": true
- },
- "@types/node": {
- "optional": true
- },
- "@vitest/browser-playwright": {
- "optional": true
- },
- "@vitest/browser-preview": {
- "optional": true
- },
- "@vitest/browser-webdriverio": {
- "optional": true
- },
- "@vitest/coverage-istanbul": {
- "optional": true
- },
- "@vitest/coverage-v8": {
- "optional": true
- },
- "@vitest/ui": {
- "optional": true
- },
- "happy-dom": {
- "optional": true
- },
- "jsdom": {
- "optional": true
- },
- "vite": {
- "optional": false
- }
- }
- },
- "node_modules/vitest/node_modules/picomatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
- "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/which-boxed-primitive": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
- "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-bigint": "^1.1.0",
- "is-boolean-object": "^1.2.1",
- "is-number-object": "^1.1.1",
- "is-string": "^1.1.1",
- "is-symbol": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-builtin-type": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
- "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "function.prototype.name": "^1.1.6",
- "has-tostringtag": "^1.0.2",
- "is-async-function": "^2.0.0",
- "is-date-object": "^1.1.0",
- "is-finalizationregistry": "^1.1.0",
- "is-generator-function": "^1.0.10",
- "is-regex": "^1.2.1",
- "is-weakref": "^1.0.2",
- "isarray": "^2.0.5",
- "which-boxed-primitive": "^1.1.0",
- "which-collection": "^1.0.2",
- "which-typed-array": "^1.1.16"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-collection": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
- "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-map": "^2.0.3",
- "is-set": "^2.0.3",
- "is-weakmap": "^2.0.2",
- "is-weakset": "^2.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-typed-array": {
- "version": "1.1.22",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz",
- "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.9",
- "call-bound": "^1.0.4",
- "for-each": "^0.3.5",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/why-is-node-running": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
- "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "siginfo": "^2.0.0",
- "stackback": "0.0.2"
- },
- "bin": {
- "why-is-node-running": "cli.js"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/zod": {
- "version": "3.25.76",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- },
- "node_modules/zod-validation-error": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
- "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "zod": "^3.25.0 || ^4.0.0"
- }
- }
- }
-}
diff --git a/govarbitrage/package.json b/govarbitrage/package.json
deleted file mode 100644
index d80850f..0000000
--- a/govarbitrage/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- "name": "govarbitrage",
- "version": "0.5.1",
- "private": true,
- "description": "Discover, research, value, and score government-surplus auction listings for resale arbitrage.",
- "type": "module",
- "prisma": {
- "seed": "tsx prisma/seed.ts"
- },
- "scripts": {
- "dev": "next dev",
- "build": "prisma generate && next build",
- "start": "next start",
- "lint": "eslint .",
- "typecheck": "tsc --noEmit",
- "test": "vitest run",
- "test:watch": "vitest",
- "db:generate": "prisma generate",
- "db:push": "prisma db push",
- "db:migrate": "prisma migrate dev",
- "db:seed": "tsx prisma/seed.ts",
- "worker": "tsx src/worker/index.ts",
- "agents": "tsx src/agents/run.ts",
- "e2e": "playwright test"
- },
- "dependencies": {
- "@prisma/client": "6.19.3",
- "@tanstack/react-table": "8.21.3",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "csv-parse": "^5.6.0",
- "jose": "^6.2.3",
- "lucide-react": "^0.469.0",
- "next": "16.2.10",
- "react": "19.2.7",
- "react-dom": "19.2.7",
- "stripe": "^22.3.1",
- "tailwind-merge": "^2.6.0",
- "zod": "^3.24.1"
- },
- "optionalDependencies": {
- "bullmq": "5.80.0",
- "ioredis": "^5.4.2"
- },
- "devDependencies": {
- "@eslint/eslintrc": "^3.3.5",
- "@playwright/test": "^1.49.1",
- "@tailwindcss/postcss": "^4.0.0",
- "@types/node": "^22.10.5",
- "@types/react": "^19",
- "@types/react-dom": "^19",
- "@vitejs/plugin-react": "^4.3.4",
- "eslint": "^9.18.0",
- "eslint-config-next": "16.2.10",
- "postcss": "^8.4.49",
- "prisma": "6.19.3",
- "tailwindcss": "^4.0.0",
- "tsx": "^4.19.2",
- "typescript": "^5.7.3",
- "vitest": "4.1.10"
- },
- "allowScripts": {
- "@prisma/engines@6.19.3": true,
- "prisma@6.19.3": true,
- "esbuild@0.28.1": true,
- "sharp@0.34.5": true,
- "unrs-resolver@1.12.2": true,
- "msgpackr-extract@3.0.4": true
- }
-}
diff --git a/govarbitrage/playwright.config.ts b/govarbitrage/playwright.config.ts
deleted file mode 100644
index 7976673..0000000
--- a/govarbitrage/playwright.config.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { defineConfig, devices } from "@playwright/test";
-
-const PORT = process.env.E2E_PORT || "3010";
-const baseURL = `http://localhost:${PORT}`;
-
-export default defineConfig({
- testDir: "./tests/e2e",
- timeout: 30_000,
- fullyParallel: true,
- reporter: "list",
- use: { baseURL, trace: "on-first-retry" },
- projects: [{ name: "chromium", use: { ...devices["Desktop Chrome"] } }],
- // Build + start the production server for E2E. Reuses an already-running one.
- webServer: {
- command: `npm run build && PORT=${PORT} npm run start`,
- url: baseURL,
- reuseExistingServer: !process.env.CI,
- timeout: 180_000,
- },
-});
diff --git a/govarbitrage/postcss.config.mjs b/govarbitrage/postcss.config.mjs
deleted file mode 100644
index 79bcf13..0000000
--- a/govarbitrage/postcss.config.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/** @type {import('postcss-load-config').Config} */
-const config = {
- plugins: {
- "@tailwindcss/postcss": {},
- },
-};
-
-export default config;
diff --git a/govarbitrage/prisma/schema.prisma b/govarbitrage/prisma/schema.prisma
deleted file mode 100644
index b2b2339..0000000
--- a/govarbitrage/prisma/schema.prisma
+++ /dev/null
@@ -1,533 +0,0 @@
-// GovArbitrage — data model
-// Money is stored as Decimal(14,2). Scores are Float 0..100. Probabilities Float 0..1.
-
-generator client {
- provider = "prisma-client-js"
-}
-
-datasource db {
- provider = "postgresql"
- url = env("DATABASE_URL")
-}
-
-// ------------------------------------------------------------------ enums
-
-enum AuctionSource {
- GOVDEALS
- PUBLIC_SURPLUS
- GSA_AUCTIONS
- COUNTY
- STATE_SURPLUS
- UNIVERSITY_SURPLUS
- MUNICIBID
- BID4ASSETS
- GOINDUSTRY
- NETWORK_INTL
- GRAYS_AU
- GOVPLANET
- CSV
- EXTENSION
- OTHER
-}
-
-enum Condition {
- NEW
- LIKE_NEW
- USED_GOOD
- USED_FAIR
- FOR_PARTS
- UNKNOWN
-}
-
-// Lifecycle of a listing on its SOURCE site (not Steve's buyer workflow —
-// that's AuctionOutcome). ACTIVE = still live/biddable; ENDED = auction closed
-// (past closingAt); REMOVED = pulled/sold/404 on the source. Only ACTIVE
-// listings show on the live grid.
-enum ListingStatus {
- ACTIVE
- ENDED
- REMOVED
-}
-
-enum ResearchStatus {
- PENDING
- QUEUED
- IN_PROGRESS
- COMPLETE
- FAILED
-}
-
-enum RiskLevel {
- LOW
- MEDIUM
- HIGH
-}
-
-enum DropShipFeasibility {
- EASY
- MODERATE
- DIFFICULT
- INFEASIBLE
-}
-
-enum ScoreProfile {
- OVERALL_OPPORTUNITY
- BEST_ARBITRAGE
- QUICK_FLIP
- COLLECTOR
- LOCAL_PICKUP
- EASY_FREIGHT
- PARTS_ONLY
- HIGH_CONFIDENCE
- HIGH_PROFIT
-}
-
-enum ComparableKind {
- SOLD
- ACTIVE
- RETAIL
-}
-
-enum OutcomeStatus {
- WATCHING
- BID_PLACED
- WON
- LOST
- ABANDONED
-}
-
-enum Role {
- ADMIN
- ANALYST
- VIEWER
-}
-
-// Subscription tier for the paid-alerts SaaS. FREE is the default for any new
-// account; STANDARD/PREMIUM are set by a (TEST) Stripe subscription webhook.
-enum Tier {
- FREE
- STANDARD
- PREMIUM
-}
-
-// Double-opt-in newsletter lifecycle. PENDING until the confirm link is
-// clicked; UNSUBSCRIBED rows are kept (suppression list) so a re-subscribe
-// re-issues a fresh confirm rather than silently re-adding.
-enum SubscriberStatus {
- PENDING
- CONFIRMED
- UNSUBSCRIBED
-}
-
-enum EventType {
- IMPORTED
- RESEARCH_STARTED
- RESEARCH_COMPLETED
- RESEARCH_FAILED
- SCORED
- PRICE_CHANGED
- NOTE_ADDED
- BUYER_LEAD_ADDED
- OUTCOME_CHANGED
- STATUS_CHANGE
- HOT_ALERTED
- MANUAL_EDIT
-}
-
-// ------------------------------------------------------------------ core
-
-model Listing {
- id String @id @default(cuid())
- source AuctionSource
- sourceAuctionId String // the auction/lot number on the source site
- sourceUrl String?
- title String
- description String?
- category String?
-
- // AI/OCR/vision-identified product attributes
- manufacturer String?
- model String?
- serialNumber String?
- sku String?
- year Int?
- condition Condition @default(UNKNOWN)
- quantity Int @default(1)
- accessories String?
- missingParts String?
- weightLbs Float?
- dimensions String? // "L x W x H in"
- auctionTerms String?
-
- // location + logistics
- locationCity String?
- locationState String?
- locationZip String?
-
- // live auction state
- currentBid Decimal @default(0) @db.Decimal(14, 2)
- bidCount Int @default(0)
- closingAt DateTime?
- imageUrls String[] @default([])
- identifiedBy String? // "ollama:qwen2.5vl" | "manual" | "extension"
- identifyRaw Json? // raw model output for auditability
-
- researchStatus ResearchStatus @default(PENDING)
-
- // source-liveness lifecycle + fast removal
- listingStatus ListingStatus @default(ACTIVE)
- endedAt DateTime? // when marked ENDED/REMOVED
- lastSeenAt DateTime @default(now()) // last time confirmed live on source
- livenessCheckedAt DateTime? // last Tier-2 network re-verify
-
- // HOT DEAL alerting (dedup so we alert each deal once)
- hotAlertedAt DateTime?
-
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-
- research Research?
- costBreakdown CostBreakdown?
- scores Score[]
- comparables Comparable[]
- notes Note[]
- events ListingEvent[]
- buyerPage BuyerInterestPage?
- buyerLeads BuyerLead[]
- outcome AuctionOutcome?
- agentFindings AgentFinding[]
-
- @@unique([source, sourceAuctionId])
- @@index([researchStatus])
- @@index([category])
- @@index([closingAt])
- @@index([listingStatus])
- @@index([hotAlertedAt])
-}
-
-// Valuation research output for a listing
-model Research {
- id String @id @default(cuid())
- listingId String @unique
- listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
-
- // retail estimates
- newRetail Decimal? @db.Decimal(14, 2)
- newReplacement Decimal? @db.Decimal(14, 2)
- avgRetail Decimal? @db.Decimal(14, 2)
-
- // used market
- usedSoldPrice Decimal? @db.Decimal(14, 2)
- usedAskingPrice Decimal? @db.Decimal(14, 2)
- usedLow Decimal? @db.Decimal(14, 2)
- usedHigh Decimal? @db.Decimal(14, 2)
-
- // channel values
- wholesaleValue Decimal? @db.Decimal(14, 2)
- liquidationValue Decimal? @db.Decimal(14, 2)
- sellTodayValue Decimal? @db.Decimal(14, 2)
-
- // time-horizon values
- value7Day Decimal? @db.Decimal(14, 2)
- value30Day Decimal? @db.Decimal(14, 2)
- value90Day Decimal? @db.Decimal(14, 2)
-
- // outcome estimates
- expectedSalePrice Decimal? @db.Decimal(14, 2)
- probabilityOfSale Float? // 0..1
- daysUntilSold Int?
- confidenceScore Float? // 0..100
-
- sources Json? // [{name,url,kind,price}]
- summary String?
- model String? // which model produced this
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-}
-
-// All acquisition + resale costs for a listing
-model CostBreakdown {
- id String @id @default(cuid())
- listingId String @unique
- listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
-
- winningBid Decimal @default(0) @db.Decimal(14, 2)
- buyerPremium Decimal @default(0) @db.Decimal(14, 2)
- salesTax Decimal @default(0) @db.Decimal(14, 2)
- shipping Decimal @default(0) @db.Decimal(14, 2)
- freight Decimal @default(0) @db.Decimal(14, 2)
- insurance Decimal @default(0) @db.Decimal(14, 2)
- packing Decimal @default(0) @db.Decimal(14, 2)
- pickupLabor Decimal @default(0) @db.Decimal(14, 2)
- testing Decimal @default(0) @db.Decimal(14, 2)
- repairs Decimal @default(0) @db.Decimal(14, 2)
- certification Decimal @default(0) @db.Decimal(14, 2)
- marketplaceFees Decimal @default(0) @db.Decimal(14, 2)
- paymentFees Decimal @default(0) @db.Decimal(14, 2)
- storage Decimal @default(0) @db.Decimal(14, 2)
- photography Decimal @default(0) @db.Decimal(14, 2)
- listingLabor Decimal @default(0) @db.Decimal(14, 2)
-
- expectedReturns Decimal @default(0) @db.Decimal(14, 2)
- totalInvestment Decimal @default(0) @db.Decimal(14, 2)
- expectedNetProfit Decimal @default(0) @db.Decimal(14, 2)
- roi Float @default(0) // ratio, e.g. 0.42 = 42%
- annualizedReturn Float @default(0)
- recommendedMaxBid Decimal @default(0) @db.Decimal(14, 2)
-
- assumptions Json? // basis for each estimate (freight table row, fee %, etc.)
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-}
-
-// One row per scoring profile for a listing, each with a human explanation
-model Score {
- id String @id @default(cuid())
- listingId String
- listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
- profile ScoreProfile
- value Float // 0..100
-
- // component sub-scores (0..100) the profile is composed from
- arbitrage Float @default(0)
- demand Float @default(0)
- velocity Float @default(0)
- logistics Float @default(0)
- condition Float @default(0)
- competition Float @default(0)
- buyer Float @default(0)
-
- risk RiskLevel @default(MEDIUM)
- dropShip DropShipFeasibility @default(MODERATE)
- explanation String // "why it got this score", plain English
- factors Json? // structured [{label, weight, contribution}]
-
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-
- @@unique([listingId, profile])
- @@index([profile, value])
-}
-
-model Comparable {
- id String @id @default(cuid())
- listingId String
- listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
- kind ComparableKind
- title String
- price Decimal @db.Decimal(14, 2)
- url String?
- source String? // "ebay" | "amazon" | manufacturer domain
- soldAt DateTime?
- createdAt DateTime @default(now())
-
- @@index([listingId, kind])
-}
-
-// ------------------------------------------------------------------ buyer workflow (compliant)
-
-model BuyerInterestPage {
- id String @id @default(cuid())
- listingId String @unique
- listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
- slug String @unique
- headline String
- // Compliance: contingent offers only, no ownership representation pre-win.
- contingent Boolean @default(true)
- published Boolean @default(false)
- estDelivered Decimal? @db.Decimal(14, 2)
- disclaimer String @default("This item is not yet owned. Any offer is contingent on winning the government auction and is non-binding until the auction is won and the item is in hand.")
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-}
-
-model BuyerLead {
- id String @id @default(cuid())
- listingId String
- listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
- name String
- email String
- phone String?
- offer Decimal? @db.Decimal(14, 2)
- contingent Boolean @default(true)
- notes String?
- createdAt DateTime @default(now())
-
- @@index([listingId])
-}
-
-model AuctionOutcome {
- id String @id @default(cuid())
- listingId String @unique
- listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
- status OutcomeStatus @default(WATCHING)
- maxBidSet Decimal? @db.Decimal(14, 2)
- wonPrice Decimal? @db.Decimal(14, 2)
- actualSale Decimal? @db.Decimal(14, 2)
- soldAt DateTime?
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-}
-
-// ------------------------------------------------------------------ workspace
-
-model Note {
- id String @id @default(cuid())
- listingId String
- listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
- body String
- author String?
- createdAt DateTime @default(now())
-
- @@index([listingId])
-}
-
-model ListingEvent {
- id String @id @default(cuid())
- listingId String
- listing Listing @relation(fields: [listingId], references: [id], onDelete: Cascade)
- type EventType
- message String
- meta Json?
- createdAt DateTime @default(now())
-
- @@index([listingId, createdAt])
-}
-
-model SavedView {
- id String @id @default(cuid())
- name String
- ownerId String?
- config Json // { filters, sort, columns, pinned, grouping }
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
-}
-
-// ------------------------------------------------------------------ security
-
-model User {
- id String @id @default(cuid())
- email String @unique
- name String?
- passwordHash String
- // Sign in with Apple — the Apple `sub` (stable per-app user id). Null for
- // password/admin users; set for accounts created via /api/auth/apple.
- appleSub String? @unique
- role Role @default(ANALYST)
- // Paid-alerts SaaS subscription
- tier Tier @default(FREE)
- stripeCustomerId String?
- stripeSubscriptionId String?
- createdAt DateTime @default(now())
- credentials ApiCredential[]
- auditLogs AuditLog[]
-}
-
-// Public newsletter subscriber for the twice-daily Top-10 digest.
-// email is stored lowercase; tokens are single-purpose URL-safe secrets.
-model Subscriber {
- id String @id @default(cuid())
- email String @unique
- status SubscriberStatus @default(PENDING)
- confirmToken String @unique
- unsubscribeToken String @unique
- source String @default("newsletter_page")
- createdAt DateTime @default(now())
- confirmedAt DateTime?
- unsubscribedAt DateTime?
-
- @@index([status])
-}
-
-model ApiCredential {
- id String @id @default(cuid())
- userId String
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
- provider String // "anthropic" | "ebay" | ...
- // Stored encrypted at rest (AES-256-GCM). Never returned to the client.
- ciphertext String
- iv String
- authTag String
- createdAt DateTime @default(now())
-
- @@unique([userId, provider])
-}
-
-model AuditLog {
- id String @id @default(cuid())
- userId String?
- user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
- action String
- entity String?
- entityId String?
- ip String?
- meta Json?
- createdAt DateTime @default(now())
-
- @@index([createdAt])
- @@index([action])
-}
-
-// ------------------------------------------------------------------ agent layer
-
-// One row per agent execution (appraiser / skeptic / scout). status is a plain
-// string (RUNNING | OK | FAILED) so new states never need a migration.
-model AgentRun {
- id String @id @default(cuid())
- agent String // "appraiser" | "skeptic" | "scout"
- startedAt DateTime @default(now())
- finishedAt DateTime?
- status String @default("RUNNING") // RUNNING | OK | FAILED
- itemsProcessed Int @default(0)
- summary String?
- findings AgentFinding[]
-
- @@index([agent, startedAt])
- @@index([startedAt])
-}
-
-// A single observation an agent made during a run. listingId is optional and
-// SetNull-on-delete; listingTitle is denormalized so findings stay readable
-// after a listing is purged.
-model AgentFinding {
- id String @id @default(cuid())
- runId String
- run AgentRun @relation(fields: [runId], references: [id], onDelete: Cascade)
- agent String
- listingId String?
- listing Listing? @relation(fields: [listingId], references: [id], onDelete: SetNull)
- listingTitle String?
- kind String // CLONE_VALUATION | LOW_CONFIDENCE | CLOSING_DATA_STALE | REAPPRAISED | AI_FALLBACK | HOT_CLOSING
- severity String // INFO | WARN | CRITICAL
- title String
- detail String?
- createdAt DateTime @default(now())
-
- @@index([runId])
- @@index([listingId])
- @@index([createdAt])
- @@index([severity])
-}
-
-// ------------------------------------------------------------------ digest archive
-
-enum DigestSlot {
- AM
- PM
-}
-
-// Frozen record of each digest run. The public /deals archive pages render
-// these snapshots so archive URLs stay stable and indexable instead of
-// re-querying live listings that expire out from under a crawled page.
-model DigestSnapshot {
- id String @id @default(cuid())
- date String // YYYY-MM-DD in America/Los_Angeles (the digest's home timezone)
- slot DigestSlot
- dealsJson Json // public-safe serialized Top-10 (see src/lib/digest-snapshot.ts)
- dealCount Int
- isSeed Boolean @default(false) // fabricated demo data — excluded from all public reads
- createdAt DateTime @default(now())
-
- @@unique([date, slot])
- @@index([date])
-}
diff --git a/govarbitrage/prisma/seed.ts b/govarbitrage/prisma/seed.ts
deleted file mode 100644
index c36bc00..0000000
--- a/govarbitrage/prisma/seed.ts
+++ /dev/null
@@ -1,820 +0,0 @@
-import { PrismaClient, type AuctionSource, type Condition } from "@prisma/client";
-import { runResearch } from "../src/pipeline/research";
-import { hashPassword } from "../src/lib/password";
-
-const prisma = new PrismaClient();
-
-const day = 86_400_000;
-const soon = (days: number) => new Date(Date.now() + days * day);
-const ago = (days: number) => new Date(Date.now() - days * day);
-const img = (seed: string) => [
- `https://picsum.photos/seed/${seed}a/600/400`,
- `https://picsum.photos/seed/${seed}b/600/400`,
-];
-
-interface Seed {
- source: AuctionSource;
- sourceAuctionId: string;
- sourceUrl: string;
- title: string;
- description: string;
- category: string;
- manufacturer?: string;
- model?: string;
- condition: Condition;
- quantity: number;
- weightLbs: number;
- dimensions?: string;
- city: string;
- state: string;
- zip: string;
- currentBid: number;
- bidCount: number;
- closesInDays: number;
- terms: string;
- seed: string;
- anchor: { newRetail: number; demandScore: number };
- comparables: {
- kind: "SOLD" | "ACTIVE" | "RETAIL";
- title: string;
- price: number;
- url?: string;
- source?: string;
- soldAt?: Date;
- }[];
-}
-
-const LISTINGS: Seed[] = [
- {
- source: "GOVDEALS",
- sourceAuctionId: "GD-448120",
- sourceUrl: "https://www.govdeals.com/index.cfm?fa=Main.Item&itemid=448120",
- title: "A-dec 511 Dental Patient Chair with Delivery System",
- description:
- "Surplus dental operatory chair, A-dec 511, powered recline, foot control, delivery unit. Removed from county health clinic. Functional, cosmetic wear.",
- category: "Medical / Dental Equipment",
- manufacturer: "A-dec",
- model: "511",
- condition: "USED_GOOD",
- quantity: 1,
- weightLbs: 320,
- dimensions: '60 x 30 x 44 in',
- city: "Sacramento",
- state: "CA",
- zip: "95814",
- currentBid: 500,
- bidCount: 3,
- closesInDays: 2,
- terms: "Pickup only. Payment within 5 business days. Buyer responsible for removal.",
- seed: "adec511",
- anchor: { newRetail: 20000, demandScore: 74 },
- comparables: [
- { kind: "RETAIL", title: "A-dec 511 new operatory package", price: 21500, source: "adec.com", url: "https://www.a-dec.com" },
- { kind: "SOLD", title: "A-dec 511 chair + delivery (used)", price: 6800, source: "ebay", soldAt: ago(21) },
- { kind: "SOLD", title: "A-dec 500 series used operatory", price: 5900, source: "dentalplanet", soldAt: ago(40) },
- { kind: "ACTIVE", title: "A-dec 511 refurb listed", price: 9200, source: "ebay" },
- ],
- },
- {
- source: "PUBLIC_SURPLUS",
- sourceAuctionId: "PS-99120",
- sourceUrl: "https://www.publicsurplus.com/sms/auction/view?auc=99120",
- title: "Lot of 12 Apple MacBook Pro 14 M-series Laptops",
- description:
- "12x MacBook Pro 14-inch, university IT refresh. Wiped, functional, minor scuffs. Chargers included for 9 of 12.",
- category: "Computers / Laptops",
- manufacturer: "Apple",
- model: "MacBook Pro 14",
- condition: "USED_GOOD",
- quantity: 12,
- weightLbs: 45,
- dimensions: "pallet",
- city: "Madison",
- state: "WI",
- zip: "53706",
- currentBid: 3200,
- bidCount: 11,
- closesInDays: 1,
- terms: "Shipping available at buyer expense. Payment via PayPal.",
- seed: "mbp14",
- anchor: { newRetail: 1999, demandScore: 88 },
- comparables: [
- { kind: "SOLD", title: "MacBook Pro 14 M-series used", price: 1150, source: "ebay", soldAt: ago(9) },
- { kind: "ACTIVE", title: "MacBook Pro 14 refurb", price: 1399, source: "ebay" },
- { kind: "RETAIL", title: "MacBook Pro 14 new", price: 1999, source: "apple.com" },
- ],
- },
- {
- source: "GSA_AUCTIONS",
- sourceAuctionId: "GSA-7781",
- sourceUrl: "https://gsaauctions.gov/auctions/7781",
- title: "Herman Miller Aeron Chairs (Qty 25)",
- description: "Federal office closure. 25 Aeron size B chairs, mixed condition, most fully functional.",
- category: "Office Furniture",
- manufacturer: "Herman Miller",
- model: "Aeron B",
- condition: "USED_GOOD",
- quantity: 25,
- weightLbs: 750,
- city: "Washington",
- state: "DC",
- zip: "20405",
- currentBid: 1500,
- bidCount: 7,
- closesInDays: 4,
- terms: "Pickup only. Government surplus, no buyer premium (GSA).",
- seed: "aeron",
- anchor: { newRetail: 1395, demandScore: 68 },
- comparables: [
- { kind: "SOLD", title: "Aeron B used", price: 480, source: "ebay", soldAt: ago(12) },
- { kind: "ACTIVE", title: "Aeron B refurb", price: 695, source: "facebook" },
- { kind: "RETAIL", title: "Aeron new", price: 1395, source: "hermanmiller.com" },
- ],
- },
- {
- source: "STATE_SURPLUS",
- sourceAuctionId: "TX-33112",
- sourceUrl: "https://www.tfc.texas.gov/surplus/33112",
- title: "Toyota 8FGCU25 Forklift 5000lb LP",
- description: "State facilities forklift, 5000 lb capacity, LP, ~6800 hours. Runs and lifts.",
- category: "Industrial / Material Handling",
- manufacturer: "Toyota",
- model: "8FGCU25",
- condition: "USED_FAIR",
- quantity: 1,
- weightLbs: 8200,
- city: "Austin",
- state: "TX",
- zip: "78701",
- currentBid: 4200,
- bidCount: 9,
- closesInDays: 3,
- terms: "Pickup only. Heavy equipment, buyer arranges transport.",
- seed: "forklift",
- anchor: { newRetail: 32000, demandScore: 66 },
- comparables: [
- { kind: "SOLD", title: "Toyota 8FGCU25 used", price: 14500, source: "machinerytrader", soldAt: ago(30) },
- { kind: "ACTIVE", title: "Toyota 5k LP forklift", price: 16900, source: "ebay" },
- ],
- },
- {
- source: "UNIVERSITY_SURPLUS",
- sourceAuctionId: "UW-5521",
- sourceUrl: "https://surplus.uw.edu/5521",
- title: "Nikon Eclipse Ci Laboratory Microscope",
- description: "University lab surplus. Nikon Eclipse Ci upright microscope, objectives included. Functional.",
- category: "Laboratory Equipment",
- manufacturer: "Nikon",
- model: "Eclipse Ci",
- condition: "LIKE_NEW",
- quantity: 1,
- weightLbs: 35,
- city: "Seattle",
- state: "WA",
- zip: "98195",
- currentBid: 900,
- bidCount: 4,
- closesInDays: 5,
- terms: "Shipping available. Pickup preferred.",
- seed: "nikonci",
- anchor: { newRetail: 9500, demandScore: 68 },
- comparables: [
- { kind: "SOLD", title: "Nikon Eclipse Ci used", price: 4200, source: "ebay", soldAt: ago(25) },
- { kind: "ACTIVE", title: "Nikon Eclipse Ci-L", price: 5600, source: "labx" },
- { kind: "RETAIL", title: "Nikon Eclipse Ci new config", price: 9500, source: "nikon" },
- ],
- },
- {
- source: "COUNTY",
- sourceAuctionId: "CTY-2201",
- sourceUrl: "https://county.example.gov/auctions/2201",
- title: "Cisco Catalyst 9300 48-port Switches (Lot of 6)",
- description: "County IT surplus. 6x Cisco Catalyst 9300 48-port. Wiped to ROMMON. Powered on before removal.",
- category: "Networking",
- manufacturer: "Cisco",
- model: "Catalyst 9300-48",
- condition: "USED_GOOD",
- quantity: 6,
- weightLbs: 60,
- city: "San Diego",
- state: "CA",
- zip: "92101",
- currentBid: 700,
- bidCount: 5,
- closesInDays: 2,
- terms: "Shipping available at buyer expense.",
- seed: "cat9300",
- anchor: { newRetail: 4800, demandScore: 64 },
- comparables: [
- { kind: "SOLD", title: "Catalyst 9300-48 used", price: 850, source: "ebay", soldAt: ago(7) },
- { kind: "ACTIVE", title: "C9300-48P refurb", price: 1200, source: "ebay" },
- ],
- },
- {
- source: "GOVDEALS",
- sourceAuctionId: "GD-451900",
- sourceUrl: "https://www.govdeals.com/index.cfm?fa=Main.Item&itemid=451900",
- title: "DeWalt 20V MAX Tool Lot (Drills, Impact, Saws)",
- description: "Municipal maintenance shop surplus. Mixed DeWalt 20V tools, some with batteries. Used, working.",
- category: "Power Tools",
- manufacturer: "DeWalt",
- model: "20V MAX",
- condition: "USED_GOOD",
- quantity: 14,
- weightLbs: 55,
- city: "Columbus",
- state: "OH",
- zip: "43215",
- currentBid: 220,
- bidCount: 6,
- closesInDays: 1,
- terms: "Pickup or shipping. Payment within 5 days.",
- seed: "dewalt",
- anchor: { newRetail: 2400, demandScore: 58 },
- comparables: [
- { kind: "SOLD", title: "DeWalt 20V tool lot used", price: 900, source: "ebay", soldAt: ago(14) },
- { kind: "ACTIVE", title: "DeWalt 20V combo kit", price: 1200, source: "ebay" },
- ],
- },
- {
- source: "PUBLIC_SURPLUS",
- sourceAuctionId: "PS-99870",
- sourceUrl: "https://www.publicsurplus.com/sms/auction/view?auc=99870",
- title: "Epson Pro L1500 Laser Projector",
- description: "Auditorium projector, Epson Pro L1500UH, ~2100 lamp hours (laser). Functional, includes lens.",
- category: "AV / Projectors",
- manufacturer: "Epson",
- model: "Pro L1500UH",
- condition: "USED_GOOD",
- quantity: 1,
- weightLbs: 55,
- city: "Phoenix",
- state: "AZ",
- zip: "85003",
- currentBid: 650,
- bidCount: 3,
- closesInDays: 6,
- terms: "Shipping available.",
- seed: "epsonl1500",
- anchor: { newRetail: 11000, demandScore: 60 },
- comparables: [
- { kind: "SOLD", title: "Epson Pro L1500UH used", price: 3800, source: "ebay", soldAt: ago(35) },
- { kind: "ACTIVE", title: "Epson L1505 laser", price: 5200, source: "ebay" },
- ],
- },
- {
- source: "GSA_AUCTIONS",
- sourceAuctionId: "GSA-8890",
- sourceUrl: "https://gsaauctions.gov/auctions/8890",
- title: "DJI Matrice 300 RTK Drone with Payloads",
- description: "Federal agency surplus UAV, DJI Matrice 300 RTK, 2 batteries, H20T payload. Flight-tested.",
- category: "Drones / UAV",
- manufacturer: "DJI",
- model: "Matrice 300 RTK",
- condition: "LIKE_NEW",
- quantity: 1,
- weightLbs: 40,
- city: "Denver",
- state: "CO",
- zip: "80202",
- currentBid: 3800,
- bidCount: 8,
- closesInDays: 3,
- terms: "Pickup or shipping. No buyer premium (GSA).",
- seed: "matrice300",
- anchor: { newRetail: 21000, demandScore: 72 },
- comparables: [
- { kind: "SOLD", title: "DJI M300 RTK + H20T used", price: 9800, source: "ebay", soldAt: ago(18) },
- { kind: "ACTIVE", title: "DJI Matrice 300 RTK", price: 12500, source: "ebay" },
- ],
- },
- {
- source: "STATE_SURPLUS",
- sourceAuctionId: "CA-DGS-6612",
- sourceUrl: "https://www.dgs.ca.gov/surplus/6612",
- title: "Dell PowerEdge R750 Servers (Lot of 4)",
- description: "State data center refresh. 4x Dell PowerEdge R750, dual Xeon, drives pulled. Powered before removal.",
- category: "Servers",
- manufacturer: "Dell",
- model: "PowerEdge R750",
- condition: "USED_GOOD",
- quantity: 4,
- weightLbs: 130,
- city: "Sacramento",
- state: "CA",
- zip: "95814",
- currentBid: 1100,
- bidCount: 6,
- closesInDays: 4,
- terms: "Shipping available at buyer expense.",
- seed: "r750",
- anchor: { newRetail: 9000, demandScore: 62 },
- comparables: [
- { kind: "SOLD", title: "Dell R750 barebones used", price: 2200, source: "ebay", soldAt: ago(11) },
- { kind: "ACTIVE", title: "PowerEdge R750 config", price: 3100, source: "ebay" },
- ],
- },
- {
- source: "COUNTY",
- sourceAuctionId: "CTY-3040",
- sourceUrl: "https://county.example.gov/auctions/3040",
- title: "Steelcase Leap V2 Chairs (Lot of 30)",
- description: "County office surplus, 30x Steelcase Leap V2. Used, functional, mixed upholstery wear.",
- category: "Office Furniture",
- manufacturer: "Steelcase",
- model: "Leap V2",
- condition: "USED_GOOD",
- quantity: 30,
- weightLbs: 900,
- city: "Portland",
- state: "OR",
- zip: "97204",
- currentBid: 900,
- bidCount: 4,
- closesInDays: 5,
- terms: "Pickup only.",
- seed: "leapv2",
- anchor: { newRetail: 1100, demandScore: 60 },
- comparables: [
- { kind: "SOLD", title: "Steelcase Leap V2 used", price: 320, source: "ebay", soldAt: ago(8) },
- { kind: "ACTIVE", title: "Leap V2 refurb", price: 520, source: "facebook" },
- ],
- },
- {
- source: "UNIVERSITY_SURPLUS",
- sourceAuctionId: "MSU-7710",
- sourceUrl: "https://surplus.msu.edu/7710",
- title: "Thermo Scientific Sorvall Legend X1R Centrifuge",
- description: "University lab surplus centrifuge, refrigerated, rotor included. Functional.",
- category: "Laboratory Equipment",
- manufacturer: "Thermo Scientific",
- model: "Sorvall Legend X1R",
- condition: "USED_GOOD",
- quantity: 1,
- weightLbs: 190,
- city: "East Lansing",
- state: "MI",
- zip: "48824",
- currentBid: 800,
- bidCount: 2,
- closesInDays: 7,
- terms: "Pickup only, freight arrangeable.",
- seed: "sorvall",
- anchor: { newRetail: 14000, demandScore: 65 },
- comparables: [
- { kind: "SOLD", title: "Sorvall Legend X1R used", price: 3600, source: "labx", soldAt: ago(28) },
- { kind: "ACTIVE", title: "Legend X1R refrigerated", price: 5400, source: "ebay" },
- ],
- },
- {
- source: "GOVDEALS",
- sourceAuctionId: "GD-460210",
- sourceUrl: "https://www.govdeals.com/index.cfm?fa=Main.Item&itemid=460210",
- title: "2015 Ford F-250 Super Duty Utility Truck",
- description: "Municipal fleet retirement. F-250 XL, 118k miles, utility bed. Runs, drives, service records.",
- category: "Vehicles",
- manufacturer: "Ford",
- model: "F-250 Super Duty",
- condition: "USED_FAIR",
- quantity: 1,
- weightLbs: 6800,
- city: "Tucson",
- state: "AZ",
- zip: "85701",
- currentBid: 8200,
- bidCount: 14,
- closesInDays: 2,
- terms: "Pickup only. Title transfer. As-is.",
- seed: "f250",
- anchor: { newRetail: 42000, demandScore: 50 },
- comparables: [
- { kind: "SOLD", title: "2015 F-250 utility 118k", price: 16500, source: "kbb", soldAt: ago(20) },
- { kind: "ACTIVE", title: "2015 F-250 XL", price: 18900, source: "autotrader" },
- ],
- },
- {
- source: "PUBLIC_SURPLUS",
- sourceAuctionId: "PS-100240",
- sourceUrl: "https://www.publicsurplus.com/sms/auction/view?auc=100240",
- title: "Lot of 40 Dell Latitude 7440 Laptops",
- description: "School district refresh, 40x Dell Latitude 7440, i5, wiped. Working, cosmetic wear.",
- category: "Computers / Laptops",
- manufacturer: "Dell",
- model: "Latitude 7440",
- condition: "USED_GOOD",
- quantity: 40,
- weightLbs: 120,
- city: "Orlando",
- state: "FL",
- zip: "32801",
- currentBid: 2600,
- bidCount: 10,
- closesInDays: 1,
- terms: "Pickup or shipping.",
- seed: "lat7440",
- anchor: { newRetail: 1400, demandScore: 70 },
- comparables: [
- { kind: "SOLD", title: "Dell Latitude 7440 used", price: 430, source: "ebay", soldAt: ago(6) },
- { kind: "ACTIVE", title: "Latitude 7440 i5", price: 560, source: "ebay" },
- ],
- },
- {
- source: "GSA_AUCTIONS",
- sourceAuctionId: "GSA-9021",
- sourceUrl: "https://gsaauctions.gov/auctions/9021",
- title: "Midmark 625 Barrier-Free Exam Table",
- description: "Federal clinic surplus exam table, Midmark 625, powered. Functional.",
- category: "Medical / Dental Equipment",
- manufacturer: "Midmark",
- model: "625",
- condition: "USED_GOOD",
- quantity: 1,
- weightLbs: 350,
- city: "Kansas City",
- state: "MO",
- zip: "64106",
- currentBid: 450,
- bidCount: 2,
- closesInDays: 6,
- terms: "Pickup only.",
- seed: "midmark625",
- anchor: { newRetail: 9800, demandScore: 66 },
- comparables: [
- { kind: "SOLD", title: "Midmark 625 used", price: 2900, source: "ebay", soldAt: ago(22) },
- { kind: "ACTIVE", title: "Midmark 625 barrier-free", price: 4200, source: "dotmed" },
- ],
- },
- {
- source: "STATE_SURPLUS",
- sourceAuctionId: "TX-34550",
- sourceUrl: "https://www.tfc.texas.gov/surplus/34550",
- title: "Miller Big Blue 400 Pro Welder/Generator",
- description: "State DOT surplus, Miller Big Blue 400 Pro diesel welder/generator. Runs.",
- category: "Industrial / Welding",
- manufacturer: "Miller",
- model: "Big Blue 400 Pro",
- condition: "USED_FAIR",
- quantity: 1,
- weightLbs: 1100,
- city: "Houston",
- state: "TX",
- zip: "77002",
- currentBid: 2400,
- bidCount: 5,
- closesInDays: 3,
- terms: "Pickup only.",
- seed: "bigblue",
- anchor: { newRetail: 13500, demandScore: 62 },
- comparables: [
- { kind: "SOLD", title: "Miller Big Blue 400 used", price: 6200, source: "machinerytrader", soldAt: ago(33) },
- { kind: "ACTIVE", title: "Big Blue 400 Pro", price: 7800, source: "ebay" },
- ],
- },
- {
- source: "COUNTY",
- sourceAuctionId: "CTY-3311",
- sourceUrl: "https://county.example.gov/auctions/3311",
- title: "Zebra ZT610 Industrial Label Printers (Lot of 8)",
- description: "County warehouse surplus, 8x Zebra ZT610 thermal printers. Working, some worn platens.",
- category: "Industrial / Printing",
- manufacturer: "Zebra",
- model: "ZT610",
- condition: "USED_GOOD",
- quantity: 8,
- weightLbs: 190,
- city: "Charlotte",
- state: "NC",
- zip: "28202",
- currentBid: 600,
- bidCount: 3,
- closesInDays: 4,
- terms: "Shipping available.",
- seed: "zt610",
- anchor: { newRetail: 3200, demandScore: 58 },
- comparables: [
- { kind: "SOLD", title: "Zebra ZT610 used", price: 850, source: "ebay", soldAt: ago(16) },
- { kind: "ACTIVE", title: "ZT610 203dpi", price: 1300, source: "ebay" },
- ],
- },
- {
- source: "UNIVERSITY_SURPLUS",
- sourceAuctionId: "UCD-8802",
- sourceUrl: "https://surplus.ucdavis.edu/8802",
- title: "Agilent 1260 Infinity II HPLC System",
- description: "University lab surplus HPLC, Agilent 1260 Infinity II, modules included. Powered before removal, untested flow.",
- category: "Laboratory Equipment",
- manufacturer: "Agilent",
- model: "1260 Infinity II",
- condition: "UNKNOWN",
- quantity: 1,
- weightLbs: 160,
- city: "Davis",
- state: "CA",
- zip: "95616",
- currentBid: 1500,
- bidCount: 4,
- closesInDays: 8,
- terms: "Pickup only, freight arrangeable. Sold as-is, untested.",
- seed: "hplc1260",
- anchor: { newRetail: 45000, demandScore: 67 },
- comparables: [
- { kind: "SOLD", title: "Agilent 1260 Infinity II used", price: 9500, source: "labx", soldAt: ago(45) },
- { kind: "ACTIVE", title: "1260 Infinity II stack", price: 14500, source: "ebay" },
- ],
- },
- {
- source: "GOVDEALS",
- sourceAuctionId: "GD-462800",
- sourceUrl: "https://www.govdeals.com/index.cfm?fa=Main.Item&itemid=462800",
- title: "Genie GS-1930 Scissor Lift",
- description: "City facilities surplus, Genie GS-1930 electric scissor lift, 19ft. Charges and lifts.",
- category: "Industrial / Aerial",
- manufacturer: "Genie",
- model: "GS-1930",
- condition: "USED_FAIR",
- quantity: 1,
- weightLbs: 2800,
- city: "Reno",
- state: "NV",
- zip: "89501",
- currentBid: 1900,
- bidCount: 7,
- closesInDays: 2,
- terms: "Pickup only.",
- seed: "gs1930",
- anchor: { newRetail: 16000, demandScore: 63 },
- comparables: [
- { kind: "SOLD", title: "Genie GS-1930 used", price: 6500, source: "machinerytrader", soldAt: ago(27) },
- { kind: "ACTIVE", title: "GS-1930 scissor lift", price: 8200, source: "ebay" },
- ],
- },
- {
- source: "PUBLIC_SURPLUS",
- sourceAuctionId: "PS-101100",
- sourceUrl: "https://www.publicsurplus.com/sms/auction/view?auc=101100",
- title: "Lot of 20 iPad 9th Gen Tablets",
- description: "School district surplus, 20x iPad 9th gen, wiped. Working, some screen scratches.",
- category: "Tablets",
- manufacturer: "Apple",
- model: "iPad 9th Gen",
- condition: "USED_GOOD",
- quantity: 20,
- weightLbs: 25,
- city: "San Antonio",
- state: "TX",
- zip: "78205",
- currentBid: 900,
- bidCount: 9,
- closesInDays: 1,
- terms: "Shipping available.",
- seed: "ipad9",
- anchor: { newRetail: 329, demandScore: 80 },
- comparables: [
- { kind: "SOLD", title: "iPad 9th gen used", price: 165, source: "ebay", soldAt: ago(5) },
- { kind: "ACTIVE", title: "iPad 9th gen wifi", price: 210, source: "ebay" },
- ],
- },
- {
- source: "GSA_AUCTIONS",
- sourceAuctionId: "GSA-9330",
- sourceUrl: "https://gsaauctions.gov/auctions/9330",
- title: "FLIR T540 Thermal Imaging Camera",
- description: "Federal surplus thermal camera, FLIR T540, 464x348, case + lenses. Calibrated in-service.",
- category: "Test Equipment",
- manufacturer: "FLIR",
- model: "T540",
- condition: "LIKE_NEW",
- quantity: 1,
- weightLbs: 12,
- city: "Atlanta",
- state: "GA",
- zip: "30303",
- currentBid: 2100,
- bidCount: 6,
- closesInDays: 3,
- terms: "Shipping available. No buyer premium (GSA).",
- seed: "flirt540",
- anchor: { newRetail: 13000, demandScore: 69 },
- comparables: [
- { kind: "SOLD", title: "FLIR T540 used", price: 5200, source: "ebay", soldAt: ago(19) },
- { kind: "ACTIVE", title: "FLIR T540 42deg", price: 6900, source: "ebay" },
- ],
- },
- {
- source: "COUNTY",
- sourceAuctionId: "CTY-3520",
- sourceUrl: "https://county.example.gov/auctions/3520",
- title: "Toro Groundsmaster 4000-D Mower",
- description: "County parks surplus, Toro Groundsmaster 4000-D diesel rotary mower, ~3400 hrs. Runs, mows.",
- category: "Grounds / Mowers",
- manufacturer: "Toro",
- model: "Groundsmaster 4000-D",
- condition: "USED_FAIR",
- quantity: 1,
- weightLbs: 3200,
- city: "Fresno",
- state: "CA",
- zip: "93721",
- currentBid: 3600,
- bidCount: 5,
- closesInDays: 5,
- terms: "Pickup only.",
- seed: "toro4000",
- anchor: { newRetail: 68000, demandScore: 55 },
- comparables: [
- { kind: "SOLD", title: "Toro GM 4000-D used", price: 12500, source: "machinerytrader", soldAt: ago(38) },
- { kind: "ACTIVE", title: "Groundsmaster 4000-D", price: 16900, source: "ebay" },
- ],
- },
- {
- source: "STATE_SURPLUS",
- sourceAuctionId: "CA-DGS-6720",
- sourceUrl: "https://www.dgs.ca.gov/surplus/6720",
- title: "Lot of 50 Poly VVX 450 Desk Phones",
- description: "State office surplus, 50x Poly VVX 450 IP phones with handsets. Working.",
- category: "Telecom",
- manufacturer: "Poly",
- model: "VVX 450",
- condition: "USED_GOOD",
- quantity: 50,
- weightLbs: 90,
- city: "Sacramento",
- state: "CA",
- zip: "95814",
- currentBid: 300,
- bidCount: 2,
- closesInDays: 6,
- terms: "Shipping available.",
- seed: "vvx450",
- anchor: { newRetail: 190, demandScore: 52 },
- comparables: [
- { kind: "SOLD", title: "Poly VVX 450 used", price: 55, source: "ebay", soldAt: ago(13) },
- { kind: "ACTIVE", title: "VVX 450 IP phone", price: 85, source: "ebay" },
- ],
- },
- {
- source: "UNIVERSITY_SURPLUS",
- sourceAuctionId: "UW-5680",
- sourceUrl: "https://surplus.uw.edu/5680",
- title: "Canon EOS R5 + RF 24-70 f/2.8 Kit",
- description: "University media dept surplus, Canon EOS R5 body + RF 24-70mm f/2.8. Low shutter, functional.",
- category: "Cameras",
- manufacturer: "Canon",
- model: "EOS R5",
- condition: "LIKE_NEW",
- quantity: 1,
- weightLbs: 8,
- city: "Seattle",
- state: "WA",
- zip: "98195",
- currentBid: 1800,
- bidCount: 12,
- closesInDays: 1,
- terms: "Shipping available.",
- seed: "eosr5",
- anchor: { newRetail: 5700, demandScore: 76 },
- comparables: [
- { kind: "SOLD", title: "Canon R5 + 24-70 used", price: 3200, source: "ebay", soldAt: ago(4) },
- { kind: "ACTIVE", title: "EOS R5 kit", price: 3800, source: "mpb" },
- ],
- },
- {
- source: "GOVDEALS",
- sourceAuctionId: "GD-465550",
- sourceUrl: "https://www.govdeals.com/index.cfm?fa=Main.Item&itemid=465550",
- title: "Pallet of Assorted Networking Gear (Parts/Repair)",
- description: "Mixed pallet: switches, APs, cabling, mostly untested. Sold for parts/repair.",
- category: "Networking",
- manufacturer: "Mixed",
- model: "Assorted",
- condition: "FOR_PARTS",
- quantity: 1,
- weightLbs: 210,
- city: "Baltimore",
- state: "MD",
- zip: "21202",
- currentBid: 120,
- bidCount: 3,
- closesInDays: 2,
- terms: "Pickup only. Sold as-is for parts.",
- seed: "partspallet",
- anchor: { newRetail: 6000, demandScore: 48 },
- comparables: [
- { kind: "SOLD", title: "Networking parts pallet", price: 700, source: "ebay", soldAt: ago(15) },
- { kind: "ACTIVE", title: "Mixed networking lot", price: 1100, source: "ebay" },
- ],
- },
-];
-
-async function main() {
- console.log("Seeding GovArbitrage…");
-
- // Reset (idempotent seed).
- await prisma.listingEvent.deleteMany();
- await prisma.score.deleteMany();
- await prisma.comparable.deleteMany();
- await prisma.research.deleteMany();
- await prisma.costBreakdown.deleteMany();
- await prisma.buyerLead.deleteMany();
- await prisma.buyerInterestPage.deleteMany();
- await prisma.auctionOutcome.deleteMany();
- await prisma.note.deleteMany();
- await prisma.listing.deleteMany();
-
- // Primary admin. NEVER hardcode a real password in the repo — the actual
- // credential is set out-of-band via `scripts/set-admin.ts` with an env-
- // provided ADMIN_PASSWORD. Here we only ensure the admin ROW exists:
- // - if ADMIN_PASSWORD is provided at seed time, use it;
- // - otherwise, on CREATE use a throwaway random hash (login is unusable until
- // set-admin runs) and on UPDATE leave the existing password untouched so a
- // redeploy never clobbers a real credential set via set-admin.
- const { randomBytes } = await import("node:crypto");
- const adminEmail = process.env.ADMIN_EMAIL || "admin@agentabrams.com";
- const provided = process.env.ADMIN_PASSWORD;
- const createHash = hashPassword(provided || randomBytes(24).toString("hex"));
- await prisma.user.upsert({
- where: { email: adminEmail },
- update: provided ? { passwordHash: hashPassword(provided), role: "ADMIN" } : { role: "ADMIN" },
- create: { email: adminEmail, name: "Admin", role: "ADMIN", passwordHash: createHash },
- });
- console.log(
- `Admin row ensured: ${adminEmail}` +
- (provided ? " (password set from ADMIN_PASSWORD)" : " (set the password via scripts/set-admin.ts)"),
- );
-
- let done = 0;
- for (const s of LISTINGS) {
- const listing = await prisma.listing.create({
- data: {
- source: s.source,
- sourceAuctionId: s.sourceAuctionId,
- sourceUrl: s.sourceUrl,
- title: s.title,
- description: s.description,
- category: s.category,
- manufacturer: s.manufacturer,
- model: s.model,
- condition: s.condition,
- quantity: s.quantity,
- weightLbs: s.weightLbs,
- dimensions: s.dimensions,
- locationCity: s.city,
- locationState: s.state,
- locationZip: s.zip,
- currentBid: s.currentBid,
- bidCount: s.bidCount,
- closingAt: soon(s.closesInDays),
- imageUrls: img(s.seed),
- auctionTerms: s.terms,
- researchStatus: "PENDING",
- },
- });
-
- await prisma.listingEvent.create({
- data: { listingId: listing.id, type: "IMPORTED", message: `Imported from ${s.source}` },
- });
-
- await runResearch(listing.id, { anchor: s.anchor, comparables: s.comparables });
- done++;
- process.stdout.write(` [${done}/${LISTINGS.length}] ${s.title.slice(0, 48)}\n`);
- }
-
- // A sample buyer-interest page + lead on the standout dental chair.
- const dental = await prisma.listing.findFirst({ where: { sourceAuctionId: "GD-448120" } });
- if (dental) {
- await prisma.buyerInterestPage.create({
- data: {
- listingId: dental.id,
- slug: "adec-511-dental-chair",
- headline: "A-dec 511 Dental Chair — Contingent Interest",
- published: true,
- estDelivered: 9500,
- },
- });
- await prisma.buyerLead.create({
- data: {
- listingId: dental.id,
- name: "Dr. Chen",
- email: "chen@example-dental.com",
- offer: 8500,
- contingent: true,
- notes: "Interested if it wins; needs delivery to 94103.",
- },
- });
- await prisma.auctionOutcome.create({
- data: { listingId: dental.id, status: "WATCHING", maxBidSet: 3200 },
- });
- }
-
- console.log(`Seeded ${done} listings with full research, costs, and scores.`);
-}
-
-main()
- .then(async () => {
- await prisma.$disconnect();
- })
- .catch(async (e) => {
- console.error(e);
- await prisma.$disconnect();
- process.exit(1);
- });
diff --git a/govarbitrage/public/.gitkeep b/govarbitrage/public/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/govarbitrage/scripts/hot-deal-alert.ts b/govarbitrage/scripts/hot-deal-alert.ts
deleted file mode 100644
index 4d059c6..0000000
--- a/govarbitrage/scripts/hot-deal-alert.ts
+++ /dev/null
@@ -1,160 +0,0 @@
-// 🔥 HOT DEAL alerter. Finds NEW listings that pass the hot-deal gate (buy-side
-// headroom + proven sell-side demand), emails them via George, and stamps
-// hotAlertedAt so each deal alerts exactly once. Meant to run right after every
-// import refresh. $0 (local DB + internal George send to Steve).
-//
-// Env (from .env): DATABASE_URL, GEORGE_URL, GEORGE_BASIC_AUTH,
-// HOT_TO (default steve@designerwallcoverings.com), DIGEST_FROM_ACCOUNT,
-// APP_URL, HOT_MAX (max deals per email, default 12),
-// HOT_DRY_RUN=1 (print instead of send), plus the HOT_MIN_* thresholds.
-//
-// Run: npx tsx scripts/hot-deal-alert.ts
-
-import { readFileSync } from "node:fs";
-import { fileURLToPath } from "node:url";
-import { dirname, join } from "node:path";
-
-function loadEnv() {
- const root = join(dirname(fileURLToPath(import.meta.url)), "..");
- try {
- const raw = readFileSync(join(root, ".env"), "utf8");
- for (const line of raw.split("\n")) {
- const m = line.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*)\s*$/i);
- if (!m) continue;
- const key = m[1];
- let val = m[2].trim();
- if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
- val = val.slice(1, -1);
- }
- if (process.env[key] === undefined) process.env[key] = val;
- }
- } catch {
- /* rely on ambient env */
- }
-}
-loadEnv();
-
-const { prisma } = await import("../src/lib/db");
-const { findHotDeals } = await import("../src/lib/hot-deals");
-const { formatMoney, formatPercent, countdown } = await import("../src/lib/utils");
-
-const HOT_TO = process.env.HOT_TO || process.env.DIGEST_TO || "steve@designerwallcoverings.com";
-const FROM_ACCOUNT = process.env.DIGEST_FROM_ACCOUNT || "steve-office";
-const APP_URL = process.env.APP_URL || "http://localhost:3737";
-const HOT_MAX = Number(process.env.HOT_MAX || 12);
-
-function escapeHtml(s: string): string {
- return s.replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]!));
-}
-
-type Deal = Awaited<ReturnType<typeof findHotDeals>>[number];
-
-function renderDeal(d: Deal, i: number): string {
- const l = d.listing;
- const closes = l.closingAt ? countdown(l.closingAt) : "Make Offer (no deadline)";
- const loc = [l.locationCity, l.locationState].filter(Boolean).join(", ") || "—";
- // Honesty Gate: confidence badge + conservative figures (never the raw hype).
- const confColor = d.confidence === "HIGH" ? "#166534" : d.confidence === "MEDIUM" ? "#b45309" : "#64748b";
- const confBg = d.confidence === "HIGH" ? "#dcfce7" : d.confidence === "MEDIUM" ? "#fef3c7" : "#f1f5f9";
- const confBadge = `<span style="background:${confBg};color:${confColor};padding:1px 6px;border-radius:4px;font-weight:700;font-size:11px">${d.confidence} confidence</span>`;
- const roiText = `${formatPercent(d.roiConservative)}${d.roiCapped ? "+" : ""}`;
- const sellProof =
- d.buyerLeadCount > 0
- ? `<span style="background:#dcfce7;color:#166534;padding:1px 6px;border-radius:4px;font-weight:700">${d.buyerLeadCount} buyer lead${d.buyerLeadCount > 1 ? "s" : ""}${d.buyerLeadTop ? ` · top offer ${formatMoney(d.buyerLeadTop)}` : ""}</span>`
- : `<span style="color:#166534">${d.comparableCount} comps · ${formatPercent(d.probSale)} sell prob</span>`;
- return `<div style="border:1px solid #fecaca;border-left:4px solid #ef4444;border-radius:8px;margin:0 0 14px;padding:12px">
- <div style="font-size:15px;font-weight:700">🔥 #${i + 1} · <a href="${APP_URL}/listings/${l.id}" style="color:#b91c1c;text-decoration:none">${escapeHtml(l.title)}</a></div>
- <div style="color:#64748b;font-size:12px;margin:2px 0 8px">
- ${l.source.replace(/_/g, " ")} · #${escapeHtml(l.sourceAuctionId)} · ${loc} · closes ${closes}
- ${l.sourceUrl ? ` · <a href="${escapeHtml(l.sourceUrl)}" style="color:#2563eb">source ↗</a>` : ""}
- </div>
- <table style="width:100%;border-collapse:collapse;font-size:13px">
- <tr>
- <td style="padding:3px 8px 3px 0;color:#166534;font-weight:700;width:50%">SELL side — can you flip it?</td>
- <td style="padding:3px 8px 3px 0;color:#b91c1c;font-weight:700">BUY side — is there room?</td>
- </tr>
- <tr valign="top">
- <td style="padding-right:8px">
- <div>Est. resale (conservative): <b>${formatMoney(d.expectedSaleLow)}</b> ${confBadge}</div>
- <div>Demand score: <b>${Math.round(d.demandScore)}/100</b></div>
- <div>Sell proof: ${sellProof}</div>
- </td>
- <td>
- <div>Current bid: <b>${formatMoney(d.currentBid)}</b></div>
- <div>Recommended max bid: <b>${formatMoney(d.recMax)}</b> <span style="color:#64748b">(${formatPercent(d.headroom)} headroom)</span></div>
- <div>Est. ROI: <b>${roiText}</b> <span style="color:#64748b">(low-side)</span></div>
- </td>
- </tr>
- </table>
- <div style="font-size:11px;color:#94a3b8;margin-top:6px">⚠︎ ${escapeHtml(d.disclaimer)}</div>
- <div style="font-size:11px;color:#64748b;margin-top:3px">${escapeHtml(d.score.explanation)}</div>
- </div>`;
-}
-
-function buildHtml(deals: Deal[]): string {
- const when = new Date().toLocaleString("en-US", { dateStyle: "medium", timeStyle: "short" });
- return `<div style="font-family:-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#0f172a;max-width:820px">
- <h2 style="margin:0 0 4px;color:#b91c1c">🔥 ${deals.length} HOT DEAL${deals.length > 1 ? "S" : ""} — curated, verified-demand, early</h2>
- <div style="color:#64748b;font-size:13px;margin-bottom:14px">${when} · each cleared the demand + bid-headroom gate; figures are conservative heuristic estimates (confidence-labeled) — always verify comps before bidding · act before close</div>
- ${deals.map(renderDeal).join("")}
- <p style="margin-top:8px"><a href="${APP_URL}" style="color:#2563eb">Open the dashboard →</a></p>
- <p style="color:#94a3b8;font-size:11px">HOT gate: score≥${process.env.HOT_MIN_SCORE || 75}, arbitrage≥${process.env.HOT_MIN_ARBITRAGE || 70}, demand≥${process.env.HOT_MIN_DEMAND || 50}, net≥$${process.env.HOT_MIN_NET || 150}, ROI≥${Math.round(Number(process.env.HOT_MIN_ROI || 0.5) * 100)}%, bid headroom≥${Math.round(Number(process.env.HOT_MIN_HEADROOM_PCT || 0.15) * 100)}%. Verify comps before bidding.</p>
- </div>`;
-}
-
-async function sendViaGeorge(subject: string, html: string) {
- const base = process.env.GEORGE_URL;
- const auth = process.env.GEORGE_BASIC_AUTH;
- if (!base || !auth) throw new Error("GEORGE_URL / GEORGE_BASIC_AUTH not set");
- const res = await fetch(`${base}/api/send`, {
- method: "POST",
- headers: { "Content-Type": "application/json", Authorization: `Basic ${auth}` },
- body: JSON.stringify({ account: FROM_ACCOUNT, to: HOT_TO, subject, body: html }),
- });
- const text = await res.text();
- if (!res.ok) throw new Error(`George send failed ${res.status}: ${text.slice(0, 300)}`);
- return text;
-}
-
-async function main() {
- const deals = await findHotDeals({ onlyUnalerted: true, limit: HOT_MAX });
- if (deals.length === 0) {
- console.log(`[${new Date().toISOString()}] No new hot deals. No alert sent.`);
- await prisma.$disconnect();
- return;
- }
- const subject = `🔥 ${deals.length} HOT DEAL${deals.length > 1 ? "S" : ""} on GovArbitrage`;
- const html = buildHtml(deals);
-
- if (process.env.HOT_DRY_RUN === "1") {
- const { writeFileSync, mkdirSync } = await import("node:fs");
- mkdirSync("logs", { recursive: true });
- writeFileSync("logs/hot-deal-preview.html", html);
- console.log(`[DRY RUN] to=${HOT_TO} subject="${subject}" (${deals.length} deals)`);
- deals.forEach((d, i) =>
- console.log(
- ` ${i + 1}. ${d.listing.title.slice(0, 44)} — bid ${Math.round(d.currentBid)}→max ${Math.round(d.recMax)}, net ${Math.round(d.netProfit)}, ROI ${Math.round(d.roi * 100)}%`,
- ),
- );
- console.log("Preview: logs/hot-deal-preview.html (NOT marking alerted in dry-run)");
- await prisma.$disconnect();
- return;
- }
-
- const result = await sendViaGeorge(subject, html);
- // Stamp each alerted deal so it never re-alerts.
- const ids = deals.map((d) => d.listing.id);
- await prisma.listing.updateMany({
- where: { id: { in: ids } },
- data: { hotAlertedAt: new Date() },
- });
- console.log(`Sent "${subject}" to ${HOT_TO}; marked ${ids.length} alerted. ${result.slice(0, 120)}`);
- await prisma.$disconnect();
-}
-
-main()
- .then(() => process.exit(0))
- .catch((e) => {
- console.error(`[hot-deal-alert] ${new Date().toISOString()} ERROR:`, e.message);
- process.exit(1);
- });
diff --git a/govarbitrage/scripts/import-apify-govdeals.ts b/govarbitrage/scripts/import-apify-govdeals.ts
deleted file mode 100644
index 47ff3b0..0000000
--- a/govarbitrage/scripts/import-apify-govdeals.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-// Import GovDeals listings scraped by the Apify actor into GovArbitrage.
-// Reads an already-finished dataset (free) — does NOT trigger a new paid run.
-//
-// Usage: APIFY_TOKEN=... npx tsx scripts/import-apify-govdeals.ts [datasetId]
-// - datasetId arg or APIFY_GOVDEALS_DATASET env → read that dataset
-// - otherwise → read the actor's most recent SUCCEEDED run
-
-import { fetchApifyDataset, fetchApifyLastRun } from "../src/importers/apify-govdeals";
-import { ingestMany } from "../src/importers/ingest";
-import { prisma } from "../src/lib/db";
-
-async function main() {
- const datasetId = process.argv[2] || process.env.APIFY_GOVDEALS_DATASET;
- const rows = datasetId ? await fetchApifyDataset(datasetId) : await fetchApifyLastRun();
- console.log(`Fetched ${rows.length} GovDeals listings via Apify (${datasetId ? `dataset ${datasetId}` : "last run"}). Ingesting…`);
-
- const results = await ingestMany(rows, { useAI: false });
- const created = results.filter((r) => r.ok && r.created).length;
- const updated = results.filter((r) => r.ok && !r.created).length;
- const failed = results.filter((r) => !r.ok);
- console.log(`Done: ${created} created, ${updated} updated, ${failed.length} failed.`);
- failed.slice(0, 5).forEach((f) => console.log(` ✗ ${f.title}: ${f.error}`));
- await prisma.$disconnect();
-}
-
-main().catch(async (e) => {
- console.error("[import-apify-govdeals] ERROR:", e.message);
- await prisma.$disconnect();
- process.exit(1);
-});
diff --git a/govarbitrage/scripts/import-govdeals-free.ts b/govarbitrage/scripts/import-govdeals-free.ts
deleted file mode 100644
index 2424ff9..0000000
--- a/govarbitrage/scripts/import-govdeals-free.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-// FREE daily GovDeals refresh — hits GovDeals' own backend API directly ($0,
-// no Apify, no browser). Replaces the paid Apify path.
-//
-// Usage: npx tsx scripts/import-govdeals-free.ts [limit] (default 120)
-
-import { fetchGovdealsFree } from "../src/importers/govdeals-free";
-import { ingestMany } from "../src/importers/ingest";
-import { prisma } from "../src/lib/db";
-
-// Liquidity Services marketplaces, all on the same free API. GovDeals gets the
-// most; the industrial siblings a smaller slice.
-const MARKETS: { biz: string; limit: number }[] = [
- { biz: "GD", limit: Number(process.argv[2] || 120) },
- { biz: "GI", limit: 60 },
- { biz: "NI", limit: 60 },
-];
-
-async function main() {
- let created = 0, updated = 0, failed = 0, fetched = 0;
- for (const { biz, limit } of MARKETS) {
- console.log(`[${new Date().toISOString()}] Fetching ${limit} newest ${biz} listings (FREE maestro API)…`);
- const rows = await fetchGovdealsFree({ limit, businessId: biz });
- fetched += rows.length;
- const results = await ingestMany(rows, { useAI: false });
- created += results.filter((r) => r.ok && r.created).length;
- updated += results.filter((r) => r.ok && !r.created).length;
- failed += results.filter((r) => !r.ok).length;
- }
- console.log(`Done: fetched ${fetched}, ${created} created, ${updated} updated, ${failed} failed. Cost: $0 (free API).`);
- await prisma.$disconnect();
-}
-
-main().catch(async (e) => {
- console.error("[import-govdeals-free] ERROR:", e.message);
- await prisma.$disconnect();
- process.exit(1);
-});
diff --git a/govarbitrage/scripts/import-govplanet-free.ts b/govarbitrage/scripts/import-govplanet-free.ts
deleted file mode 100644
index 8836a33..0000000
--- a/govarbitrage/scripts/import-govplanet-free.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-// FREE GovPlanet import via embedded quickviews JSON in search HTML. $0, no browser.
-// Usage: npx tsx scripts/import-govplanet-free.ts [limit]
-
-import { fetchGovPlanetFree } from "../src/importers/govplanet-free";
-import { ingestMany } from "../src/importers/ingest";
-import { prisma } from "../src/lib/db";
-
-async function main() {
- const limit = Number(process.argv[2] || 100);
- console.log(
- `[${new Date().toISOString()}] Fetching ${limit} GovPlanet items via quickviews JSON (FREE, USD)…`,
- );
- const rows = await fetchGovPlanetFree({ limit });
- console.log(`Fetched ${rows.length}. Ingesting…`);
- const results = await ingestMany(rows, { useAI: false });
- const created = results.filter((r) => r.ok && r.created).length;
- const updated = results.filter((r) => r.ok && !r.created).length;
- const failed = results.filter((r) => !r.ok).length;
- console.log(
- `Done: ${created} created, ${updated} updated, ${failed} failed. Cost: $0.`,
- );
- await prisma.$disconnect();
-}
-
-main().catch(async (e) => {
- console.error("[import-govplanet-free] ERROR:", e.message);
- await prisma.$disconnect();
- process.exit(1);
-});
diff --git a/govarbitrage/scripts/import-grays.ts b/govarbitrage/scripts/import-grays.ts
deleted file mode 100644
index 7096570..0000000
--- a/govarbitrage/scripts/import-grays.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-// FREE GraysOnline (AU) import via Algolia. $0.
-// Usage: npx tsx scripts/import-grays.ts [limit]
-
-import { fetchGraysFree } from "../src/importers/grays-free";
-import { ingestMany } from "../src/importers/ingest";
-import { prisma } from "../src/lib/db";
-
-async function main() {
- const limit = Number(process.argv[2] || 100);
- console.log(`[${new Date().toISOString()}] Fetching ${limit} GraysOnline (AU) lots via Algolia (FREE)…`);
- const rows = await fetchGraysFree({ limit });
- console.log(`Fetched ${rows.length}. Ingesting…`);
- const results = await ingestMany(rows, { useAI: false });
- const created = results.filter((r) => r.ok && r.created).length;
- const updated = results.filter((r) => r.ok && !r.created).length;
- const failed = results.filter((r) => !r.ok).length;
- console.log(`Done: ${created} created, ${updated} updated, ${failed} failed. Cost: $0.`);
- await prisma.$disconnect();
-}
-
-main().catch(async (e) => {
- console.error("[import-grays] ERROR:", e.message);
- await prisma.$disconnect();
- process.exit(1);
-});
diff --git a/govarbitrage/scripts/import-gsa.ts b/govarbitrage/scripts/import-gsa.ts
deleted file mode 100644
index 9148c2f..0000000
--- a/govarbitrage/scripts/import-gsa.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-// Import live GSA Auctions API listings into GovArbitrage (real federal-surplus
-// data — no scraping). Runs the deterministic research/cost/scoring pipeline
-// (heuristic/local; the worker can AI-enrich later).
-//
-// Usage: npx tsx scripts/import-gsa.ts [limit] (default 40)
-
-import { fetchGsaAuctions } from "../src/importers/gsa";
-import { ingestMany } from "../src/importers/ingest";
-import { prisma } from "../src/lib/db";
-
-async function main() {
- const limit = Number(process.argv[2] || 40);
- console.log(`Fetching live GSA auctions (limit ${limit})…`);
- const rows = await fetchGsaAuctions({ limit, onlyOpen: false });
- console.log(`Fetched ${rows.length} listings. Ingesting + scoring…`);
-
- const results = await ingestMany(rows, { useAI: false });
- const created = results.filter((r) => r.ok && r.created).length;
- const updated = results.filter((r) => r.ok && !r.created).length;
- const failed = results.filter((r) => !r.ok);
-
- console.log(`Done: ${created} created, ${updated} updated, ${failed.length} failed.`);
- if (failed.length) failed.slice(0, 5).forEach((f) => console.log(` ✗ ${f.title}: ${f.error}`));
- await prisma.$disconnect();
-}
-
-main().catch(async (e) => {
- console.error("[import-gsa] ERROR:", e.message);
- await prisma.$disconnect();
- process.exit(1);
-});
diff --git a/govarbitrage/scripts/import-municibid-free.ts b/govarbitrage/scripts/import-municibid-free.ts
deleted file mode 100644
index 6e542bb..0000000
--- a/govarbitrage/scripts/import-municibid-free.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-// FREE Municibid import via server-rendered /browse HTML parsing. $0, no browser.
-// Usage: npx tsx scripts/import-municibid-free.ts [limit]
-
-import { fetchMunicibidFree } from "../src/importers/municibid-free";
-import { ingestMany } from "../src/importers/ingest";
-import { prisma } from "../src/lib/db";
-
-async function main() {
- const limit = Number(process.argv[2] || 100);
- console.log(
- `[${new Date().toISOString()}] Fetching ${limit} Municibid listings via /browse HTML (FREE)…`,
- );
- const rows = await fetchMunicibidFree({ limit });
- console.log(`Fetched ${rows.length}. Ingesting…`);
- const results = await ingestMany(rows, { useAI: false });
- const created = results.filter((r) => r.ok && r.created).length;
- const updated = results.filter((r) => r.ok && !r.created).length;
- const failed = results.filter((r) => !r.ok).length;
- console.log(
- `Done: ${created} created, ${updated} updated, ${failed} failed. Cost: $0.`,
- );
- await prisma.$disconnect();
-}
-
-main().catch(async (e) => {
- console.error("[import-municibid-free] ERROR:", e.message);
- await prisma.$disconnect();
- process.exit(1);
-});
diff --git a/govarbitrage/scripts/import-publicsurplus-free.ts b/govarbitrage/scripts/import-publicsurplus-free.ts
deleted file mode 100644
index a9719ba..0000000
--- a/govarbitrage/scripts/import-publicsurplus-free.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-// FREE Public Surplus import via server-rendered category HTML. $0, no browser.
-// Usage: npx tsx scripts/import-publicsurplus-free.ts [limit]
-
-import { fetchPublicSurplusFree } from "../src/importers/publicsurplus-free";
-import { ingestMany } from "../src/importers/ingest";
-import { prisma } from "../src/lib/db";
-
-async function main() {
- const limit = Number(process.argv[2] || 100);
- console.log(
- `[${new Date().toISOString()}] Fetching ${limit} Public Surplus listings via /sms/browse/cataucs HTML (FREE)…`,
- );
- const rows = await fetchPublicSurplusFree({ limit });
- console.log(`Fetched ${rows.length}. Ingesting…`);
- const results = await ingestMany(rows, { useAI: false });
- const created = results.filter((r) => r.ok && r.created).length;
- const updated = results.filter((r) => r.ok && !r.created).length;
- const failed = results.filter((r) => !r.ok).length;
- console.log(
- `Done: ${created} created, ${updated} updated, ${failed} failed. Cost: $0.`,
- );
- await prisma.$disconnect();
-}
-
-main().catch(async (e) => {
- console.error("[import-publicsurplus-free] ERROR:", e.message);
- await prisma.$disconnect();
- process.exit(1);
-});
diff --git a/govarbitrage/scripts/liveness-sweep.ts b/govarbitrage/scripts/liveness-sweep.ts
deleted file mode 100644
index 1c9a933..0000000
--- a/govarbitrage/scripts/liveness-sweep.ts
+++ /dev/null
@@ -1,141 +0,0 @@
-// Fast dead-listing removal. Keeps the live grid honest so Steve never chases
-// an item that's already gone. Two tiers:
-//
-// Tier 1 (instant, $0, no network): any ACTIVE listing whose closingAt is in
-// the past → ENDED. This clears the vast majority the moment they close.
-// Run this often (e.g. every 10 min) — it's a single indexed UPDATE.
-//
-// Tier 2 (network verify, rate-limited): re-fetch a batch of ACTIVE listings
-// that have NO closingAt (make-offer items, e.g. GovPlanet) or are stalest
-// by livenessCheckedAt. Definitive "gone" signals (HTTP 404/410, or explicit
-// "no longer available / has ended / not found" text) → REMOVED. Anything
-// else is treated as still-live (never remove on a transient 5xx/timeout).
-//
-// Run: npx tsx scripts/liveness-sweep.ts [tier2Batch] (default 40)
-
-import { readFileSync } from "node:fs";
-import { fileURLToPath } from "node:url";
-import { dirname, join } from "node:path";
-
-function loadEnv() {
- const root = join(dirname(fileURLToPath(import.meta.url)), "..");
- try {
- const raw = readFileSync(join(root, ".env"), "utf8");
- for (const line of raw.split("\n")) {
- const m = line.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*)\s*$/i);
- if (!m) continue;
- const key = m[1];
- let val = m[2].trim();
- if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
- val = val.slice(1, -1);
- }
- if (process.env[key] === undefined) process.env[key] = val;
- }
- } catch {
- /* ambient env */
- }
-}
-loadEnv();
-
-const { prisma } = await import("../src/lib/db");
-
-const UA =
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " +
- "(KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36";
-
-// Text markers that DEFINITIVELY mean the lot is gone. Kept conservative to
-// avoid false removals.
-const GONE_MARKERS = [
- "no longer available",
- "this auction has ended",
- "auction has ended",
- "listing has ended",
- "item not found",
- "page not found",
- "the resource cannot be found",
- "no longer active",
- "has been removed",
- "sale has closed",
-];
-
-async function tier1ExpireByClock(): Promise<number> {
- const res = await prisma.listing.updateMany({
- where: { listingStatus: "ACTIVE", closingAt: { lt: new Date() } },
- data: { listingStatus: "ENDED", endedAt: new Date() },
- });
- return res.count;
-}
-
-interface VerifyResult { gone: boolean; live: boolean }
-
-async function verifyOne(url: string): Promise<VerifyResult> {
- try {
- const res = await fetch(url, {
- headers: { "User-Agent": UA, Accept: "text/html,*/*" },
- redirect: "follow",
- });
- if (res.status === 404 || res.status === 410) return { gone: true, live: false };
- if (!res.ok) return { gone: false, live: false }; // transient — don't touch
- const body = (await res.text()).toLowerCase();
- if (GONE_MARKERS.some((m) => body.includes(m))) return { gone: true, live: false };
- return { gone: false, live: true };
- } catch {
- return { gone: false, live: false }; // network error — don't remove
- }
-}
-
-async function tier2VerifyBatch(batch: number): Promise<{ checked: number; removed: number }> {
- // Prioritize items with no clock (can't expire via Tier 1) then stalest checks.
- const candidates = await prisma.listing.findMany({
- where: { listingStatus: "ACTIVE", sourceUrl: { not: null } },
- orderBy: [{ closingAt: { sort: "asc", nulls: "first" } }, { livenessCheckedAt: { sort: "asc", nulls: "first" } }],
- take: batch,
- select: { id: true, sourceUrl: true, title: true },
- });
-
- let removed = 0;
- for (const l of candidates) {
- if (!l.sourceUrl) continue;
- const { gone, live } = await verifyOne(l.sourceUrl);
- const now = new Date();
- if (gone) {
- await prisma.listing.update({
- where: { id: l.id },
- data: { listingStatus: "REMOVED", endedAt: now, livenessCheckedAt: now },
- });
- await prisma.listingEvent
- .create({ data: { listingId: l.id, type: "STATUS_CHANGE", message: "Removed: no longer available on source" } })
- .catch(() => {});
- removed++;
- } else if (live) {
- await prisma.listing.update({
- where: { id: l.id },
- data: { livenessCheckedAt: now, lastSeenAt: now },
- });
- } else {
- // transient — just record we looked, don't change status
- await prisma.listing.update({ where: { id: l.id }, data: { livenessCheckedAt: now } });
- }
- await new Promise((r) => setTimeout(r, 200)); // be polite
- }
- return { checked: candidates.length, removed };
-}
-
-async function main() {
- const batch = Number(process.argv[2] || process.env.LIVENESS_TIER2_BATCH || 40);
- const t0 = Date.now();
- const expired = await tier1ExpireByClock();
- const { checked, removed } = await tier2VerifyBatch(batch);
- const ms = Date.now() - t0;
- console.log(
- `[${new Date().toISOString()}] liveness: tier1 expired=${expired}, tier2 checked=${checked} removed=${removed} (${ms}ms). Cost: $0.`,
- );
- await prisma.$disconnect();
-}
-
-main()
- .then(() => process.exit(0))
- .catch((e) => {
- console.error(`[liveness-sweep] ${new Date().toISOString()} ERROR:`, e.message);
- process.exit(1);
- });
diff --git a/govarbitrage/scripts/probe-govdeals.ts b/govarbitrage/scripts/probe-govdeals.ts
deleted file mode 100644
index 43cb30b..0000000
--- a/govarbitrage/scripts/probe-govdeals.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-// One-off: discover live GovDeals item URLs by rendering the Angular SPA and
-// harvesting item-detail links. Prints candidates so we can point scrapeUrl at
-// a real, currently-open listing.
-import { chromium } from "playwright";
-
-const ENTRY = process.argv[2] || "https://www.govdeals.com/";
-const HEADED = process.env.HEADED === "1";
-
-async function main() {
- const browser = await chromium.launch({
- headless: !HEADED,
- args: ["--disable-blink-features=AutomationControlled"],
- });
- const context = await browser.newContext({
- userAgent:
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
- viewport: { width: 1400, height: 900 },
- locale: "en-US",
- timezoneId: "America/Los_Angeles",
- });
- // Mask the headless/automation tells before any page script runs.
- await context.addInitScript(() => {
- Object.defineProperty(navigator, "webdriver", { get: () => undefined });
- // @ts-expect-error test fingerprint props
- window.chrome = { runtime: {} };
- Object.defineProperty(navigator, "plugins", { get: () => [1, 2, 3] });
- Object.defineProperty(navigator, "languages", { get: () => ["en-US", "en"] });
- });
- const page = await context.newPage();
- try {
- console.log("goto", ENTRY);
- await page.goto(ENTRY, { waitUntil: "networkidle", timeout: 45_000 }).catch((e) => console.log("nav warn:", e.message));
- await page.waitForTimeout(4000);
- console.log("title:", await page.title());
- console.log("url:", page.url());
-
- const links = await page.evaluate(() => {
- const hrefs = Array.from(document.querySelectorAll("a"))
- .map((a) => (a as HTMLAnchorElement).href)
- .filter((h) => /asset|\/item|itemid|\/listing/i.test(h));
- return Array.from(new Set(hrefs)).slice(0, 15);
- });
- console.log(`\nfound ${links.length} item-like links:`);
- links.forEach((l) => console.log(" ", l));
-
- // Fallback: sample any anchor hrefs so we can see the URL shape.
- if (links.length === 0) {
- const sample = await page.evaluate(() =>
- Array.from(new Set(Array.from(document.querySelectorAll("a")).map((a) => (a as HTMLAnchorElement).href)))
- .filter((h) => h.includes("govdeals.com"))
- .slice(0, 20),
- );
- console.log("\nno item links; sample of on-site anchors:");
- sample.forEach((s) => console.log(" ", s));
- }
- } finally {
- await browser.close();
- }
-}
-
-main();
diff --git a/govarbitrage/scripts/seed-digest-snapshots.ts b/govarbitrage/scripts/seed-digest-snapshots.ts
deleted file mode 100644
index 5525b05..0000000
--- a/govarbitrage/scripts/seed-digest-snapshots.ts
+++ /dev/null
@@ -1,117 +0,0 @@
-// Seed the public /deals archive:
-// 1. A REAL capture for today's slot via captureDigestSnapshot() — freezes
-// whatever currently clears the hot-deal gate (may be 0 deals; the
-// archive renders that honestly).
-// 2. A clearly-marked FABRICATED edition for 2026-07-12 with realistic
-// deals so the teaser rendering (confidence labels, ROI bands, withheld
-// numbers) is actually exercised before launch. Every fabricated deal's
-// disclaimer says SEED DATA. Delete before go-live:
-// DELETE FROM "DigestSnapshot" WHERE date = '2026-07-12';
-//
-// Run: npx tsx scripts/seed-digest-snapshots.ts
-
-import { readFileSync } from "node:fs";
-import { fileURLToPath } from "node:url";
-import { dirname, join } from "node:path";
-import type { Prisma } from "@prisma/client";
-
-function loadEnv() {
- const root = join(dirname(fileURLToPath(import.meta.url)), "..");
- try {
- const raw = readFileSync(join(root, ".env"), "utf8");
- for (const line of raw.split("\n")) {
- const m = line.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*)\s*$/i);
- if (!m) continue;
- const key = m[1];
- let val = m[2].trim();
- if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
- val = val.slice(1, -1);
- }
- if (process.env[key] === undefined) process.env[key] = val;
- }
- } catch {
- /* no .env — rely on ambient env */
- }
-}
-loadEnv();
-
-const { prisma } = await import("../src/lib/db");
-const { captureDigestSnapshot, currentSlot } = await import("../src/lib/digest-snapshot");
-type SnapshotDeal = import("../src/lib/digest-snapshot").SnapshotDeal;
-
-const SEED_DATE = "2026-07-12";
-const SEED_DISCLAIMER = "SEED DATA — fabricated example for pre-launch rendering tests, not a real listing.";
-
-const seedDeals: SnapshotDeal[] = [
- {
- rank: 1,
- title: "2018 John Deere 320G Skid Steer (1,240 hrs) — County Fleet Surplus",
- source: "GOVDEALS",
- locationCity: "Bakersfield",
- locationState: "CA",
- currentBid: 6200,
- recMax: 14800,
- expectedSaleLow: 21500,
- confidence: "HIGH",
- roiConservative: 0.58,
- roiCapped: false,
- disclaimer: SEED_DISCLAIMER,
- closingAt: "2026-07-14T19:00:00.000Z",
- sourceUrl: null,
- },
- {
- rank: 2,
- title: "Pallet of 24 Dell Latitude 5520 Laptops (i5/16GB, wiped) — School District IT Refresh",
- source: "PUBLICSURPLUS",
- locationCity: "Mesa",
- locationState: "AZ",
- currentBid: 1150,
- recMax: 3400,
- expectedSaleLow: 5300,
- confidence: "MEDIUM",
- roiConservative: 0.49,
- roiCapped: false,
- disclaimer: SEED_DISCLAIMER,
- closingAt: "2026-07-13T22:30:00.000Z",
- sourceUrl: null,
- },
- {
- rank: 3,
- title: "2015 Ford F-250 XL 4x4 Utility Truck w/ Liftgate — Municipal Water Dept.",
- source: "MUNICIBID",
- locationCity: "Spokane",
- locationState: "WA",
- currentBid: 3875,
- recMax: 9200,
- expectedSaleLow: 12800,
- confidence: "LOW",
- roiConservative: 0.41,
- roiCapped: true,
- disclaimer: SEED_DISCLAIMER,
- closingAt: null, // make-offer, no deadline
- sourceUrl: null,
- },
-];
-
-async function main() {
- const real = await captureDigestSnapshot(currentSlot());
- console.log(`Real capture: ${real.date} ${real.slot} — ${real.dealCount} deal(s)`);
-
- const dealsJson = seedDeals as unknown as Prisma.InputJsonValue;
- const fabricated = await prisma.digestSnapshot.upsert({
- where: { date_slot: { date: SEED_DATE, slot: "AM" } },
- create: { date: SEED_DATE, slot: "AM", dealsJson, dealCount: seedDeals.length, isSeed: true },
- update: { dealsJson, dealCount: seedDeals.length, isSeed: true },
- });
- console.log(`Fabricated seed edition: ${fabricated.date} ${fabricated.slot} — ${fabricated.dealCount} deal(s) (SEED DATA)`);
-}
-
-main()
- .then(async () => {
- await prisma.$disconnect();
- })
- .catch(async (e) => {
- console.error(e);
- await prisma.$disconnect();
- process.exit(1);
- });
diff --git a/govarbitrage/scripts/send-digest.ts b/govarbitrage/scripts/send-digest.ts
deleted file mode 100644
index 9c6993c..0000000
--- a/govarbitrage/scripts/send-digest.ts
+++ /dev/null
@@ -1,256 +0,0 @@
-// Twice-daily "Top 10 Opportunities" email digest.
-// Ranks still-open auctions by Overall Opportunity score and emails the top 10
-// via George (the DW Gmail HTTP agent). Scheduled by launchd at 06:00 and 17:00.
-//
-// Env (from the project .env, loaded below):
-// DATABASE_URL - Postgres (required)
-// GEORGE_URL - George base URL (required to send)
-// GEORGE_BASIC_AUTH - base64 "user:pass" for George Basic Auth (required)
-// DIGEST_TO - recipient (default steve@designerwallcoverings.com)
-// DIGEST_FROM_ACCOUNT - George account (default steve-office)
-// APP_URL - base URL for listing links (default http://localhost:3737)
-// DIGEST_DRY_RUN=1 - print the email instead of sending
-//
-// Run: npx tsx scripts/send-digest.ts
-
-import { readFileSync } from "node:fs";
-import { fileURLToPath } from "node:url";
-import { dirname, join } from "node:path";
-
-// --- minimal .env loader (don't rely on Prisma's dotenv side-effect) ----------
-function loadEnv() {
- const root = join(dirname(fileURLToPath(import.meta.url)), "..");
- try {
- const raw = readFileSync(join(root, ".env"), "utf8");
- for (const line of raw.split("\n")) {
- const m = line.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*)\s*$/i);
- if (!m) continue;
- const key = m[1];
- let val = m[2].trim();
- if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
- val = val.slice(1, -1);
- }
- if (process.env[key] === undefined) process.env[key] = val;
- }
- } catch {
- /* no .env — rely on ambient env */
- }
-}
-loadEnv();
-
-const { topRankedOpportunities } = await import("../src/lib/digest-top");
-const { prisma } = await import("../src/lib/db");
-const { formatMoney, formatPercent, countdown } = await import("../src/lib/utils");
-
-const DIGEST_TO = process.env.DIGEST_TO || "steve@designerwallcoverings.com";
-const FROM_ACCOUNT = process.env.DIGEST_FROM_ACCOUNT || "steve-office";
-const APP_URL = process.env.APP_URL || "http://localhost:3737";
-
-const n = (d: unknown): number => (d == null ? 0 : Number(d));
-
-type Detail = NonNullable<Awaited<ReturnType<typeof fetchDetails>>>[number];
-
-/** Rank still-open auctions by Overall Opportunity and return the top-10 ids in order.
- * Shared with the skeptic agent (src/lib/digest-top.ts) so the adversarial gate
- * audits exactly what this digest emails. */
-async function topTenIds(): Promise<string[]> {
- const rows = await topRankedOpportunities({ limit: 10, openOnly: true });
- return rows.map((r) => r.id);
-}
-
-/**
- * CRITICAL skeptic findings from the MOST RECENT completed skeptic run, keyed
- * by listingId. Used to annotate (not drop) flagged items in the email.
- */
-async function skepticCriticalFlags(ids: string[]): Promise<Map<string, string>> {
- const flags = new Map<string, string>();
- const lastRun = await prisma.agentRun.findFirst({
- where: { agent: "skeptic", status: "OK" },
- orderBy: { startedAt: "desc" },
- });
- if (!lastRun) return flags;
- const findings = await prisma.agentFinding.findMany({
- where: { runId: lastRun.id, severity: "CRITICAL", listingId: { in: ids } },
- orderBy: { createdAt: "asc" },
- });
- for (const f of findings) {
- if (f.listingId && !flags.has(f.listingId)) flags.set(f.listingId, f.title);
- }
- return flags;
-}
-
-/** Fetch full research + cost + scores for the given ids, preserving order. */
-async function fetchDetails(ids: string[]) {
- const listings = await prisma.listing.findMany({
- where: { id: { in: ids } },
- include: { research: true, costBreakdown: true, scores: true },
- });
- const byId = new Map(listings.map((l) => [l.id, l]));
- return ids.map((id) => byId.get(id)).filter((x): x is NonNullable<typeof x> => !!x);
-}
-
-function kv(label: string, value: string, strong = false): string {
- return `<tr>
- <td style="padding:2px 6px 2px 0;color:#64748b">${label}</td>
- <td style="padding:2px 0;text-align:right;font-variant-numeric:tabular-nums${strong ? ";font-weight:700" : ""}">${value}</td>
- </tr>`;
-}
-
-function valuationTable(r: NonNullable<Detail["research"]>): string {
- return `<table style="border-collapse:collapse;font-size:12px;width:100%">
- ${kv("New Retail", formatMoney(n(r.newRetail)))}
- ${kv("New Replacement", formatMoney(n(r.newReplacement)))}
- ${kv("Avg Retail", formatMoney(n(r.avgRetail)))}
- ${kv("Used Low / Avg / High", `${formatMoney(n(r.usedLow))} / ${formatMoney(n(r.usedSoldPrice))} / ${formatMoney(n(r.usedHigh))}`)}
- ${kv("Used Asking", formatMoney(n(r.usedAskingPrice)))}
- ${kv("Wholesale", formatMoney(n(r.wholesaleValue)))}
- ${kv("Liquidation", formatMoney(n(r.liquidationValue)))}
- ${kv("Sell Today", formatMoney(n(r.sellTodayValue)))}
- ${kv("7 / 30 / 90-Day", `${formatMoney(n(r.value7Day))} / ${formatMoney(n(r.value30Day))} / ${formatMoney(n(r.value90Day))}`)}
- ${kv("Expected Sale", formatMoney(n(r.expectedSalePrice)), true)}
- ${kv("Prob. of Sale", formatPercent(n(r.probabilityOfSale)))}
- ${kv("Days to Sell", `${r.daysUntilSold ?? "—"}`)}
- ${kv("Confidence", `${Math.round(n(r.confidenceScore))}/100`)}
- </table>`;
-}
-
-function costTable(c: NonNullable<Detail["costBreakdown"]>): string {
- return `<table style="border-collapse:collapse;font-size:12px;width:100%">
- ${kv("Winning Bid", formatMoney(n(c.winningBid)))}
- ${kv("Buyer Premium", formatMoney(n(c.buyerPremium)))}
- ${kv("Sales Tax", formatMoney(n(c.salesTax)))}
- ${kv("Shipping / Freight", `${formatMoney(n(c.shipping))} / ${formatMoney(n(c.freight))}`)}
- ${kv("Insurance / Packing", `${formatMoney(n(c.insurance))} / ${formatMoney(n(c.packing))}`)}
- ${kv("Pickup / Testing", `${formatMoney(n(c.pickupLabor))} / ${formatMoney(n(c.testing))}`)}
- ${kv("Repairs / Cert.", `${formatMoney(n(c.repairs))} / ${formatMoney(n(c.certification))}`)}
- ${kv("Mkt / Payment Fees", `${formatMoney(n(c.marketplaceFees))} / ${formatMoney(n(c.paymentFees))}`)}
- ${kv("Storage / Photo / List", `${formatMoney(n(c.storage))} / ${formatMoney(n(c.photography))} / ${formatMoney(n(c.listingLabor))}`)}
- ${kv("Total Investment", formatMoney(n(c.totalInvestment)), true)}
- ${kv("Expected Returns", formatMoney(n(c.expectedReturns)))}
- ${kv("Expected Net Profit", formatMoney(n(c.expectedNetProfit)), true)}
- ${kv("ROI / Annualized", `${formatPercent(n(c.roi))} / ${formatPercent(n(c.annualizedReturn))}`, true)}
- ${kv("Recommended Max Bid", formatMoney(n(c.recommendedMaxBid)), true)}
- </table>`;
-}
-
-function scoreTable(scores: Detail["scores"]): string {
- const overall = scores.find((s) => s.profile === "OVERALL_OPPORTUNITY") ?? scores[0];
- if (!overall) return "";
- const chip = (label: string, v: number) =>
- kv(label, `${Math.round(v)}`);
- return `<table style="border-collapse:collapse;font-size:12px;width:100%">
- ${kv("Opportunity", `${Math.round(overall.value)}`, true)}
- ${chip("Arbitrage", overall.arbitrage)}
- ${chip("Demand", overall.demand)}
- ${chip("Velocity", overall.velocity)}
- ${chip("Logistics", overall.logistics)}
- ${chip("Condition", overall.condition)}
- ${chip("Competition", overall.competition)}
- ${chip("Buyer", overall.buyer)}
- ${kv("Risk", overall.risk)}
- ${kv("Drop Ship", overall.dropShip)}
- </table>
- <div style="font-size:11px;color:#64748b;margin-top:6px">${escapeHtml(overall.explanation)}</div>`;
-}
-
-function renderItem(l: Detail, rank: number, skepticFlag?: string): string {
- const closes = countdown(l.closingAt);
- const net = formatMoney(n(l.costBreakdown?.expectedNetProfit));
- const roi = formatPercent(n(l.costBreakdown?.roi));
- const flagBanner = skepticFlag
- ? `<div style="background:#fef2f2;border:1px solid #fecaca;border-radius:6px;color:#b91c1c;font-size:12px;padding:6px 8px;margin:8px 0 2px">
- ⚠ flagged by Skeptic: ${escapeHtml(skepticFlag)} — verify before bidding
- </div>`
- : "";
- return `<div style="border:1px solid #e2e8f0;border-radius:8px;margin:0 0 16px;padding:12px">
- <div style="font-size:15px;font-weight:700">#${rank} · <a href="${APP_URL}/listings/${l.id}" style="color:#2563eb;text-decoration:none">${escapeHtml(l.title)}</a></div>
- ${flagBanner}
- <div style="color:#64748b;font-size:12px;margin:2px 0 10px">
- ${l.source.replace(/_/g, " ")} · #${escapeHtml(l.sourceAuctionId)} · ${escapeHtml(l.category || "—")} ·
- Qty ${l.quantity} · ${l.condition.replace(/_/g, " ")} ·
- ${[l.locationCity, l.locationState].filter(Boolean).join(", ") || "—"} ·
- closes ${closes} · <b style="color:#16a34a">${net} net</b> · <b>${roi} ROI</b>
- </div>
- <table style="width:100%;border-collapse:collapse"><tr valign="top">
- <td style="width:34%;padding-right:12px">
- <div style="font-weight:600;color:#334155;font-size:12px;margin-bottom:2px">Valuation</div>
- ${l.research ? valuationTable(l.research) : "<i>pending</i>"}
- </td>
- <td style="width:36%;padding-right:12px">
- <div style="font-weight:600;color:#334155;font-size:12px;margin-bottom:2px">Cost Breakdown & Profit</div>
- ${l.costBreakdown ? costTable(l.costBreakdown) : "<i>pending</i>"}
- </td>
- <td style="width:30%">
- <div style="font-weight:600;color:#334155;font-size:12px;margin-bottom:2px">Scores</div>
- ${scoreTable(l.scores)}
- </td>
- </tr></table>
- </div>`;
-}
-
-function buildHtml(items: Detail[], skepticFlags: Map<string, string> = new Map()): string {
- const when = new Date().toLocaleString("en-US", { dateStyle: "medium", timeStyle: "short" });
- if (items.length === 0) {
- return `<p>No open auction opportunities right now (${when}).</p>`;
- }
- return `<div style="font-family:-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#0f172a;max-width:900px">
- <h2 style="margin:0 0 4px">GovArbitrage — Top ${items.length} Opportunities</h2>
- <div style="color:#64748b;font-size:13px;margin-bottom:14px">${when} · ranked by Overall Opportunity · still-open auctions · detailed valuation, costs & scores per item</div>
- ${items.map((l, i) => renderItem(l, i + 1, skepticFlags.get(l.id))).join("")}
- <p style="margin-top:8px"><a href="${APP_URL}" style="color:#2563eb">Open the dashboard →</a></p>
- <p style="color:#94a3b8;font-size:11px">Recommended max bids back-solve to a 40% target ROI. Figures are estimates — verify comps before bidding.</p>
- </div>`;
-}
-
-function escapeHtml(s: string): string {
- return s.replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]!));
-}
-
-async function sendViaGeorge(subject: string, html: string) {
- const base = process.env.GEORGE_URL;
- const auth = process.env.GEORGE_BASIC_AUTH;
- if (!base || !auth) throw new Error("GEORGE_URL / GEORGE_BASIC_AUTH not set");
- const res = await fetch(`${base}/api/send`, {
- method: "POST",
- headers: { "Content-Type": "application/json", Authorization: `Basic ${auth}` },
- body: JSON.stringify({ account: FROM_ACCOUNT, to: DIGEST_TO, subject, body: html }),
- });
- const text = await res.text();
- if (!res.ok) throw new Error(`George send failed ${res.status}: ${text.slice(0, 300)}`);
- return text;
-}
-
-async function main() {
- const ids = await topTenIds();
- const items = await fetchDetails(ids);
- const skepticFlags = await skepticCriticalFlags(ids);
- const hour = new Date().getHours();
- const slot = hour < 12 ? "Morning" : "Evening";
- const subject = `GovArbitrage — Top ${items.length} Opportunities (${slot})`;
- const html = buildHtml(items, skepticFlags);
-
- if (process.env.DIGEST_DRY_RUN === "1") {
- const { writeFileSync } = await import("node:fs");
- writeFileSync("logs/digest-preview.html", html);
- console.log(`[DRY RUN] to=${DIGEST_TO} subject="${subject}" (${items.length} items, ${html.length} bytes)`);
- console.log(`Preview written to logs/digest-preview.html`);
- items.forEach((l, i) =>
- console.log(
- ` ${i + 1}. ${l.title.slice(0, 40)} — net ${Math.round(n(l.costBreakdown?.expectedNetProfit))}, ROI ${Math.round(n(l.costBreakdown?.roi) * 100)}%`,
- ),
- );
- await prisma.$disconnect();
- return;
- }
-
- const result = await sendViaGeorge(subject, html);
- console.log(`Sent "${subject}" to ${DIGEST_TO}: ${result.slice(0, 160)}`);
- await prisma.$disconnect();
-}
-
-main()
- .then(() => process.exit(0))
- .catch((e) => {
- console.error(`[digest] ${new Date().toISOString()} ERROR:`, e.message);
- process.exit(1);
- });
diff --git a/govarbitrage/scripts/send-newsletter-digest.ts b/govarbitrage/scripts/send-newsletter-digest.ts
deleted file mode 100644
index 91f74c2..0000000
--- a/govarbitrage/scripts/send-newsletter-digest.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import "dotenv/config";
-import { sendDigestToSubscribers } from "@/lib/send-digest";
-
-// CLI entry for the newsletter digest fan-out. All gating lives in
-// sendNewsletterEmail(); this just runs the send and reports.
-(async () => {
- const res = await sendDigestToSubscribers();
- console.log(
- `[newsletter-digest] mode=${res.mode} subscribers=${res.subscribers} sent=${res.sent} errors=${res.errors} deals=${res.dealCount}`
- );
- process.exit(res.errors > 0 ? 1 : 0);
-})();
diff --git a/govarbitrage/scripts/set-admin.ts b/govarbitrage/scripts/set-admin.ts
deleted file mode 100644
index 8b09170..0000000
--- a/govarbitrage/scripts/set-admin.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-// Set/reset the admin login credential without running the full seed.
-// Usage:
-// ADMIN_EMAIL=admin@agentabrams.com ADMIN_PASSWORD='...' npx tsx scripts/set-admin.ts
-// (omit ADMIN_PASSWORD to GENERATE a strong random one and print it once)
-// Never hardcodes a real password.
-
-import { randomBytes } from "node:crypto";
-import { prisma } from "../src/lib/db";
-import { hashPassword } from "../src/lib/password";
-
-// Readable strong password: 3 base32-ish blocks, ~120 bits.
-function generatePassword(): string {
- const alphabet = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // no ambiguous 0/O/1/I
- const bytes = randomBytes(18);
- const chars = Array.from(bytes, (b) => alphabet[b % alphabet.length]);
- return `${chars.slice(0, 6).join("")}-${chars.slice(6, 12).join("")}-${chars.slice(12, 18).join("")}`;
-}
-
-async function main() {
- const email = process.env.ADMIN_EMAIL || process.argv[2] || "admin@agentabrams.com";
- const provided = process.env.ADMIN_PASSWORD || process.argv[3];
- const generated = !provided;
- const password = provided || generatePassword();
- const hash = hashPassword(password);
- const user = await prisma.user.upsert({
- where: { email },
- update: { passwordHash: hash, role: "ADMIN" },
- create: { email, name: "Admin", role: "ADMIN", passwordHash: hash },
- });
- console.log(`Admin credential set: ${user.email} (role ${user.role}).`);
- if (generated) {
- // Printed ONCE so the operator can capture it; never stored to disk/git.
- console.log(`GENERATED_PASSWORD=${password}`);
- }
- await prisma.$disconnect();
-}
-
-main().catch(async (e) => {
- console.error("[set-admin] ERROR:", e.message);
- await prisma.$disconnect();
- process.exit(1);
-});
diff --git a/govarbitrage/src/agents/appraiser.ts b/govarbitrage/src/agents/appraiser.ts
deleted file mode 100644
index 3a0544e..0000000
--- a/govarbitrage/src/agents/appraiser.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { prisma } from "@/lib/db";
-import { runAgent, type AgentRunResult } from "./framework";
-import { runResearch } from "@/pipeline/research";
-
-// The Appraiser re-researches poorly-identified listings WITH the local AI
-// (Ollama qwen3:14b) so valuations become item-specific instead of the
-// keyword-heuristic placeholder (the "$900 retail / 214% ROI for everything"
-// artifact). Sequential (concurrency 1) — one local LLM, ~30-60s per listing.
-
-const num = (d: unknown): number | null => (d == null ? null : Number(d));
-
-/**
- * Pick up to `limit` ACTIVE, still-open listings ordered by soonest close
- * where identification is weak (manufacturer/model missing, or the last
- * research pass was heuristic-only / low confidence), and re-run research
- * with useAI + writeIdentity.
- */
-export async function runAppraiser(limit = 25): Promise<AgentRunResult> {
- return runAgent("appraiser", async (ctx) => {
- const now = new Date();
- const candidates = await prisma.listing.findMany({
- where: {
- listingStatus: "ACTIVE",
- closingAt: { gt: now },
- OR: [
- { manufacturer: null },
- { model: null },
- { identifiedBy: null },
- { identifiedBy: "heuristic" },
- { research: { is: { confidenceScore: { lt: 40 } } } },
- ],
- },
- orderBy: { closingAt: "asc" },
- take: limit,
- include: { research: true },
- });
-
- let aiIdentified = 0;
- let fallbacks = 0;
-
- for (const l of candidates) {
- const beforeRetail = num(l.research?.newRetail);
- const beforeConfidence = num(l.research?.confidenceScore);
-
- const result = await runResearch(l.id, { useAI: true, writeIdentity: true });
- ctx.count();
-
- const after = await prisma.research.findUnique({ where: { listingId: l.id } });
- const afterRetail = num(after?.newRetail);
- const afterConfidence = num(after?.confidenceScore);
-
- const fmt = (v: number | null, pct = false) =>
- v == null ? "—" : pct ? `${Math.round(v)}/100` : `$${Math.round(v)}`;
- const delta =
- `newRetail ${fmt(beforeRetail)} → ${fmt(afterRetail)}, ` +
- `confidence ${fmt(beforeConfidence, true)} → ${fmt(afterConfidence, true)}`;
-
- if (result.identifiedBy === "heuristic") {
- fallbacks++;
- await ctx.finding({
- kind: "AI_FALLBACK",
- severity: "WARN",
- listingId: l.id,
- listingTitle: l.title,
- title: `Ollama returned nothing — heuristic fallback kept for "${l.title.slice(0, 80)}"`,
- detail: `${delta}. Valuation remains keyword-heuristic; re-run when the local model is reachable.`,
- });
- } else {
- aiIdentified++;
- await ctx.finding({
- kind: "REAPPRAISED",
- severity: "INFO",
- listingId: l.id,
- listingTitle: l.title,
- title: `Re-appraised via ${result.identifiedBy}: ${delta}`,
- detail:
- `${l.title}. Net $${Math.round(result.expectedNetProfit)}, ` +
- `ROI ${Math.round(result.roi * 100)}%, overall score ${Math.round(result.overallScore)}.`,
- });
- }
- }
-
- return `${candidates.length} listings appraised — ${aiIdentified} AI-identified, ${fallbacks} heuristic fallbacks`;
- });
-}
diff --git a/govarbitrage/src/agents/framework.ts b/govarbitrage/src/agents/framework.ts
deleted file mode 100644
index cd6884f..0000000
--- a/govarbitrage/src/agents/framework.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import { prisma } from "@/lib/db";
-
-// Minimal, dependency-free agent runner. Every agent execution is recorded as
-// an AgentRun; observations stream in as AgentFindings via ctx.finding().
-// Errors are caught → status FAILED with the message in summary, so a crashed
-// agent still leaves an auditable row instead of vanishing.
-
-export type Severity = "INFO" | "WARN" | "CRITICAL";
-
-export interface FindingInput {
- kind: string;
- severity: Severity;
- title: string;
- detail?: string;
- listingId?: string;
- listingTitle?: string;
-}
-
-export interface AgentContext {
- runId: string;
- agent: string;
- /** Persist one finding against this run. */
- finding(f: FindingInput): Promise<void>;
- /** Increment the run's itemsProcessed counter (default +1). */
- count(n?: number): void;
-}
-
-export interface AgentRunResult {
- runId: string;
- agent: string;
- status: "OK" | "FAILED";
- itemsProcessed: number;
- summary: string | null;
- findings: number;
-}
-
-/**
- * Execute `fn` inside a tracked AgentRun. The function may return a summary
- * string; on throw the run is marked FAILED with the error message.
- */
-export async function runAgent(
- name: string,
- fn: (ctx: AgentContext) => Promise<string | void>,
-): Promise<AgentRunResult> {
- const run = await prisma.agentRun.create({
- data: { agent: name, status: "RUNNING" },
- });
-
- let items = 0;
- let findings = 0;
-
- const ctx: AgentContext = {
- runId: run.id,
- agent: name,
- async finding(f) {
- findings++;
- await prisma.agentFinding.create({
- data: {
- runId: run.id,
- agent: name,
- kind: f.kind,
- severity: f.severity,
- title: f.title,
- detail: f.detail,
- listingId: f.listingId,
- listingTitle: f.listingTitle,
- },
- });
- },
- count(n = 1) {
- items += n;
- },
- };
-
- try {
- const summary = (await fn(ctx)) ?? null;
- await prisma.agentRun.update({
- where: { id: run.id },
- data: { status: "OK", finishedAt: new Date(), itemsProcessed: items, summary },
- });
- return { runId: run.id, agent: name, status: "OK", itemsProcessed: items, summary, findings };
- } catch (e) {
- const message = e instanceof Error ? e.message : String(e);
- const summary = `FAILED: ${message}`.slice(0, 1000);
- await prisma.agentRun.update({
- where: { id: run.id },
- data: { status: "FAILED", finishedAt: new Date(), itemsProcessed: items, summary },
- });
- return { runId: run.id, agent: name, status: "FAILED", itemsProcessed: items, summary, findings };
- }
-}
diff --git a/govarbitrage/src/agents/run.ts b/govarbitrage/src/agents/run.ts
deleted file mode 100644
index 9ebca32..0000000
--- a/govarbitrage/src/agents/run.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-// CLI runner for the agent layer.
-// npm run agents -- appraiser [N] re-appraise up to N listings via local AI (default 25)
-// npm run agents -- skeptic [N] adversarial audit of the top N ranked (default 30)
-// npm run agents -- scout hot deals closing within 48h
-// npm run agents -- all skeptic → scout → appraiser (small batch)
-
-import { readFileSync } from "node:fs";
-import { fileURLToPath } from "node:url";
-import { dirname, join } from "node:path";
-import type { AgentRunResult } from "./framework";
-
-// Minimal .env loader (same pattern as scripts/send-digest.ts — don't rely on
-// Prisma's dotenv side-effect when invoked via tsx).
-function loadEnv() {
- const root = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
- try {
- const raw = readFileSync(join(root, ".env"), "utf8");
- for (const line of raw.split("\n")) {
- const m = line.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*)\s*$/i);
- if (!m) continue;
- const key = m[1];
- let val = m[2].trim();
- if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
- val = val.slice(1, -1);
- }
- if (process.env[key] === undefined) process.env[key] = val;
- }
- } catch {
- /* no .env — rely on ambient env */
- }
-}
-loadEnv();
-
-const { prisma } = await import("../lib/db");
-const { runAppraiser } = await import("./appraiser");
-const { runSkeptic } = await import("./skeptic");
-const { runScout } = await import("./scout");
-
-function report(r: AgentRunResult) {
- console.log(
- `[${r.agent}] ${r.status} — run ${r.runId} · ${r.itemsProcessed} items · ${r.findings} findings\n ${r.summary ?? ""}`,
- );
-}
-
-async function main() {
- const [agent, nArg] = process.argv.slice(2);
- const n = nArg != null ? Number(nArg) : undefined;
- if (nArg != null && (!Number.isFinite(n) || n! <= 0)) {
- throw new Error(`Invalid count "${nArg}" — expected a positive number.`);
- }
-
- switch ((agent || "").toLowerCase()) {
- case "appraiser":
- report(await runAppraiser(n ?? 25));
- break;
- case "skeptic":
- report(await runSkeptic(n ?? 30));
- break;
- case "scout":
- report(await runScout());
- break;
- case "all":
- report(await runSkeptic(n ?? 30));
- report(await runScout());
- report(await runAppraiser(n ?? 25));
- break;
- default:
- console.log("Usage: npm run agents -- <appraiser [N] | skeptic [N] | scout | all>");
- process.exitCode = 2;
- }
-}
-
-main()
- .catch((e) => {
- console.error("[agents] ERROR:", e instanceof Error ? e.message : e);
- process.exitCode = 1;
- })
- .finally(async () => {
- await prisma.$disconnect();
- });
diff --git a/govarbitrage/src/agents/scout.ts b/govarbitrage/src/agents/scout.ts
deleted file mode 100644
index 5ddd45f..0000000
--- a/govarbitrage/src/agents/scout.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { prisma } from "@/lib/db";
-import { runAgent, type AgentRunResult } from "./framework";
-
-// The Scout watches the clock: open listings closing within 48h that carry a
-// strong Overall Opportunity score (>= minScore). Each hit is an INFO finding;
-// anything closing within 6h escalates to CRITICAL.
-
-const HOUR = 3_600_000;
-
-export async function runScout(minScore = 75): Promise<AgentRunResult> {
- return runAgent("scout", async (ctx) => {
- const now = Date.now();
- const listings = await prisma.listing.findMany({
- where: {
- listingStatus: "ACTIVE",
- closingAt: { gt: new Date(now), lte: new Date(now + 48 * HOUR) },
- scores: { some: { profile: "OVERALL_OPPORTUNITY", value: { gte: minScore } } },
- },
- include: {
- scores: { where: { profile: "OVERALL_OPPORTUNITY" } },
- costBreakdown: true,
- },
- orderBy: { closingAt: "asc" },
- });
-
- let critical = 0;
- for (const l of listings) {
- ctx.count();
- const score = l.scores[0]?.value ?? 0;
- const hoursLeft = (new Date(l.closingAt!).getTime() - now) / HOUR;
- const isCritical = hoursLeft <= 6;
- if (isCritical) critical++;
- const net = l.costBreakdown ? Math.round(Number(l.costBreakdown.expectedNetProfit)) : null;
- await ctx.finding({
- kind: "HOT_CLOSING",
- severity: isCritical ? "CRITICAL" : "INFO",
- listingId: l.id,
- listingTitle: l.title,
- title: `Closing in ${hoursLeft < 1 ? "<1h" : Math.round(hoursLeft) + "h"} @ score ${Math.round(score)}: "${l.title.slice(0, 70)}"`,
- detail:
- `Overall ${Math.round(score)}/100, closes ${l.closingAt?.toISOString()}` +
- (net != null ? `, est. net $${net}` : "") +
- `. ${isCritical ? "Under 6 hours — act now or drop it." : "Within 48h window."}`,
- });
- }
-
- return `${listings.length} hot deals closing within 48h (${critical} within 6h) at score >= ${minScore}`;
- });
-}
diff --git a/govarbitrage/src/agents/skeptic-rules.test.ts b/govarbitrage/src/agents/skeptic-rules.test.ts
deleted file mode 100644
index 5777766..0000000
--- a/govarbitrage/src/agents/skeptic-rules.test.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { describe, expect, it } from "vitest";
-import { findCloneGroups, isClosingStale, isLowConfidence, type ValuationTuple } from "./skeptic-rules";
-
-const t = (
- listingId: string,
- newRetail: number | null,
- expectedNetProfit: number | null,
- roi: number | null,
-): ValuationTuple => ({ listingId, title: listingId, newRetail, expectedNetProfit, roi });
-
-describe("findCloneGroups", () => {
- it("flags >=3 listings sharing the exact (newRetail, net, roi) tuple", () => {
- const items = [
- t("a", 900, 189, 2.14),
- t("b", 900, 189, 2.14),
- t("c", 900, 189, 2.14),
- t("d", 450, 80, 0.6),
- ];
- const groups = findCloneGroups(items);
- expect(groups).toHaveLength(1);
- expect(groups[0].members.map((m) => m.listingId)).toEqual(["a", "b", "c"]);
- expect(groups[0].key).toBe("$900 retail / $189 net / 214% ROI");
- });
-
- it("does not flag pairs (below minGroup)", () => {
- const items = [t("a", 900, 189, 2.14), t("b", 900, 189, 2.14), t("c", 450, 80, 0.6)];
- expect(findCloneGroups(items)).toHaveLength(0);
- });
-
- it("treats a small dollar difference as distinct", () => {
- const items = [t("a", 900, 189, 2.14), t("b", 901, 189, 2.14), t("c", 900, 189, 2.14)];
- expect(findCloneGroups(items)).toHaveLength(0);
- });
-
- it("ignores listings with missing values", () => {
- const items = [t("a", 900, 189, 2.14), t("b", 900, 189, 2.14), t("c", null, 189, 2.14)];
- expect(findCloneGroups(items)).toHaveLength(0);
- });
-
- it("returns multiple groups, largest first", () => {
- const items = [
- t("a", 900, 189, 2.14),
- t("b", 900, 189, 2.14),
- t("c", 900, 189, 2.14),
- t("d", 600, 120, 1.5),
- t("e", 600, 120, 1.5),
- t("f", 600, 120, 1.5),
- t("g", 600, 120, 1.5),
- ];
- const groups = findCloneGroups(items);
- expect(groups).toHaveLength(2);
- expect(groups[0].members).toHaveLength(4);
- expect(groups[1].members).toHaveLength(3);
- });
-});
-
-describe("isLowConfidence", () => {
- it("handles the 0..100 scale (Research.confidenceScore)", () => {
- expect(isLowConfidence(35)).toBe(true);
- expect(isLowConfidence(62)).toBe(false);
- });
- it("handles the 0..1 scale (identificationConfidence)", () => {
- expect(isLowConfidence(0.3)).toBe(true);
- expect(isLowConfidence(0.55)).toBe(false);
- });
- it("treats missing confidence as low", () => {
- expect(isLowConfidence(null)).toBe(true);
- expect(isLowConfidence(undefined)).toBe(true);
- });
-});
-
-describe("isClosingStale", () => {
- const now = new Date("2026-08-06T12:00:00Z");
- it("flags ACTIVE listings whose closingAt is in the past", () => {
- expect(isClosingStale(new Date("2026-08-05T12:00:00Z"), "ACTIVE", now)).toBe(true);
- });
- it("does not flag open or ended listings", () => {
- expect(isClosingStale(new Date("2026-08-07T12:00:00Z"), "ACTIVE", now)).toBe(false);
- expect(isClosingStale(new Date("2026-08-05T12:00:00Z"), "ENDED", now)).toBe(false);
- expect(isClosingStale(null, "ACTIVE", now)).toBe(false);
- });
-});
diff --git a/govarbitrage/src/agents/skeptic-rules.ts b/govarbitrage/src/agents/skeptic-rules.ts
deleted file mode 100644
index 2c893b6..0000000
--- a/govarbitrage/src/agents/skeptic-rules.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-// Pure, testable rule logic for the skeptic agent. No DB, no I/O.
-
-export interface ValuationTuple {
- listingId: string;
- title: string;
- /** Research.newRetail, USD */
- newRetail: number | null;
- /** CostBreakdown.expectedNetProfit, USD */
- expectedNetProfit: number | null;
- /** CostBreakdown.roi, ratio (0.42 = 42%) */
- roi: number | null;
-}
-
-export interface CloneGroup {
- /** Human-readable tuple key, e.g. "$900 retail / $189 net / 214% ROI" */
- key: string;
- members: ValuationTuple[];
-}
-
-/**
- * Detect the placeholder-valuation artifact: groups of >= minGroup listings
- * whose (newRetail, expectedNetProfit, roi) tuple is identical to the dollar
- * (ROI compared to 0.1%). Distinct items genuinely never share all three.
- */
-export function findCloneGroups(items: ValuationTuple[], minGroup = 3): CloneGroup[] {
- const buckets = new Map<string, ValuationTuple[]>();
- for (const it of items) {
- if (it.newRetail == null || it.expectedNetProfit == null || it.roi == null) continue;
- const key = [
- Math.round(it.newRetail),
- Math.round(it.expectedNetProfit),
- Math.round(it.roi * 1000), // 0.1% resolution
- ].join("|");
- const arr = buckets.get(key);
- if (arr) arr.push(it);
- else buckets.set(key, [it]);
- }
-
- const groups: CloneGroup[] = [];
- for (const members of buckets.values()) {
- if (members.length < minGroup) continue;
- const m = members[0];
- groups.push({
- key: `$${Math.round(m.newRetail!)} retail / $${Math.round(m.expectedNetProfit!)} net / ${Math.round(m.roi! * 100)}% ROI`,
- members,
- });
- }
- // Biggest artifact first.
- groups.sort((a, b) => b.members.length - a.members.length);
- return groups;
-}
-
-/** Identification/valuation confidence below the floor (both scales accepted). */
-export function isLowConfidence(confidence: number | null | undefined, floor = 0.4): boolean {
- if (confidence == null) return true; // no confidence recorded at all
- // Research.confidenceScore is 0..100; identificationConfidence is 0..1.
- const ratio = confidence > 1 ? confidence / 100 : confidence;
- return ratio < floor;
-}
-
-/** closesAt in the past but the listing still marked open/ACTIVE. */
-export function isClosingStale(
- closingAt: Date | string | null | undefined,
- listingStatus: string,
- now: Date = new Date(),
-): boolean {
- if (!closingAt) return false;
- return listingStatus === "ACTIVE" && new Date(closingAt).getTime() < now.getTime();
-}
diff --git a/govarbitrage/src/agents/skeptic.ts b/govarbitrage/src/agents/skeptic.ts
deleted file mode 100644
index aa21a57..0000000
--- a/govarbitrage/src/agents/skeptic.ts
+++ /dev/null
@@ -1,93 +0,0 @@
-import { prisma } from "@/lib/db";
-import { runAgent, type AgentRunResult } from "./framework";
-import { topRankedOpportunities } from "@/lib/digest-top";
-import { findCloneGroups, isClosingStale, isLowConfidence, type ValuationTuple } from "./skeptic-rules";
-
-// The Skeptic is the adversarial digest gate. It loads the top-ranked
-// opportunities exactly the way the digest does (shared helper in
-// src/lib/digest-top.ts) and flags what a buyer should NOT trust:
-// CLONE_VALUATION (CRITICAL) — >=3 listings with dollar-identical
-// (newRetail, expectedNetProfit, roi): the placeholder-heuristic artifact.
-// LOW_CONFIDENCE (WARN) — identification/valuation confidence < 0.4.
-// CLOSING_DATA_STALE (WARN) — closingAt in the past but still marked open.
-
-const num = (d: unknown): number | null => (d == null ? null : Number(d));
-
-export async function runSkeptic(topN = 30): Promise<AgentRunResult> {
- return runAgent("skeptic", async (ctx) => {
- // openOnly:false so stale-but-still-ranked rows are audited too.
- const rows = await topRankedOpportunities({ limit: topN, openOnly: false });
- const ids = rows.map((r) => r.id);
- const listings = await prisma.listing.findMany({
- where: { id: { in: ids } },
- include: { research: true, costBreakdown: true },
- });
- const byId = new Map(listings.map((l) => [l.id, l]));
-
- const flagged = new Set<string>();
- ctx.count(rows.length);
-
- // ── CLONE_VALUATION ──
- const tuples: ValuationTuple[] = [];
- for (const r of rows) {
- const l = byId.get(r.id);
- if (!l) continue;
- tuples.push({
- listingId: l.id,
- title: l.title,
- newRetail: num(l.research?.newRetail),
- expectedNetProfit: num(l.costBreakdown?.expectedNetProfit),
- roi: num(l.costBreakdown?.roi),
- });
- }
- for (const group of findCloneGroups(tuples)) {
- for (const m of group.members) {
- flagged.add(m.listingId);
- await ctx.finding({
- kind: "CLONE_VALUATION",
- severity: "CRITICAL",
- listingId: m.listingId,
- listingTitle: m.title,
- title: `Clone valuation: ${group.members.length} top listings share ${group.key}`,
- detail:
- `Identical-to-the-dollar valuation tuple across ${group.members.length} listings — ` +
- `placeholder heuristic, not item-specific research. Members: ` +
- group.members.map((x) => x.title.slice(0, 50)).join(" | "),
- });
- }
- }
-
- // ── LOW_CONFIDENCE + CLOSING_DATA_STALE ──
- for (const r of rows) {
- const l = byId.get(r.id);
- if (!l) continue;
-
- const confidence = num(l.research?.confidenceScore);
- if (isLowConfidence(confidence)) {
- flagged.add(l.id);
- await ctx.finding({
- kind: "LOW_CONFIDENCE",
- severity: "WARN",
- listingId: l.id,
- listingTitle: l.title,
- title: `Low confidence (${confidence == null ? "none" : Math.round(confidence) + "/100"}) on "${l.title.slice(0, 70)}"`,
- detail: "Identification/valuation confidence below 0.4 — verify comps before trusting the numbers.",
- });
- }
-
- if (isClosingStale(l.closingAt, l.listingStatus)) {
- flagged.add(l.id);
- await ctx.finding({
- kind: "CLOSING_DATA_STALE",
- severity: "WARN",
- listingId: l.id,
- listingTitle: l.title,
- title: `Closing data stale: "${l.title.slice(0, 70)}" closed ${l.closingAt?.toISOString().slice(0, 10)} but is still ACTIVE`,
- detail: "closingAt is in the past while listingStatus=ACTIVE — the liveness sweep missed it or the source changed.",
- });
- }
- }
-
- return `${flagged.size}/${rows.length} top opportunities flagged`;
- });
-}
diff --git a/govarbitrage/src/app/api/agents/search/route.ts b/govarbitrage/src/app/api/agents/search/route.ts
deleted file mode 100644
index 5fd8c65..0000000
--- a/govarbitrage/src/app/api/agents/search/route.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { searchCommercialAgents, type AgentKind } from "@/lib/places";
-import { rateLimit, clientIp, sessionOrIpKey } from "@/lib/rate-limit";
-import { getCurrentUser } from "@/lib/current-user";
-
-export const dynamic = "force-dynamic";
-
-// Rate-limit bucket key. The upstream (Google Places) is a paid API, so one
-// session must not be able to run up the bill. Key on the VERIFIED session
-// subject (unforgeable) — NOT on X-Forwarded-For, which the client controls and
-// can rotate to reset the bucket. This route is login-gated by middleware, so a
-// user is normally present; fall back to the (spoofable) IP only as a last resort.
-async function clientKey(req: NextRequest): Promise<string> {
- const user = await getCurrentUser();
- return sessionOrIpKey("agents", user?.sub, clientIp(req));
-}
-
-// Lightweight input validation so user-supplied location can't pad the Places
-// textQuery with junk (cost/relevance noise) or a malformed ZIP.
-const ZIP_RE = /^\d{5}(?:-\d{4})?$/;
-const LOC_RE = /^[a-zA-Z0-9\s,.'-]{1,80}$/;
-
-export async function GET(req: NextRequest) {
- const rl = rateLimit(await clientKey(req), 20, 60_000);
- if (!rl.allowed) {
- return NextResponse.json(
- { error: "Too many searches — wait a moment." },
- { status: 429, headers: { "Retry-After": String(rl.retryAfterSec) } },
- );
- }
-
- const sp = req.nextUrl.searchParams;
- const city = sp.get("city")?.trim() || undefined;
- const state = sp.get("state")?.trim() || undefined;
- const zip = sp.get("zip")?.trim() || undefined;
- const typeParam = (sp.get("type") ?? "both").toLowerCase();
- const kinds: AgentKind[] =
- typeParam === "buyer" ? ["buyer"] : typeParam === "leasing" ? ["leasing"] : ["buyer", "leasing"];
-
- if (!city && !state && !zip) {
- return NextResponse.json({ error: "Provide a city, state, or ZIP." }, { status: 400 });
- }
- if (zip && !ZIP_RE.test(zip)) {
- return NextResponse.json({ error: "Invalid ZIP — use 5 digits (or ZIP+4)." }, { status: 400 });
- }
- if (city && !LOC_RE.test(city)) {
- return NextResponse.json({ error: "Invalid city." }, { status: 400 });
- }
- if (state && !LOC_RE.test(state)) {
- return NextResponse.json({ error: "Invalid state." }, { status: 400 });
- }
-
- try {
- const data = await searchCommercialAgents({ city, state, zip, kinds });
- return NextResponse.json(data);
- } catch (e) {
- // Don't leak the raw upstream (Google) error to the client — it can reveal
- // key/quota details. Log server-side; return a generic message. Preserve the
- // 503 "not configured" signal so ops can tell a missing key from a bad call.
- const raw = e instanceof Error ? e.message : "Search failed";
- console.error("[agents/search] upstream error:", raw);
- const notConfigured = /not configured/.test(raw);
- return NextResponse.json(
- { error: notConfigured ? "Agent search is temporarily unavailable." : "Search failed — try again." },
- { status: notConfigured ? 503 : 502 },
- );
- }
-}
diff --git a/govarbitrage/src/app/api/auth/apple/route.ts b/govarbitrage/src/app/api/auth/apple/route.ts
deleted file mode 100644
index 90e62d9..0000000
--- a/govarbitrage/src/app/api/auth/apple/route.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { randomBytes } from "node:crypto";
-import { z } from "zod";
-import { createRemoteJWKSet, jwtVerify } from "jose";
-import { prisma } from "@/lib/db";
-import { hashPassword } from "@/lib/password";
-import { createSession, SESSION_COOKIE, SESSION_MAX_AGE } from "@/lib/session";
-import { rateLimit, clientIp, tooManyRequests } from "@/lib/rate-limit";
-
-export const dynamic = "force-dynamic";
-
-// Sign in with Apple — NATIVE iOS flow. The iOS app (expo-apple-authentication)
-// obtains an Apple identity token whose `aud` is the app's bundle id; we verify
-// it against Apple's public JWKS and issue our OWN app session JWT in the JSON
-// body (the native app stores it and sends `Authorization: Bearer <jwt>`). A
-// session cookie is also set for web parity. Optional sign-in: the rest of the
-// app works logged-out; this just creates/links a lightweight account.
-const APPLE_ISSUER = "https://appleid.apple.com";
-const APPLE_JWKS = createRemoteJWKSet(new URL("https://appleid.apple.com/auth/keys"));
-// The app's bundle id is the `aud` of a native Sign in with Apple token.
-const APPLE_AUDIENCE = process.env.APPLE_BUNDLE_ID || "com.abrams.govarbitrage";
-
-// Apple returns name/email ONLY on the very first authorization; the app passes
-// them through so we can populate the account on create.
-const Schema = z.object({
- identityToken: z.string().min(1),
- fullName: z.string().trim().max(200).optional(),
- email: z.string().email().max(320).optional(),
-});
-
-export async function POST(req: NextRequest) {
- // Brute-force / abuse protection, mirroring the password login route.
- const ip = clientIp(req);
- const ipLimit = rateLimit(`apple:ip:${ip}`, 20, 5 * 60_000);
- if (!ipLimit.allowed) return tooManyRequests(ipLimit);
-
- const parsed = Schema.safeParse(await req.json().catch(() => ({})));
- if (!parsed.success) {
- return NextResponse.json({ error: "identityToken required" }, { status: 400 });
- }
- const { identityToken, fullName, email: providedEmail } = parsed.data;
-
- // Verify the Apple identity token: signature (Apple JWKS) + issuer + audience.
- let appleSub: string;
- let tokenEmail: string | undefined;
- try {
- const { payload } = await jwtVerify(identityToken, APPLE_JWKS, {
- issuer: APPLE_ISSUER,
- audience: APPLE_AUDIENCE,
- });
- if (!payload.sub) throw new Error("no sub");
- appleSub = payload.sub;
- tokenEmail = typeof payload.email === "string" ? payload.email : undefined;
- } catch {
- await prisma.auditLog.create({
- data: { action: "auth.apple.failed", entity: "User", meta: { reason: "token_verify" } },
- });
- return NextResponse.json({ error: "Invalid Apple token" }, { status: 401 });
- }
-
- // Prefer the verified email from the token, then the app-provided one, else a
- // stable synthetic (Apple can withhold email on re-auth / private relay).
- const email = (tokenEmail || providedEmail || `apple_${appleSub}@govarbitrage.apple`).toLowerCase();
-
- // Upsert the account by Apple `sub`. Apple users never password-login, so give
- // them an unguessable random passwordHash (keeps the column non-null without a
- // migration and without a usable password).
- let user = await prisma.user.findUnique({ where: { appleSub } });
- if (!user) {
- user = await prisma.user.create({
- data: {
- appleSub,
- email,
- name: fullName || null,
- passwordHash: hashPassword(randomBytes(32).toString("hex")),
- role: "VIEWER",
- },
- });
- await prisma.auditLog.create({
- data: { userId: user.id, action: "auth.apple.signup", entity: "User", entityId: user.id },
- });
- } else if (fullName && !user.name) {
- // Backfill the name if Apple only sent it now and we didn't have it.
- user = await prisma.user.update({ where: { id: user.id }, data: { name: fullName } });
- }
-
- const token = await createSession({ sub: user.id, email: user.email, role: user.role });
- await prisma.auditLog.create({
- data: { userId: user.id, action: "auth.apple.login", entity: "User", entityId: user.id },
- });
-
- const res = NextResponse.json({
- token, // native app stores this and sends it as `Authorization: Bearer <token>`
- user: { id: user.id, email: user.email, name: user.name, role: user.role },
- });
- res.cookies.set(SESSION_COOKIE, token, {
- httpOnly: true,
- sameSite: "lax",
- secure: process.env.NODE_ENV === "production",
- path: "/",
- maxAge: SESSION_MAX_AGE,
- });
- return res;
-}
diff --git a/govarbitrage/src/app/api/auth/login/route.ts b/govarbitrage/src/app/api/auth/login/route.ts
deleted file mode 100644
index 4eebad2..0000000
--- a/govarbitrage/src/app/api/auth/login/route.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { z } from "zod";
-import { prisma } from "@/lib/db";
-import { verifyPassword, hashPassword } from "@/lib/password";
-import { createSession, SESSION_COOKIE, SESSION_MAX_AGE } from "@/lib/session";
-import { rateLimit, clientIp, tooManyRequests } from "@/lib/rate-limit";
-
-export const dynamic = "force-dynamic";
-
-// A well-formed dummy hash so verifyPassword runs the full scrypt path even
-// when the user doesn't exist — keeps login timing uniform (no user-enumeration
-// oracle). Computed once at module load.
-const DUMMY_HASH = hashPassword("invalid-password-placeholder");
-
-// Username-only login (Steve 2026-07-22: "no more email login"). The username
-// is resolved against the unique user whose email local-part matches
-// ("admin" → admin@govarbitrage.local). Full emails are rejected outright.
-const Schema = z.object({ username: z.string().trim().min(1), password: z.string().min(1) });
-
-async function resolveUser(username: string) {
- const id = username.toLowerCase();
- if (id.includes("@")) return null; // email-style logins are retired
- const matches = await prisma.user.findMany({
- where: { email: { startsWith: `${id}@` } },
- take: 2,
- });
- return matches.length === 1 ? matches[0] : null;
-}
-
-export async function POST(req: NextRequest) {
- // Brute-force protection: cap login attempts per IP.
- const ip = clientIp(req);
- const ipLimit = rateLimit(`login:ip:${ip}`, 10, 5 * 60_000);
- if (!ipLimit.allowed) return tooManyRequests(ipLimit);
-
- const parsed = Schema.safeParse(await req.json().catch(() => ({})));
- if (!parsed.success) {
- return NextResponse.json({ error: "Username and password required" }, { status: 400 });
- }
- const { username, password } = parsed.data;
-
- // And per targeted username (credential-stuffing protection).
- const userLimit = rateLimit(`login:user:${username.toLowerCase()}`, 5, 15 * 60_000);
- if (!userLimit.allowed) return tooManyRequests(userLimit);
- const user = await resolveUser(username);
-
- // Always run a full scrypt verification (against a dummy hash when the user
- // is absent) so response timing doesn't reveal whether the account exists.
- const ok = verifyPassword(password, user ? user.passwordHash : DUMMY_HASH);
- if (!user || !ok) {
- await prisma.auditLog.create({
- data: { action: "auth.login.failed", entity: "User", meta: { username } },
- });
- return NextResponse.json({ error: "Invalid credentials" }, { status: 401 });
- }
-
- const token = await createSession({ sub: user.id, email: user.email, role: user.role });
- await prisma.auditLog.create({
- data: { userId: user.id, action: "auth.login", entity: "User", entityId: user.id },
- });
-
- const res = NextResponse.json({
- user: { id: user.id, email: user.email, name: user.name, role: user.role },
- });
- res.cookies.set(SESSION_COOKIE, token, {
- httpOnly: true,
- sameSite: "lax",
- secure: process.env.NODE_ENV === "production",
- path: "/",
- maxAge: SESSION_MAX_AGE,
- });
- return res;
-}
diff --git a/govarbitrage/src/app/api/auth/logout/route.ts b/govarbitrage/src/app/api/auth/logout/route.ts
deleted file mode 100644
index 21eb169..0000000
--- a/govarbitrage/src/app/api/auth/logout/route.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { NextResponse } from "next/server";
-import { SESSION_COOKIE } from "@/lib/session";
-
-export const dynamic = "force-dynamic";
-
-export async function POST() {
- const res = NextResponse.json({ ok: true });
- res.cookies.set(SESSION_COOKIE, "", { httpOnly: true, path: "/", maxAge: 0 });
- return res;
-}
diff --git a/govarbitrage/src/app/api/auth/me/route.ts b/govarbitrage/src/app/api/auth/me/route.ts
deleted file mode 100644
index 8259595..0000000
--- a/govarbitrage/src/app/api/auth/me/route.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { NextResponse } from "next/server";
-import { getCurrentUser } from "@/lib/current-user";
-
-export const dynamic = "force-dynamic";
-
-export async function GET() {
- const user = await getCurrentUser();
- if (!user) return NextResponse.json({ user: null }, { status: 401 });
- return NextResponse.json({ user: { id: user.sub, email: user.email, role: user.role } });
-}
diff --git a/govarbitrage/src/app/api/billing/checkout/route.ts b/govarbitrage/src/app/api/billing/checkout/route.ts
deleted file mode 100644
index 0aa2cb2..0000000
--- a/govarbitrage/src/app/api/billing/checkout/route.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { getCurrentUser } from "@/lib/current-user";
-import { createCheckout } from "@/lib/billing";
-import type { Tier } from "@prisma/client";
-
-export const dynamic = "force-dynamic";
-
-// Start a (TEST/mock) subscription checkout for the chosen tier.
-export async function POST(req: NextRequest) {
- const user = await getCurrentUser();
- if (!user) return NextResponse.json({ error: "sign in first" }, { status: 401 });
-
- const { tier } = (await req.json().catch(() => ({}))) as { tier?: Tier };
- if (tier !== "STANDARD" && tier !== "PREMIUM") {
- return NextResponse.json({ error: "tier must be STANDARD or PREMIUM" }, { status: 400 });
- }
-
- const baseUrl = process.env.PUBLIC_BASE_URL || req.nextUrl.origin;
- const result = await createCheckout({ userId: user.sub, email: user.email, tier, baseUrl });
- if (!result.ok) return NextResponse.json({ error: result.error }, { status: 400 });
- return NextResponse.json({ url: result.url, mode: result.mode });
-}
diff --git a/govarbitrage/src/app/api/billing/webhook/route.ts b/govarbitrage/src/app/api/billing/webhook/route.ts
deleted file mode 100644
index fb6be2c..0000000
--- a/govarbitrage/src/app/api/billing/webhook/route.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { verifyWebhook } from "@/lib/billing";
-import { prisma } from "@/lib/db";
-import { tierFromPriceUsd } from "@/lib/tiers";
-import type { Tier } from "@prisma/client";
-
-export const dynamic = "force-dynamic";
-
-// Stripe TEST webhook — the real source of truth for subscription state.
-// checkout.session.completed / subscription updates -> set user.tier.
-export async function POST(req: NextRequest) {
- const raw = await req.text();
- const event = verifyWebhook(raw, req.headers.get("stripe-signature"));
- if (!event) return NextResponse.json({ error: "unverified" }, { status: 400 });
-
- try {
- if (event.type === "checkout.session.completed") {
- const s = event.data.object as {
- client_reference_id?: string | null;
- metadata?: { userId?: string; tier?: string } | null;
- customer?: string | null;
- subscription?: string | null;
- amount_total?: number | null;
- };
- const userId = s.metadata?.userId || s.client_reference_id || undefined;
- const tier = (s.metadata?.tier as Tier) || tierFromPriceUsd((s.amount_total ?? 0) / 100);
- if (userId && (tier === "STANDARD" || tier === "PREMIUM")) {
- await prisma.user.update({
- where: { id: userId },
- data: {
- tier,
- stripeCustomerId: (s.customer as string) || undefined,
- stripeSubscriptionId: (s.subscription as string) || undefined,
- },
- });
- }
- } else if (event.type === "customer.subscription.deleted") {
- const sub = event.data.object as { id: string };
- await prisma.user.updateMany({
- where: { stripeSubscriptionId: sub.id },
- data: { tier: "FREE", stripeSubscriptionId: null },
- });
- }
- } catch (e) {
- return NextResponse.json({ error: (e as Error).message }, { status: 500 });
- }
- return NextResponse.json({ received: true });
-}
diff --git a/govarbitrage/src/app/api/import/apify-govdeals/route.ts b/govarbitrage/src/app/api/import/apify-govdeals/route.ts
deleted file mode 100644
index 26455c8..0000000
--- a/govarbitrage/src/app/api/import/apify-govdeals/route.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { fetchApifyDataset, fetchApifyLastRun } from "@/importers/apify-govdeals";
-import { ingestMany } from "@/importers/ingest";
-import { requireWrite } from "@/lib/auth";
-
-export const dynamic = "force-dynamic";
-export const maxDuration = 300;
-
-// Ingest GovDeals listings scraped by Apify. READ-ONLY: pulls an already-finished
-// dataset (?dataset=ID) or the actor's last successful run (free). Triggering a
-// NEW Apify run costs money and is intentionally NOT exposed here — it stays a
-// deliberate, cost-surfaced action. ?ai=1 runs local Ollama identification.
-export async function POST(req: NextRequest) {
- const denied = await requireWrite(req);
- if (denied) return denied;
- try {
- const datasetId = req.nextUrl.searchParams.get("dataset") || undefined;
- const useAI = req.nextUrl.searchParams.get("ai") === "1";
- const rows = datasetId ? await fetchApifyDataset(datasetId) : await fetchApifyLastRun();
- const results = await ingestMany(rows, { useAI });
- const created = results.filter((r) => r.ok && r.created).length;
- const updated = results.filter((r) => r.ok && !r.created).length;
- const failed = results.filter((r) => !r.ok).length;
- return NextResponse.json({ source: "GOVDEALS", via: "apify", fetched: rows.length, created, updated, failed });
- } catch (e) {
- return NextResponse.json({ error: (e as Error).message }, { status: 502 });
- }
-}
diff --git a/govarbitrage/src/app/api/import/csv/route.ts b/govarbitrage/src/app/api/import/csv/route.ts
deleted file mode 100644
index 837bb3a..0000000
--- a/govarbitrage/src/app/api/import/csv/route.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { parseListingsCsv } from "@/importers/csv";
-import { ingestMany } from "@/importers/ingest";
-import { requireWrite } from "@/lib/auth";
-
-export const dynamic = "force-dynamic";
-export const maxDuration = 60;
-
-// Accepts either raw CSV text (Content-Type: text/csv) or a multipart file upload
-// under the "file" field. Set ?research=false to skip the research pipeline.
-export async function POST(req: NextRequest) {
- const denied = await requireWrite(req);
- if (denied) return denied;
- try {
- const research = req.nextUrl.searchParams.get("research") !== "false";
- let text: string;
-
- const ct = req.headers.get("content-type") || "";
- if (ct.includes("multipart/form-data")) {
- const form = await req.formData();
- const file = form.get("file");
- if (!(file instanceof File)) {
- return NextResponse.json({ error: "No file field" }, { status: 400 });
- }
- text = await file.text();
- } else {
- text = await req.text();
- }
-
- if (!text.trim()) return NextResponse.json({ error: "Empty CSV" }, { status: 400 });
-
- const rows = parseListingsCsv(text);
- if (rows.length === 0) return NextResponse.json({ error: "No rows parsed" }, { status: 400 });
-
- const results = await ingestMany(rows, { research });
- const created = results.filter((r) => r.ok && r.created).length;
- const updated = results.filter((r) => r.ok && !r.created).length;
- const failed = results.filter((r) => !r.ok);
-
- return NextResponse.json({ total: rows.length, created, updated, failed, results });
- } catch (e) {
- return NextResponse.json({ error: (e as Error).message }, { status: 500 });
- }
-}
diff --git a/govarbitrage/src/app/api/import/extension/route.ts b/govarbitrage/src/app/api/import/extension/route.ts
deleted file mode 100644
index 410581d..0000000
--- a/govarbitrage/src/app/api/import/extension/route.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { ingest, type RawListing } from "@/importers/ingest";
-import { requireWrite } from "@/lib/auth";
-
-export const dynamic = "force-dynamic";
-
-// Receives a captured auction page from the browser extension (content.js shape)
-// and ingests it (create/update + research). CORS-open so the extension can POST.
-const CORS = {
- "Access-Control-Allow-Origin": "*",
- "Access-Control-Allow-Methods": "POST, OPTIONS",
- "Access-Control-Allow-Headers": "Content-Type, x-import-token",
-};
-
-export function OPTIONS() {
- return new NextResponse(null, { headers: CORS });
-}
-
-export async function POST(req: NextRequest) {
- const denied = await requireWrite(req);
- if (denied) return new NextResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: CORS });
- try {
- const body = (await req.json()) as RawListing;
- if (!body?.title || !body?.sourceAuctionId) {
- return NextResponse.json(
- { error: "Missing title or sourceAuctionId" },
- { status: 400, headers: CORS },
- );
- }
- const result = await ingest({ ...body, source: body.source || "EXTENSION" });
- return NextResponse.json(result, { headers: CORS });
- } catch (e) {
- return NextResponse.json({ error: (e as Error).message }, { status: 500, headers: CORS });
- }
-}
diff --git a/govarbitrage/src/app/api/import/gsa/route.ts b/govarbitrage/src/app/api/import/gsa/route.ts
deleted file mode 100644
index 0cec7dd..0000000
--- a/govarbitrage/src/app/api/import/gsa/route.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { fetchGsaAuctions } from "@/importers/gsa";
-import { ingestMany } from "@/importers/ingest";
-import { requireWrite } from "@/lib/auth";
-
-export const dynamic = "force-dynamic";
-export const maxDuration = 120;
-
-// Pull live listings from the official GSA Auctions API and ingest them.
-// Auth-gated (session or x-import-token). ?limit=N&ai=1 (ai defaults off for speed).
-export async function POST(req: NextRequest) {
- const denied = await requireWrite(req);
- if (denied) return denied;
- try {
- const limit = Number(req.nextUrl.searchParams.get("limit") || 40);
- const useAI = req.nextUrl.searchParams.get("ai") === "1";
- const rows = await fetchGsaAuctions({ limit });
- const results = await ingestMany(rows, { useAI });
- const created = results.filter((r) => r.ok && r.created).length;
- const updated = results.filter((r) => r.ok && !r.created).length;
- const failed = results.filter((r) => !r.ok);
- return NextResponse.json({ source: "GSA_AUCTIONS", fetched: rows.length, created, updated, failed: failed.length });
- } catch (e) {
- return NextResponse.json({ error: (e as Error).message }, { status: 502 });
- }
-}
diff --git a/govarbitrage/src/app/api/import/url/route.ts b/govarbitrage/src/app/api/import/url/route.ts
deleted file mode 100644
index 0c964e8..0000000
--- a/govarbitrage/src/app/api/import/url/route.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { scrapeUrl } from "@/importers/scrape";
-import { ingest } from "@/importers/ingest";
-import { requireWrite } from "@/lib/auth";
-import { assertPublicUrl } from "@/lib/ssrf-guard";
-
-export const dynamic = "force-dynamic";
-export const runtime = "nodejs";
-export const maxDuration = 60;
-
-// Scrape a single auction URL (Playwright best-effort) and ingest it.
-export async function POST(req: NextRequest) {
- const denied = await requireWrite(req);
- if (denied) return denied;
- try {
- const { url } = (await req.json()) as { url?: string };
- if (!url) return NextResponse.json({ error: "Missing url" }, { status: 400 });
- // SSRF guard: reject metadata/loopback/private targets before scraping.
- try {
- await assertPublicUrl(url);
- } catch {
- return NextResponse.json({ error: "URL not allowed" }, { status: 400 });
- }
- const raw = await scrapeUrl(url);
- const result = await ingest(raw);
- return NextResponse.json({ ...result, raw });
- } catch (e) {
- return NextResponse.json({ error: (e as Error).message }, { status: 500 });
- }
-}
diff --git a/govarbitrage/src/app/api/listings/[id]/buyer-lead/route.ts b/govarbitrage/src/app/api/listings/[id]/buyer-lead/route.ts
deleted file mode 100644
index 743d433..0000000
--- a/govarbitrage/src/app/api/listings/[id]/buyer-lead/route.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { prisma } from "@/lib/db";
-import { z } from "zod";
-import { rateLimit, clientIp, tooManyRequests } from "@/lib/rate-limit";
-
-export const dynamic = "force-dynamic";
-
-const LeadSchema = z.object({
- name: z.string().min(1),
- email: z.string().email(),
- phone: z.string().optional(),
- offer: z.number().nonnegative().optional(),
- notes: z.string().optional(),
-});
-
-// Record a CONTINGENT, non-binding buyer lead against a listing.
-export async function POST(req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
- // Public endpoint — throttle anonymous submissions to curb spam/abuse.
- const limit = rateLimit(`lead:ip:${clientIp(req)}`, 5, 10 * 60_000);
- if (!limit.allowed) return tooManyRequests(limit);
-
- const { id } = await params;
- const listing = await prisma.listing.findUnique({ where: { id } });
- if (!listing) return NextResponse.json({ error: "Not found" }, { status: 404 });
-
- const parsed = LeadSchema.safeParse(await req.json().catch(() => ({})));
- if (!parsed.success) {
- return NextResponse.json({ error: "Invalid lead", issues: parsed.error.issues }, { status: 400 });
- }
- const lead = await prisma.buyerLead.create({
- data: { listingId: id, ...parsed.data, contingent: true },
- });
- await prisma.listingEvent.create({
- data: { listingId: id, type: "BUYER_LEAD_ADDED", message: `Contingent lead from ${parsed.data.name}` },
- });
- return NextResponse.json(lead);
-}
diff --git a/govarbitrage/src/app/api/listings/[id]/buyer-page/route.ts b/govarbitrage/src/app/api/listings/[id]/buyer-page/route.ts
deleted file mode 100644
index e8fd225..0000000
--- a/govarbitrage/src/app/api/listings/[id]/buyer-page/route.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { prisma } from "@/lib/db";
-import { requireWrite } from "@/lib/auth";
-
-export const dynamic = "force-dynamic";
-
-function slugify(s: string) {
- return s.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 60);
-}
-
-// Create/update a CONTINGENT buyer-interest page for a listing.
-export async function POST(req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
- const denied = await requireWrite(req);
- if (denied) return denied;
- const { id } = await params;
- const listing = await prisma.listing.findUnique({ where: { id } });
- if (!listing) return NextResponse.json({ error: "Not found" }, { status: 404 });
-
- const body = (await req.json().catch(() => ({}))) as {
- headline?: string;
- estDelivered?: number;
- published?: boolean;
- };
- const slug = slugify(`${listing.manufacturer ?? listing.title}-${listing.sourceAuctionId}`);
-
- const page = await prisma.buyerInterestPage.upsert({
- where: { listingId: id },
- create: {
- listingId: id,
- slug,
- headline: body.headline ?? `${listing.title} — Contingent Interest`,
- estDelivered: body.estDelivered ?? null,
- published: body.published ?? true,
- contingent: true,
- },
- update: {
- headline: body.headline,
- estDelivered: body.estDelivered,
- published: body.published,
- },
- });
- await prisma.listingEvent.create({
- data: { listingId: id, type: "MANUAL_EDIT", message: `Buyer-interest page ${page.slug} saved` },
- });
- return NextResponse.json(page);
-}
diff --git a/govarbitrage/src/app/api/listings/[id]/route.ts b/govarbitrage/src/app/api/listings/[id]/route.ts
deleted file mode 100644
index 9a5de28..0000000
--- a/govarbitrage/src/app/api/listings/[id]/route.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { getGatedListingDetail } from "@/lib/listing-detail";
-
-export const dynamic = "force-dynamic";
-
-export async function GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
- const { id } = await params;
- const { listing, tier, gated } = await getGatedListingDetail(id);
- if (!listing) return NextResponse.json({ error: "Not found" }, { status: 404 });
- return NextResponse.json({ ...listing, tier, gated });
-}
diff --git a/govarbitrage/src/app/api/listings/route.ts b/govarbitrage/src/app/api/listings/route.ts
deleted file mode 100644
index 8bc98dd..0000000
--- a/govarbitrage/src/app/api/listings/route.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { queryListings, type ListingRow, type QueryParams } from "@/lib/listings";
-import { getCurrentTier, moneyMathVisible } from "@/lib/current-user";
-import { tierDef } from "@/lib/tiers";
-
-export const dynamic = "force-dynamic";
-
-// Money-math fields redacted for any tier whose showMoneyMath is false. All
-// current tiers (FREE included) show the full analysis, so this redaction is
-// dormant infrastructure — retained so a future gated tier can null these
-// consistently. Nothing here keys off the client type.
-const REDACTABLE_FIELDS: (keyof ListingRow)[] = [
- "recommendedMaxBid", "retailLow", "retailAverage", "retailHigh",
- "usedLow", "usedAverage", "usedHigh", "wholesale", "liquidation", "sellNow",
- "value7Day", "value30Day", "value90Day", "expectedSale", "netProfit", "roi",
- "opportunityScore", "arbitrageScore", "demandScore", "velocityScore",
- "logisticsScore", "conditionScore", "competitionScore", "buyerScore",
-];
-
-export async function GET(req: NextRequest) {
- const sp = req.nextUrl.searchParams;
- const params: QueryParams = {
- search: sp.get("search") || undefined,
- source: sp.get("source") || undefined,
- category: sp.get("category") || undefined,
- condition: sp.get("condition") || undefined,
- risk: sp.get("risk") || undefined,
- closingWithinHours: sp.get("closingWithinHours")
- ? Number(sp.get("closingWithinHours"))
- : undefined,
- sort: (sp.get("sort") as keyof ListingRow) || undefined,
- dir: (sp.get("dir") as "asc" | "desc") || undefined,
- page: sp.get("page") ? Number(sp.get("page")) : undefined,
- pageSize: sp.get("pageSize") ? Number(sp.get("pageSize")) : undefined,
- profile: sp.get("profile") || undefined,
- };
- const tier = await getCurrentTier();
- const limits = tierDef(tier).limits;
- // Visibility depends on the resolved tier only — identical for every client.
- const showMoney = await moneyMathVisible(tier);
-
- // Enforce the tier's listing cap.
- const capped = { ...params, pageSize: Math.min(params.pageSize ?? 50, limits.maxListings) };
- const result = await queryListings(capped);
-
- // Redact the money-math when the tier hides it (no tier currently does).
- if (!showMoney) {
- result.rows = result.rows.map((r) => {
- const row: Record<string, unknown> = { ...r };
- for (const f of REDACTABLE_FIELDS) row[f] = null;
- return row as unknown as ListingRow;
- });
- }
-
- return NextResponse.json({ ...result, tier, gated: !showMoney });
-}
diff --git a/govarbitrage/src/app/api/newsletter/confirm/route.ts b/govarbitrage/src/app/api/newsletter/confirm/route.ts
deleted file mode 100644
index 8cbed96..0000000
--- a/govarbitrage/src/app/api/newsletter/confirm/route.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { NextRequest } from "next/server";
-import { prisma } from "@/lib/db";
-import { resultPage } from "../result-page";
-
-export const dynamic = "force-dynamic";
-
-export async function GET(req: NextRequest) {
- const token = req.nextUrl.searchParams.get("token") || "";
- if (!token) {
- return resultPage(400, "Missing link", "This confirmation link is incomplete. Please use the link from your email.");
- }
-
- const sub = await prisma.subscriber.findUnique({ where: { confirmToken: token } });
- if (!sub) {
- return resultPage(404, "Link not recognized", "This confirmation link is invalid or has been superseded by a newer one. Re-subscribe to get a fresh link.");
- }
-
- if (sub.status !== "CONFIRMED") {
- await prisma.subscriber.update({
- where: { id: sub.id },
- data: { status: "CONFIRMED", confirmedAt: new Date() },
- });
- }
-
- return resultPage(
- 200,
- "You're subscribed",
- "Your email is confirmed. The Top-10 government-surplus deals digest will arrive twice daily (6am & 5pm PT). Every digest includes a one-click unsubscribe link.",
- );
-}
diff --git a/govarbitrage/src/app/api/newsletter/result-page.ts b/govarbitrage/src/app/api/newsletter/result-page.ts
deleted file mode 100644
index f11b538..0000000
--- a/govarbitrage/src/app/api/newsletter/result-page.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-// Small friendly HTML result page for confirm/unsubscribe links, styled to
-// match the public pricing page.
-export function resultPage(status: number, title: string, body: string): Response {
- const html = `<!doctype html>
-<html lang="en">
-<head>
-<meta charset="utf-8">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<title>${title} — GovArbitrage</title>
-</head>
-<body style="margin:0;background:#f8fafc;font-family:system-ui;color:#0f172a">
- <main style="max-width:560px;margin:96px auto;padding:0 20px;text-align:center">
- <div style="background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:36px 28px">
- <h1 style="font-size:26px;margin:0 0 10px">${title}</h1>
- <p style="color:#475569;font-size:15px;line-height:1.6;margin:0">${body}</p>
- <p style="margin-top:22px"><a href="/newsletter" style="color:#111827;font-weight:600">← Back to the newsletter page</a></p>
- </div>
- </main>
-</body>
-</html>`;
- return new Response(html, { status, headers: { "Content-Type": "text/html; charset=utf-8" } });
-}
diff --git a/govarbitrage/src/app/api/newsletter/subscribe/route.ts b/govarbitrage/src/app/api/newsletter/subscribe/route.ts
deleted file mode 100644
index 130c87e..0000000
--- a/govarbitrage/src/app/api/newsletter/subscribe/route.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { z } from "zod";
-import { prisma } from "@/lib/db";
-import { rateLimit, clientIp, tooManyRequests } from "@/lib/rate-limit";
-import {
- buildConfirmEmail,
- newToken,
- normalizeEmail,
- sendNewsletterEmail,
-} from "@/lib/newsletter";
-
-export const dynamic = "force-dynamic";
-
-// `website` is a honeypot: hidden in the form, humans leave it empty, naive
-// bots fill it. Filled honeypot → pretend success, do nothing.
-const Schema = z.object({
- email: z.string().email().max(254),
- website: z.string().optional(),
-});
-
-// Same body whether the email was new, already pending, or already confirmed —
-// never reveals whether an address exists in the list.
-const GENERIC_OK = {
- ok: true,
- message: "Check your inbox — if this address isn't already confirmed, we've sent a confirmation link.",
-};
-
-export async function POST(req: NextRequest) {
- const ip = clientIp(req);
- const ipLimit = rateLimit(`newsletter:ip:${ip}`, 8, 10 * 60_000);
- if (!ipLimit.allowed) return tooManyRequests(ipLimit);
-
- const parsed = Schema.safeParse(await req.json().catch(() => ({})));
- if (!parsed.success) {
- return NextResponse.json({ error: "A valid email address is required." }, { status: 400 });
- }
- if (parsed.data.website) return NextResponse.json(GENERIC_OK);
-
- const email = normalizeEmail(parsed.data.email);
- const emailLimit = rateLimit(`newsletter:email:${email}`, 3, 15 * 60_000);
- if (!emailLimit.allowed) return tooManyRequests(emailLimit);
-
- const existing = await prisma.subscriber.findUnique({ where: { email } });
-
- if (existing?.status === "CONFIRMED") {
- // Already on the list — idempotent no-op, identical response.
- return NextResponse.json(GENERIC_OK);
- }
-
- const confirmToken = newToken();
- const unsubscribeToken = newToken();
- await prisma.subscriber.upsert({
- where: { email },
- create: { email, status: "PENDING", confirmToken, unsubscribeToken },
- update: { status: "PENDING", confirmToken, unsubscribeToken, unsubscribedAt: null },
- });
-
- const baseUrl = process.env.NEWSLETTER_BASE_URL || req.nextUrl.origin;
- await sendNewsletterEmail(buildConfirmEmail(email, baseUrl, confirmToken));
-
- return NextResponse.json(GENERIC_OK);
-}
diff --git a/govarbitrage/src/app/api/newsletter/unsubscribe/route.ts b/govarbitrage/src/app/api/newsletter/unsubscribe/route.ts
deleted file mode 100644
index 2b6a981..0000000
--- a/govarbitrage/src/app/api/newsletter/unsubscribe/route.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { NextRequest } from "next/server";
-import { prisma } from "@/lib/db";
-import { buildUnsubscribeNoticeEmail, sendNewsletterEmail } from "@/lib/newsletter";
-import { resultPage } from "../result-page";
-
-export const dynamic = "force-dynamic";
-
-// CAN-SPAM: single-click, no login, effective immediately.
-export async function GET(req: NextRequest) {
- const token = req.nextUrl.searchParams.get("token") || "";
- if (!token) {
- return resultPage(400, "Missing link", "This unsubscribe link is incomplete. Please use the link from your email.");
- }
-
- const sub = await prisma.subscriber.findUnique({ where: { unsubscribeToken: token } });
- if (!sub) {
- return resultPage(404, "Link not recognized", "This unsubscribe link is invalid. If you keep receiving emails, reply to any digest and we'll remove you manually.");
- }
-
- if (sub.status !== "UNSUBSCRIBED") {
- await prisma.subscriber.update({
- where: { id: sub.id },
- data: { status: "UNSUBSCRIBED", unsubscribedAt: new Date() },
- });
- await sendNewsletterEmail(buildUnsubscribeNoticeEmail(sub.email));
- }
-
- return resultPage(
- 200,
- "You're unsubscribed",
- "You will receive no further digests. This took effect immediately. Changed your mind? You can re-subscribe any time at /newsletter.",
- );
-}
diff --git a/govarbitrage/src/app/robots.ts b/govarbitrage/src/app/robots.ts
deleted file mode 100644
index a34a891..0000000
--- a/govarbitrage/src/app/robots.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import type { MetadataRoute } from "next";
-import { publicBaseUrl } from "@/lib/site";
-
-export default function robots(): MetadataRoute.Robots {
- const base = publicBaseUrl();
- return {
- rules: [
- {
- userAgent: "*",
- allow: ["/newsletter", "/pricing", "/deals", "/selling-avenues", "/b/"],
- // App/private surfaces: auth-walled anyway, but keep crawlers out of
- // redirects and per-listing buyer pages entirely.
- disallow: [
- "/api/",
- "/listings",
- "/reports",
- "/billing",
- "/credentials",
- "/login",
- ],
- },
- ],
- sitemap: `${base}/sitemap.xml`,
- };
-}
diff --git a/govarbitrage/src/app/sitemap.ts b/govarbitrage/src/app/sitemap.ts
deleted file mode 100644
index 42e11a6..0000000
--- a/govarbitrage/src/app/sitemap.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import type { MetadataRoute } from "next";
-import { listDigestDates } from "@/lib/digest-snapshot";
-import { publicBaseUrl } from "@/lib/site";
-
-export const dynamic = "force-dynamic";
-
-export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
- const base = publicBaseUrl();
- const dates = await listDigestDates();
-
- const staticPages: MetadataRoute.Sitemap = [
- { url: `${base}/`, changeFrequency: "daily", priority: 0.8 },
- { url: `${base}/newsletter`, changeFrequency: "weekly", priority: 1 },
- { url: `${base}/pricing`, changeFrequency: "weekly", priority: 0.7 },
- { url: `${base}/deals`, changeFrequency: "daily", priority: 0.9 },
- { url: `${base}/selling-avenues`, changeFrequency: "weekly", priority: 0.7 },
- ];
-
- return [
- ...staticPages,
- ...dates.map(({ date, lastModified }) => ({
- url: `${base}/deals/${date}`,
- lastModified,
- changeFrequency: "monthly" as const, // frozen snapshots — they don't change
- priority: 0.6,
- })),
- ];
-}
diff --git a/govarbitrage/src/engines/constants.ts b/govarbitrage/src/engines/constants.ts
deleted file mode 100644
index 73e70c6..0000000
--- a/govarbitrage/src/engines/constants.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import type { ConditionKey, SourceKey } from "./types";
-
-// Fraction of *new retail* a used unit fetches, by condition. These are the
-// backbone of the valuation model; documented so estimates are auditable.
-export const CONDITION_RETAIL_FACTOR: Record<ConditionKey, number> = {
- NEW: 0.78,
- LIKE_NEW: 0.62,
- USED_GOOD: 0.46,
- USED_FAIR: 0.31,
- FOR_PARTS: 0.12,
- UNKNOWN: 0.35,
-};
-
-// Typical repair burden as a fraction of new retail, by condition.
-export const CONDITION_REPAIR_FACTOR: Record<ConditionKey, number> = {
- NEW: 0,
- LIKE_NEW: 0.01,
- USED_GOOD: 0.03,
- USED_FAIR: 0.07,
- FOR_PARTS: 0.18,
- UNKNOWN: 0.05,
-};
-
-// Buyer's premium charged by each source (fraction of hammer/winning bid).
-export const BUYER_PREMIUM_RATE: Record<SourceKey, number> = {
- GOVDEALS: 0.1,
- PUBLIC_SURPLUS: 0.1,
- GSA_AUCTIONS: 0,
- COUNTY: 0.1,
- STATE_SURPLUS: 0.08,
- UNIVERSITY_SURPLUS: 0.1,
- MUNICIBID: 0.1,
- BID4ASSETS: 0.1,
- CSV: 0.1,
- EXTENSION: 0.1,
- OTHER: 0.1,
-};
-
-// Marketplace + payment fee rates (fraction of resale price).
-export const MARKETPLACE_FEE_RATE = 0.132; // eBay-typical final value fee
-export const PAYMENT_FEE_RATE = 0.03; // managed-payments processing
-
-// Prep/handling cost assumptions (US dollars).
-export const PACKING_BASE = 12;
-export const PACKING_PER_LB = 0.15;
-export const PHOTOGRAPHY_COST = 8;
-export const LISTING_LABOR_COST = 10;
-export const TESTING_COST_PER_UNIT = 15;
-export const PICKUP_LABOR_HOURLY = 35;
-export const STORAGE_PER_MONTH = 18;
-
-// Weight threshold (lbs) above which an item ships as LTL freight, not parcel.
-export const FREIGHT_THRESHOLD_LBS = 150;
-
-// Target ROI used to back-solve the recommended maximum bid.
-export const TARGET_ROI = 0.4;
diff --git a/govarbitrage/src/engines/costs.test.ts b/govarbitrage/src/engines/costs.test.ts
deleted file mode 100644
index e4984df..0000000
--- a/govarbitrage/src/engines/costs.test.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import { describe, expect, it } from "vitest";
-import { computeCosts } from "./costs";
-import type { CostInput } from "./types";
-
-const base: CostInput = {
- source: "GOVDEALS",
- winningBid: 500,
- quantity: 1,
- weightLbs: 40,
- condition: "USED_GOOD",
- expectedSalePrice: 9000,
- daysUntilSold: 30,
-};
-
-describe("computeCosts", () => {
- it("applies the source buyer premium", () => {
- const c = computeCosts(base);
- // GovDeals premium is 10% of the winning bid.
- expect(c.buyerPremium).toBeCloseTo(50, 2);
- });
-
- it("ships parcel under the freight threshold and freight above it", () => {
- const light = computeCosts({ ...base, weightLbs: 40 });
- expect(light.freight).toBe(0);
- expect(light.shipping).toBeGreaterThan(0);
-
- const heavy = computeCosts({ ...base, weightLbs: 600 });
- expect(heavy.freight).toBeGreaterThan(0);
- expect(heavy.shipping).toBe(0);
- });
-
- it("computes a positive net profit for a strong flip", () => {
- const c = computeCosts(base);
- expect(c.expectedNetProfit).toBeGreaterThan(0);
- expect(c.roi).toBeGreaterThan(0);
- expect(c.totalInvestment).toBeGreaterThan(base.winningBid);
- });
-
- it("recommends a max bid that back-solves to the target ROI", () => {
- const c = computeCosts(base);
- // Bidding exactly the recommended max should yield ~40% ROI.
- const atMax = computeCosts({ ...base, winningBid: c.recommendedMaxBid });
- expect(atMax.roi).toBeCloseTo(0.4, 1);
- });
-
- it("zeroes shipping/freight but adds pickup labor for local pickup", () => {
- const c = computeCosts({ ...base, weightLbs: 600, localPickup: true });
- expect(c.shipping).toBe(0);
- expect(c.freight).toBe(0);
- expect(c.pickupLabor).toBeGreaterThan(0);
- });
-
- it("stays coherent for high-quantity lots (qty > 1)", () => {
- // Quantity-scaled lot: expectedSalePrice is the lot total; costs must remain
- // internally consistent (positive investment, sane max bid below returns).
- const lot = computeCosts({
- ...base,
- quantity: 20,
- weightLbs: 120,
- expectedSalePrice: 26000,
- });
- expect(lot.testing).toBeCloseTo(20 * 15, 2); // testing scales per unit
- expect(lot.totalInvestment).toBeGreaterThan(0);
- expect(lot.recommendedMaxBid).toBeGreaterThan(0);
- expect(lot.recommendedMaxBid).toBeLessThan(lot.expectedReturns);
- // Bidding the recommended max still back-solves to the target ROI at qty>1.
- const atMax = computeCosts({ ...base, quantity: 20, weightLbs: 120, expectedSalePrice: 26000, winningBid: lot.recommendedMaxBid });
- expect(atMax.roi).toBeCloseTo(0.4, 1);
- });
-
- it("applies purchase sales tax when a rate is provided", () => {
- const taxed = computeCosts({ ...base, purchaseTaxRate: 0.0725 });
- const untaxed = computeCosts({ ...base, purchaseTaxRate: 0 });
- expect(taxed.salesTax).toBeGreaterThan(0);
- expect(untaxed.salesTax).toBe(0);
- expect(taxed.totalInvestment).toBeGreaterThan(untaxed.totalInvestment);
- });
-});
diff --git a/govarbitrage/src/engines/costs.ts b/govarbitrage/src/engines/costs.ts
deleted file mode 100644
index 9b8ac7a..0000000
--- a/govarbitrage/src/engines/costs.ts
+++ /dev/null
@@ -1,162 +0,0 @@
-import { round2, clamp } from "@/lib/utils";
-import {
- BUYER_PREMIUM_RATE,
- CONDITION_REPAIR_FACTOR,
- LISTING_LABOR_COST,
- MARKETPLACE_FEE_RATE,
- PACKING_BASE,
- PACKING_PER_LB,
- PAYMENT_FEE_RATE,
- PHOTOGRAPHY_COST,
- PICKUP_LABOR_HOURLY,
- STORAGE_PER_MONTH,
- TARGET_ROI,
- TESTING_COST_PER_UNIT,
-} from "./constants";
-import { estimateFreight } from "./freight";
-import type { CostBreakdown, CostInput } from "./types";
-
-/** Costs that do NOT depend on the winning bid (prep, logistics, fees). */
-function fixedCosts(input: CostInput) {
- const qty = Math.max(1, input.quantity || 1);
- const weight = Math.max(0, input.weightLbs || 0);
- const totalWeight = weight; // weightLbs is the lot total in our model
-
- const fr = estimateFreight(totalWeight);
- const shipping = input.localPickup ? 0 : fr.parcelShipping;
- const freight = input.localPickup ? 0 : fr.freight;
-
- const insurance = round2(input.expectedSalePrice * 0.01);
- const packing = round2(PACKING_BASE + PACKING_PER_LB * totalWeight);
- const pickupLabor = input.localPickup
- ? round2(PICKUP_LABOR_HOURLY * (1 + totalWeight / 500)) // ~1h + weight handling
- : 0;
- const testing = round2(TESTING_COST_PER_UNIT * qty);
- const repairs =
- input.repairsOverride ??
- round2(CONDITION_REPAIR_FACTOR[input.condition] * input.expectedSalePrice);
- // Certification only meaningful for regulated categories; default 0, overridable.
- const certification = 0;
- const months = Math.max(0.25, input.daysUntilSold / 30);
- const storage = round2(STORAGE_PER_MONTH * months);
- const photography = PHOTOGRAPHY_COST;
- const listingLabor = LISTING_LABOR_COST;
-
- // Resale-side fees scale with sale price, not bid.
- const marketplaceFees = round2(input.expectedSalePrice * MARKETPLACE_FEE_RATE);
- const paymentFees = round2(input.expectedSalePrice * PAYMENT_FEE_RATE);
-
- const fixedTotal = round2(
- shipping +
- freight +
- insurance +
- packing +
- pickupLabor +
- testing +
- repairs +
- certification +
- storage +
- photography +
- listingLabor,
- );
-
- return {
- shipping,
- freight,
- insurance,
- packing,
- pickupLabor,
- testing,
- repairs,
- certification,
- storage,
- photography,
- listingLabor,
- marketplaceFees,
- paymentFees,
- fixedTotal,
- freightBasis: fr.basis,
- };
-}
-
-/**
- * Full cost + profitability breakdown for a listing at a given winning bid.
- * Also back-solves `recommendedMaxBid`: the highest bid that still clears the
- * TARGET_ROI threshold given all bid-independent costs and resale fees.
- */
-export function computeCosts(input: CostInput): CostBreakdown {
- const source = input.source;
- const premiumRate = BUYER_PREMIUM_RATE[source] ?? 0.1;
- const taxRate = input.purchaseTaxRate ?? 0; // resale cert typically zeroes this
- const f = fixedCosts(input);
-
- const bidCost = (bid: number) => {
- const buyerPremium = round2(bid * premiumRate);
- const salesTax = round2((bid + buyerPremium) * taxRate);
- return { buyerPremium, salesTax, acquire: round2(bid + buyerPremium + salesTax) };
- };
-
- const { buyerPremium, salesTax, acquire } = bidCost(input.winningBid);
-
- const expectedReturns = round2(
- input.expectedSalePrice - f.marketplaceFees - f.paymentFees,
- );
- const totalInvestment = round2(acquire + f.fixedTotal);
- const expectedNetProfit = round2(expectedReturns - totalInvestment);
- const roi = totalInvestment > 0 ? round2(expectedNetProfit / totalInvestment) : 0;
-
- // Annualize the ROI over the expected holding period.
- const days = Math.max(1, input.daysUntilSold);
- const annualizedReturn =
- roi > -1
- ? round2(Math.pow(1 + roi, 365 / days) - 1)
- : -1;
-
- // Recommended max bid: solve netProfit(bid) = TARGET_ROI * totalInvestment(bid).
- // netProfit = expectedReturns - (bid*(1+prem)*(1+tax) + fixedTotal)
- // Set roi target: (expectedReturns - acquire - fixed) / (acquire + fixed) = TARGET
- // => expectedReturns - acquire - fixed = TARGET*(acquire + fixed)
- // => expectedReturns = (1+TARGET)*(acquire + fixed)
- // => acquire = expectedReturns/(1+TARGET) - fixed
- // acquire = bid*(1+prem)*(1+tax) => bid = acquire / ((1+prem)*(1+tax))
- const acquireBudget =
- expectedReturns / (1 + TARGET_ROI) - f.fixedTotal;
- const bidMultiplier = (1 + premiumRate) * (1 + taxRate);
- const recommendedMaxBid = round2(
- clamp(acquireBudget / bidMultiplier, 0, Number.MAX_SAFE_INTEGER),
- );
-
- return {
- winningBid: round2(input.winningBid),
- buyerPremium,
- salesTax,
- shipping: f.shipping,
- freight: f.freight,
- insurance: f.insurance,
- packing: f.packing,
- pickupLabor: f.pickupLabor,
- testing: f.testing,
- repairs: f.repairs,
- certification: f.certification,
- marketplaceFees: f.marketplaceFees,
- paymentFees: f.paymentFees,
- storage: f.storage,
- photography: f.photography,
- listingLabor: f.listingLabor,
- expectedReturns,
- totalInvestment,
- expectedNetProfit,
- roi,
- annualizedReturn,
- recommendedMaxBid,
- assumptions: {
- buyerPremiumRate: premiumRate,
- purchaseTaxRate: taxRate,
- marketplaceFeeRate: MARKETPLACE_FEE_RATE,
- paymentFeeRate: PAYMENT_FEE_RATE,
- targetRoi: TARGET_ROI,
- freightBasis: f.freightBasis,
- holdingDays: days,
- },
- };
-}
diff --git a/govarbitrage/src/engines/demand.ts b/govarbitrage/src/engines/demand.ts
deleted file mode 100644
index e911f2b..0000000
--- a/govarbitrage/src/engines/demand.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import { clamp } from "@/lib/utils";
-
-// Deterministic, $0 demand + retail heuristic. Used as the fallback when no AI
-// model is reachable, and as a sanity floor for AI estimates. Keyword-driven so
-// it is fully explainable.
-
-interface CategorySignal {
- demand: number; // 0..100 baseline secondary-market liquidity
- retailFloor: number; // rough per-unit new-retail baseline (USD)
- keywords: string[];
-}
-
-const CATEGORY_SIGNALS: CategorySignal[] = [
- { demand: 82, retailFloor: 900, keywords: ["laptop", "macbook", "thinkpad", "computer", "workstation"] },
- { demand: 80, retailFloor: 600, keywords: ["iphone", "ipad", "tablet", "phone", "surface"] },
- { demand: 70, retailFloor: 400, keywords: ["monitor", "display", "projector", "tv", "television"] },
- { demand: 74, retailFloor: 4500, keywords: ["dental", "medical", "surgical", "exam", "patient", "dental chair", "autoclave"] },
- { demand: 68, retailFloor: 1200, keywords: ["microscope", "lab", "laboratory", "analyzer", "centrifuge", "spectrometer"] },
- { demand: 66, retailFloor: 2200, keywords: ["forklift", "generator", "compressor", "welder", "lathe", "cnc"] },
- { demand: 60, retailFloor: 800, keywords: ["herman miller", "aeron", "steelcase", "office chair", "ergonomic"] },
- { demand: 45, retailFloor: 300, keywords: ["desk", "cabinet", "table", "furniture", "shelving", "credenza"] },
- { demand: 72, retailFloor: 550, keywords: ["drone", "camera", "lens", "nikon", "canon", "sony", "gopro"] },
- { demand: 64, retailFloor: 700, keywords: ["radio", "motorola", "network", "cisco", "switch", "router", "server"] },
- { demand: 58, retailFloor: 500, keywords: ["tool", "dewalt", "milwaukee", "makita", "power tool", "generator"] },
- { demand: 50, retailFloor: 250, keywords: ["vehicle", "truck", "trailer", "atv", "mower", "tractor"] },
-];
-
-const PREMIUM_BRANDS = [
- "herman miller",
- "steelcase",
- "apple",
- "macbook",
- "dewalt",
- "milwaukee",
- "cisco",
- "midmark",
- "adec",
- "leica",
- "nikon",
-];
-
-export interface DemandEstimate {
- demandScore: number;
- retailFloor: number;
- matchedCategory: string | null;
- brandBoost: boolean;
-}
-
-/** Estimate demand + a retail floor from listing text keywords. */
-export function estimateDemand(text: string): DemandEstimate {
- const hay = text.toLowerCase();
- let best: CategorySignal | null = null;
- let bestHits = 0;
-
- for (const sig of CATEGORY_SIGNALS) {
- const hits = sig.keywords.filter((k) => hay.includes(k)).length;
- if (hits > bestHits) {
- bestHits = hits;
- best = sig;
- }
- }
-
- const brandBoost = PREMIUM_BRANDS.some((b) => hay.includes(b));
- const baseDemand = best ? best.demand : 40;
- const demandScore = clamp(baseDemand + (brandBoost ? 8 : 0), 0, 100);
-
- return {
- demandScore,
- retailFloor: best ? best.retailFloor : 200,
- matchedCategory: best ? best.keywords[0] : null,
- brandBoost,
- };
-}
diff --git a/govarbitrage/src/engines/freight.ts b/govarbitrage/src/engines/freight.ts
deleted file mode 100644
index 2541002..0000000
--- a/govarbitrage/src/engines/freight.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { round2 } from "@/lib/utils";
-import { FREIGHT_THRESHOLD_LBS } from "./constants";
-
-export interface FreightEstimate {
- parcelShipping: number;
- freight: number;
- isFreight: boolean;
- basis: string;
-}
-
-/**
- * Estimate outbound logistics cost from total lot weight. Light items ship as
- * parcel (USPS/UPS ground tiers); heavy items move as LTL freight with a base
- * charge plus per-hundredweight (CWT) rate. Deliberately simple + explainable.
- */
-export function estimateFreight(totalWeightLbs: number): FreightEstimate {
- const w = Math.max(0, totalWeightLbs || 0);
-
- if (w <= FREIGHT_THRESHOLD_LBS) {
- // Parcel tiers.
- let parcel: number;
- if (w <= 1) parcel = 6;
- else if (w <= 5) parcel = 12;
- else if (w <= 20) parcel = 22;
- else if (w <= 50) parcel = 45;
- else if (w <= 100) parcel = 85;
- else parcel = 130;
- return {
- parcelShipping: round2(parcel),
- freight: 0,
- isFreight: false,
- basis: `parcel @ ${w} lb`,
- };
- }
-
- // LTL freight: base handling + per-CWT (hundredweight) rate.
- const base = 95;
- const perCwt = 28;
- const cwt = w / 100;
- const freight = round2(base + perCwt * cwt);
- return {
- parcelShipping: 0,
- freight,
- isFreight: true,
- basis: `LTL: $${base} base + $${perCwt}/cwt × ${cwt.toFixed(2)}cwt`,
- };
-}
diff --git a/govarbitrage/src/engines/scoring.test.ts b/govarbitrage/src/engines/scoring.test.ts
deleted file mode 100644
index acc3bbe..0000000
--- a/govarbitrage/src/engines/scoring.test.ts
+++ /dev/null
@@ -1,72 +0,0 @@
-import { describe, expect, it } from "vitest";
-import { computeScores, computeComponents } from "./scoring";
-import type { ScoreInput } from "./scoring";
-
-const base: ScoreInput = {
- roi: 0.6,
- expectedNetProfit: 3000,
- demandScore: 70,
- daysUntilSold: 25,
- weightLbs: 40,
- condition: "USED_GOOD",
- bidCount: 2,
- localPickup: false,
- hasBuyerLeads: false,
- confidenceScore: 80,
- probabilityOfSale: 0.7,
- isFreight: false,
-};
-
-describe("computeScores", () => {
- it("returns all nine scoring profiles", () => {
- const scores = computeScores(base);
- expect(scores).toHaveLength(9);
- const profiles = scores.map((s) => s.profile).sort();
- expect(profiles).toContain("OVERALL_OPPORTUNITY");
- expect(profiles).toContain("BEST_ARBITRAGE");
- expect(profiles).toContain("PARTS_ONLY");
- });
-
- it("every score is 0..100 and carries a non-empty explanation", () => {
- for (const s of computeScores(base)) {
- expect(s.value).toBeGreaterThanOrEqual(0);
- expect(s.value).toBeLessThanOrEqual(100);
- expect(s.explanation.length).toBeGreaterThan(20);
- expect(s.factors.length).toBeGreaterThan(0);
- }
- });
-
- it("rewards a genuine salvage lot under PARTS_ONLY and penalizes non-parts", () => {
- const parts = computeScores({ ...base, condition: "FOR_PARTS" }).find(
- (s) => s.profile === "PARTS_ONLY",
- )!;
- const notParts = computeScores({ ...base, condition: "NEW" }).find(
- (s) => s.profile === "PARTS_ONLY",
- )!;
- expect(parts.value).toBeGreaterThan(notParts.value);
- });
-
- it("higher ROI raises the arbitrage component and BEST_ARBITRAGE score", () => {
- const low = computeScores({ ...base, roi: 0.05 }).find((s) => s.profile === "BEST_ARBITRAGE")!;
- const high = computeScores({ ...base, roi: 1.5 }).find((s) => s.profile === "BEST_ARBITRAGE")!;
- expect(high.value).toBeGreaterThan(low.value);
- });
-
- it("flags HIGH risk on low confidence + thin margin", () => {
- const risky = computeScores({
- ...base,
- confidenceScore: 30,
- roi: 0.05,
- condition: "UNKNOWN",
- daysUntilSold: 100,
- })[0];
- expect(risky.risk).toBe("HIGH");
- });
-
- it("marks light non-pickup items as EASY drop-ship, heavy freight as harder", () => {
- const easy = computeComponents(base);
- expect(easy.logistics).toBeGreaterThan(50);
- const heavy = computeScores({ ...base, weightLbs: 700, isFreight: true })[0];
- expect(["DIFFICULT", "INFEASIBLE", "MODERATE"]).toContain(heavy.dropShip);
- });
-});
diff --git a/govarbitrage/src/engines/scoring.ts b/govarbitrage/src/engines/scoring.ts
deleted file mode 100644
index 8f45118..0000000
--- a/govarbitrage/src/engines/scoring.ts
+++ /dev/null
@@ -1,196 +0,0 @@
-import { clamp, round2, formatPercent, formatMoney } from "@/lib/utils";
-import type {
- ConditionKey,
- DropShipKey,
- ProfileScore,
- RiskKey,
- ScoreComponents,
- ScoreProfileKey,
-} from "./types";
-
-export interface ScoreInput {
- roi: number;
- expectedNetProfit: number;
- demandScore: number; // 0..100
- daysUntilSold: number;
- weightLbs: number;
- condition: ConditionKey;
- bidCount: number;
- localPickup: boolean;
- hasBuyerLeads: boolean;
- confidenceScore: number; // 0..100
- probabilityOfSale: number; // 0..1
- isFreight: boolean;
-}
-
-const CONDITION_SCORE: Record<ConditionKey, number> = {
- NEW: 95,
- LIKE_NEW: 82,
- USED_GOOD: 65,
- USED_FAIR: 45,
- FOR_PARTS: 22,
- UNKNOWN: 40,
-};
-
-/** Map an ROI ratio onto a 0..100 arbitrage score with diminishing returns. */
-function arbitrageFromRoi(roi: number): number {
- // roi -0.5 -> ~5, 0 -> 35, 0.4 -> 70, 1.0 -> 88, 2.0+ -> ~98
- const s = 35 + 55 * (1 - Math.exp(-1.15 * Math.max(0, roi))) + (roi < 0 ? roi * 60 : 0);
- return clamp(s, 0, 100);
-}
-
-/** Compute the seven component sub-scores. */
-export function computeComponents(input: ScoreInput): ScoreComponents {
- const arbitrage = round2(arbitrageFromRoi(input.roi));
- const demand = round2(clamp(input.demandScore, 0, 100));
- const velocity = round2(clamp(100 - input.daysUntilSold * 0.72, 0, 100));
-
- // Logistics: lighter + parcel-shippable is best; freight and heavy items hurt.
- let logistics = 100 - Math.min(input.weightLbs, 1000) * 0.06;
- if (input.isFreight) logistics -= 25;
- if (input.localPickup) logistics -= 10; // pickup adds friction unless local buyer
- logistics = round2(clamp(logistics, 0, 100));
-
- const condition = CONDITION_SCORE[input.condition] ?? 40;
- const competition = round2(clamp(95 - input.bidCount * 6, 5, 100));
- const buyer = round2(
- clamp(input.probabilityOfSale * 70 + (input.hasBuyerLeads ? 25 : 0) + input.demandScore * 0.1, 0, 100),
- );
-
- return { arbitrage, demand, velocity, logistics, condition, competition, buyer };
-}
-
-export function computeRisk(input: ScoreInput, c: ScoreComponents): RiskKey {
- let risk = 0;
- if (input.confidenceScore < 45) risk += 2;
- else if (input.confidenceScore < 70) risk += 1;
- if (input.roi < 0.15) risk += 2;
- else if (input.roi < 0.35) risk += 1;
- if (input.condition === "FOR_PARTS" || input.condition === "UNKNOWN") risk += 1;
- if (c.velocity < 40) risk += 1;
- if (risk >= 4) return "HIGH";
- if (risk >= 2) return "MEDIUM";
- return "LOW";
-}
-
-export function computeDropShip(input: ScoreInput): DropShipKey {
- // Drop-ship feasibility: can this move seller -> buyer without you touching it?
- if (input.localPickup && input.weightLbs > 300) return "INFEASIBLE";
- if (input.isFreight) return input.weightLbs > 500 ? "DIFFICULT" : "MODERATE";
- if (input.weightLbs <= 50 && !input.localPickup) return "EASY";
- if (input.weightLbs <= 150) return "MODERATE";
- return "DIFFICULT";
-}
-
-// Per-profile component weights. Each row sums to ~1 across the 7 components.
-const PROFILE_WEIGHTS: Record<
- ScoreProfileKey,
- Partial<ScoreComponents> & { _confidence?: number }
-> = {
- OVERALL_OPPORTUNITY: { arbitrage: 0.28, demand: 0.18, velocity: 0.14, logistics: 0.12, condition: 0.1, competition: 0.1, buyer: 0.08 },
- BEST_ARBITRAGE: { arbitrage: 0.5, demand: 0.2, competition: 0.15, condition: 0.15 },
- QUICK_FLIP: { velocity: 0.4, demand: 0.25, logistics: 0.2, arbitrage: 0.15 },
- COLLECTOR: { demand: 0.4, condition: 0.35, arbitrage: 0.25 },
- LOCAL_PICKUP: { arbitrage: 0.4, demand: 0.25, condition: 0.2, competition: 0.15 },
- EASY_FREIGHT: { logistics: 0.45, arbitrage: 0.3, demand: 0.25 },
- PARTS_ONLY: { arbitrage: 0.55, demand: 0.25, competition: 0.2 },
- HIGH_CONFIDENCE: { arbitrage: 0.3, demand: 0.2, condition: 0.2, buyer: 0.15, velocity: 0.15 },
- HIGH_PROFIT: { arbitrage: 0.45, demand: 0.3, velocity: 0.15, logistics: 0.1 },
-};
-
-const PROFILE_LABEL: Record<ScoreProfileKey, string> = {
- OVERALL_OPPORTUNITY: "Overall Opportunity",
- BEST_ARBITRAGE: "Best Arbitrage",
- QUICK_FLIP: "Quick Flip",
- COLLECTOR: "Collector",
- LOCAL_PICKUP: "Local Pickup",
- EASY_FREIGHT: "Easy Freight",
- PARTS_ONLY: "Parts Only",
- HIGH_CONFIDENCE: "High Confidence",
- HIGH_PROFIT: "High Profit",
-};
-
-const COMPONENT_LABEL: Record<keyof ScoreComponents, string> = {
- arbitrage: "arbitrage margin",
- demand: "market demand",
- velocity: "sale velocity",
- logistics: "logistics ease",
- condition: "item condition",
- competition: "low competition",
- buyer: "buyer readiness",
-};
-
-function scoreProfile(
- profile: ScoreProfileKey,
- c: ScoreComponents,
- input: ScoreInput,
- risk: RiskKey,
- dropShip: DropShipKey,
-): ProfileScore {
- const weights = PROFILE_WEIGHTS[profile];
- const factors: ProfileScore["factors"] = [];
- let value = 0;
-
- for (const [key, w] of Object.entries(weights) as [keyof ScoreComponents, number][]) {
- if (key === ("_confidence" as keyof ScoreComponents)) continue;
- const comp = c[key] ?? 0;
- const contribution = round2(comp * w);
- value += contribution;
- factors.push({ label: COMPONENT_LABEL[key], weight: w, contribution });
- }
-
- // Profile-specific adjustments beyond the weighted base.
- let adjustment = 0;
- const notes: string[] = [];
- if (profile === "HIGH_CONFIDENCE") {
- adjustment = (input.confidenceScore - 50) * 0.3;
- notes.push(`confidence ${input.confidenceScore.toFixed(0)}/100`);
- }
- if (profile === "PARTS_ONLY" && input.condition !== "FOR_PARTS") {
- adjustment -= 20; // parts-only profile penalizes non-parts items
- notes.push("not a parts/salvage lot");
- }
- if (profile === "PARTS_ONLY" && input.condition === "FOR_PARTS") {
- adjustment += 12;
- notes.push("genuine salvage lot");
- }
- if (profile === "LOCAL_PICKUP") {
- adjustment += input.localPickup ? 8 : -12;
- notes.push(input.localPickup ? "local pickup available" : "no local pickup");
- }
- if (profile === "EASY_FREIGHT" && input.isFreight) {
- adjustment -= 15;
- notes.push("ships as LTL freight");
- }
- if (profile === "HIGH_PROFIT") {
- // Reward large absolute dollars, not just ratio.
- adjustment += clamp(input.expectedNetProfit / 250, -10, 20);
- notes.push(`${formatMoney(input.expectedNetProfit)} est. net`);
- }
-
- value = round2(clamp(value + adjustment, 0, 100));
-
- // Build the "why" explanation from the top contributors.
- const top = [...factors].sort((a, b) => b.contribution - a.contribution).slice(0, 3);
- const drivers = top
- .map((f) => `${f.label} (${f.contribution.toFixed(0)} pts)`)
- .join(", ");
- const roiPhrase = `ROI ${formatPercent(input.roi)}`;
- const extra = notes.length ? ` Adjustments: ${notes.join("; ")}.` : "";
- const explanation =
- `${PROFILE_LABEL[profile]} scored ${value.toFixed(0)}/100. ` +
- `Top drivers: ${drivers}. ${roiPhrase}, ${input.daysUntilSold}d to sell, ` +
- `risk ${risk}, drop-ship ${dropShip}.${extra}`;
-
- return { profile, value, components: c, risk, dropShip, explanation, factors };
-}
-
-/** Compute all nine profile scores for a listing. */
-export function computeScores(input: ScoreInput): ProfileScore[] {
- const c = computeComponents(input);
- const risk = computeRisk(input, c);
- const dropShip = computeDropShip(input);
- return (Object.keys(PROFILE_WEIGHTS) as ScoreProfileKey[]).map((p) =>
- scoreProfile(p, c, input, risk, dropShip),
- );
-}
diff --git a/govarbitrage/src/engines/types.ts b/govarbitrage/src/engines/types.ts
deleted file mode 100644
index e9b95c5..0000000
--- a/govarbitrage/src/engines/types.ts
+++ /dev/null
@@ -1,133 +0,0 @@
-// Shared engine types. Engines operate on plain numbers (US dollars) so they
-// are pure, deterministic, and unit-testable independent of Prisma/Decimal.
-
-export type ConditionKey =
- | "NEW"
- | "LIKE_NEW"
- | "USED_GOOD"
- | "USED_FAIR"
- | "FOR_PARTS"
- | "UNKNOWN";
-
-export type SourceKey =
- | "GOVDEALS"
- | "PUBLIC_SURPLUS"
- | "GSA_AUCTIONS"
- | "COUNTY"
- | "STATE_SURPLUS"
- | "UNIVERSITY_SURPLUS"
- | "MUNICIBID"
- | "BID4ASSETS"
- | "CSV"
- | "EXTENSION"
- | "OTHER";
-
-export type RiskKey = "LOW" | "MEDIUM" | "HIGH";
-export type DropShipKey = "EASY" | "MODERATE" | "DIFFICULT" | "INFEASIBLE";
-
-export type ScoreProfileKey =
- | "OVERALL_OPPORTUNITY"
- | "BEST_ARBITRAGE"
- | "QUICK_FLIP"
- | "COLLECTOR"
- | "LOCAL_PICKUP"
- | "EASY_FREIGHT"
- | "PARTS_ONLY"
- | "HIGH_CONFIDENCE"
- | "HIGH_PROFIT";
-
-/** Inputs the valuation engine needs (anchor + item facts). */
-export interface ValuationInput {
- /** Best estimate of new retail price; the anchor for all derived values. */
- newRetail: number;
- condition: ConditionKey;
- quantity: number;
- /** 0..100 demand for this category/brand (from research/AI or a default). */
- demandScore: number;
- /** How well the item was identified (0..1); drives confidence. */
- identificationConfidence: number;
- /** Count of real comparable sales found; drives confidence. */
- comparableCount?: number;
-}
-
-export interface Valuation {
- newRetail: number;
- newReplacement: number;
- avgRetail: number;
- usedSoldPrice: number;
- usedAskingPrice: number;
- usedLow: number;
- usedHigh: number;
- wholesaleValue: number;
- liquidationValue: number;
- sellTodayValue: number;
- value7Day: number;
- value30Day: number;
- value90Day: number;
- expectedSalePrice: number;
- probabilityOfSale: number; // 0..1
- daysUntilSold: number;
- confidenceScore: number; // 0..100
-}
-
-export interface CostInput {
- source: SourceKey;
- winningBid: number;
- quantity: number;
- weightLbs: number;
- condition: ConditionKey;
- expectedSalePrice: number;
- daysUntilSold: number;
- /** true when the item must be picked up in person (no shipping from seller). */
- localPickup?: boolean;
- /** destination sales-tax rate applied to the purchase (resale certs may zero this). */
- purchaseTaxRate?: number;
- /** repair estimate override (else derived from condition). */
- repairsOverride?: number;
-}
-
-export interface CostBreakdown {
- winningBid: number;
- buyerPremium: number;
- salesTax: number;
- shipping: number;
- freight: number;
- insurance: number;
- packing: number;
- pickupLabor: number;
- testing: number;
- repairs: number;
- certification: number;
- marketplaceFees: number;
- paymentFees: number;
- storage: number;
- photography: number;
- listingLabor: number;
- expectedReturns: number;
- totalInvestment: number;
- expectedNetProfit: number;
- roi: number;
- annualizedReturn: number;
- recommendedMaxBid: number;
- assumptions: Record<string, string | number>;
-}
-
-export interface ScoreComponents {
- arbitrage: number;
- demand: number;
- velocity: number;
- logistics: number;
- condition: number;
- competition: number;
- buyer: number;
-}
-
-export interface ProfileScore {
- profile: ScoreProfileKey;
- value: number;
- components: ScoreComponents;
- risk: RiskKey;
- dropShip: DropShipKey;
- explanation: string;
- factors: { label: string; weight: number; contribution: number }[];
-}
diff --git a/govarbitrage/src/engines/valuation.test.ts b/govarbitrage/src/engines/valuation.test.ts
deleted file mode 100644
index a8af7ee..0000000
--- a/govarbitrage/src/engines/valuation.test.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { describe, expect, it } from "vitest";
-import { computeValuation } from "./valuation";
-
-describe("computeValuation", () => {
- it("derives a full valuation ladder from a retail anchor", () => {
- const v = computeValuation({
- newRetail: 20000,
- condition: "USED_GOOD",
- quantity: 1,
- demandScore: 70,
- identificationConfidence: 0.9,
- comparableCount: 6,
- });
-
- // Used-good sits at ~46% of retail.
- expect(v.usedSoldPrice).toBeCloseTo(9200, 0);
- expect(v.usedAskingPrice).toBeGreaterThan(v.usedSoldPrice);
- expect(v.usedLow).toBeLessThan(v.usedSoldPrice);
- expect(v.usedHigh).toBeGreaterThan(v.usedSoldPrice);
- // Channel ordering: liquidation < wholesale < used.
- expect(v.liquidationValue).toBeLessThan(v.wholesaleValue);
- expect(v.wholesaleValue).toBeLessThan(v.usedSoldPrice);
- // Longer horizon fetches more than a fire sale.
- expect(v.value90Day).toBeGreaterThan(v.sellTodayValue);
- expect(v.expectedSalePrice).toBeGreaterThan(0);
- });
-
- it("scales expected sale price by quantity", () => {
- const one = computeValuation({
- newRetail: 500,
- condition: "LIKE_NEW",
- quantity: 1,
- demandScore: 50,
- identificationConfidence: 0.6,
- });
- const ten = computeValuation({
- newRetail: 500,
- condition: "LIKE_NEW",
- quantity: 10,
- demandScore: 50,
- identificationConfidence: 0.6,
- });
- expect(ten.expectedSalePrice).toBeCloseTo(one.expectedSalePrice * 10, 0);
- });
-
- it("gives higher confidence with more comparables and better ID", () => {
- const weak = computeValuation({
- newRetail: 1000,
- condition: "UNKNOWN",
- quantity: 1,
- demandScore: 40,
- identificationConfidence: 0.2,
- comparableCount: 0,
- });
- const strong = computeValuation({
- newRetail: 1000,
- condition: "USED_GOOD",
- quantity: 1,
- demandScore: 40,
- identificationConfidence: 0.95,
- comparableCount: 8,
- });
- expect(strong.confidenceScore).toBeGreaterThan(weak.confidenceScore);
- expect(strong.confidenceScore).toBeLessThanOrEqual(100);
- });
-
- it("rewards high demand with faster sale and higher probability", () => {
- const lowDemand = computeValuation({
- newRetail: 1000,
- condition: "USED_GOOD",
- quantity: 1,
- demandScore: 10,
- identificationConfidence: 0.7,
- });
- const highDemand = computeValuation({
- newRetail: 1000,
- condition: "USED_GOOD",
- quantity: 1,
- demandScore: 95,
- identificationConfidence: 0.7,
- });
- expect(highDemand.daysUntilSold).toBeLessThan(lowDemand.daysUntilSold);
- expect(highDemand.probabilityOfSale).toBeGreaterThan(lowDemand.probabilityOfSale);
- });
-});
diff --git a/govarbitrage/src/engines/valuation.ts b/govarbitrage/src/engines/valuation.ts
deleted file mode 100644
index 1f80eaf..0000000
--- a/govarbitrage/src/engines/valuation.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-import { clamp, round2 } from "@/lib/utils";
-import { CONDITION_RETAIL_FACTOR } from "./constants";
-import type { Valuation, ValuationInput } from "./types";
-
-/**
- * Derive the full valuation ladder from a single retail anchor plus item facts.
- *
- * The AI/research layer supplies the hard-to-know inputs (a `newRetail` anchor,
- * a `demandScore`, identification confidence, comparable count); everything
- * else is derived deterministically here so the numbers are reproducible and
- * explainable rather than a black box.
- */
-export function computeValuation(input: ValuationInput): Valuation {
- const qty = Math.max(1, input.quantity || 1);
- const perUnitRetail = Math.max(0, input.newRetail);
- const condFactor = CONDITION_RETAIL_FACTOR[input.condition] ?? 0.35;
- const demand = clamp(input.demandScore ?? 50, 0, 100);
-
- // Per-unit retail figures.
- const newRetail = perUnitRetail;
- const newReplacement = round2(perUnitRetail * 1.05); // like-for-like buy-new cost
- const avgRetail = round2(perUnitRetail * 0.92); // street average vs MSRP
-
- // Used market, anchored off condition.
- const usedSoldPrice = round2(perUnitRetail * condFactor);
- const usedAskingPrice = round2(usedSoldPrice * 1.25);
- const usedLow = round2(usedSoldPrice * 0.8);
- const usedHigh = round2(usedSoldPrice * 1.3);
-
- // Channel values (per unit).
- const wholesaleValue = round2(usedSoldPrice * 0.6);
- const liquidationValue = round2(usedSoldPrice * 0.42);
- const sellTodayValue = round2(liquidationValue * 1.1); // fire-sale, today
-
- // Time-horizon values: the longer you wait, the closer to asking you get,
- // scaled by how much demand there is.
- const patience = 0.5 + demand / 200; // 0.5..1.0
- const value7Day = round2(usedSoldPrice * (0.8 + 0.1 * patience));
- const value30Day = round2(usedSoldPrice * (0.95 + 0.1 * patience));
- const value90Day = round2(usedAskingPrice * (0.85 + 0.1 * patience));
-
- // Expected sale price: demand-weighted blend across horizons.
- const expectedSalePrice = round2(
- value7Day * 0.2 + value30Day * 0.5 + value90Day * 0.3,
- );
-
- // Probability of sale within 90 days, driven by demand + condition quality.
- const probabilityOfSale = round2(
- clamp(0.35 + demand / 200 + (condFactor - 0.35) * 0.4, 0.1, 0.98),
- );
-
- // Days until sold: high demand sells fast; low demand lingers.
- const daysUntilSold = Math.round(clamp(90 - demand * 0.75, 5, 120));
-
- // Confidence: how much do we trust these numbers? Built from identification
- // confidence and the number of real comparables backing the estimate.
- const idConf = clamp(input.identificationConfidence ?? 0.5, 0, 1);
- const comps = input.comparableCount ?? 0;
- const confidenceScore = round2(
- clamp(idConf * 60 + Math.min(comps, 8) * 5, 0, 100),
- );
-
- // Return per-unit valuations but scale the aggregate resale-relevant figure
- // (expectedSalePrice) by quantity, since a lot of N sells N units.
- return {
- newRetail,
- newReplacement,
- avgRetail,
- usedSoldPrice,
- usedAskingPrice,
- usedLow,
- usedHigh,
- wholesaleValue,
- liquidationValue,
- sellTodayValue,
- value7Day,
- value30Day,
- value90Day,
- expectedSalePrice: round2(expectedSalePrice * qty),
- probabilityOfSale,
- daysUntilSold,
- confidenceScore,
- };
-}
diff --git a/govarbitrage/src/importers/apify-govdeals.ts b/govarbitrage/src/importers/apify-govdeals.ts
deleted file mode 100644
index e4fc9ef..0000000
--- a/govarbitrage/src/importers/apify-govdeals.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-import type { RawListing } from "./ingest";
-
-// GovDeals via the Apify actor `parseforge/govdeals-scraper` — bypasses GovDeals'
-// Akamai bot-wall (Apify handles it). We READ finished datasets (free); running
-// the actor for FRESH data costs Apify compute (~$0.0037/listing) and is gated.
-//
-// Env: APIFY_TOKEN (required). Optionally APIFY_GOVDEALS_ACTOR (default the known
-// actor) and APIFY_GOVDEALS_DATASET (a specific dataset id to read).
-
-const API = "https://api.apify.com/v2";
-const DEFAULT_ACTOR = process.env.APIFY_GOVDEALS_ACTOR || "SZdBCF9FpwOzvByvM"; // parseforge/govdeals-scraper
-
-interface ApifyItem {
- title?: string;
- url?: string;
- imageUrl?: string;
- photos?: (string | { url?: string })[];
- accountId?: number;
- assetId?: number;
- auctionId?: number;
- category?: string;
- parentCategory?: string;
- make?: string | null;
- model?: string | null;
- condition?: string | null;
- quantity?: number;
- weight?: number | null;
- description?: string;
- locationCity?: string;
- locationState?: string;
- locationZip?: string;
- currentBid?: number;
- bidCount?: number;
- auctionEnd?: string;
- auctionEndUtc?: string;
- specialInstructions?: string;
- removalInstructions?: string;
- paymentInstructions?: string;
-}
-
-const CONDITION_MAP: Record<string, RawListing["condition"]> = {
- N: "NEW",
- U: "USED_GOOD",
- R: "LIKE_NEW",
- F: "USED_FAIR",
- S: "FOR_PARTS",
- P: "FOR_PARTS",
-};
-
-const stripHtml = (s?: string) =>
- (s || "").replace(/<[^>]*>/g, " ").replace(/ /g, " ").replace(/\s+/g, " ").trim() || undefined;
-
-function photoUrls(item: ApifyItem): string[] {
- if (Array.isArray(item.photos) && item.photos.length) {
- return item.photos.map((p) => (typeof p === "string" ? p : p?.url || "")).filter(Boolean).slice(0, 8);
- }
- return item.imageUrl ? [item.imageUrl] : [];
-}
-
-function mapItem(it: ApifyItem): RawListing | null {
- const title = it.title?.trim();
- if (!title || it.assetId == null) return null;
- return {
- source: "GOVDEALS",
- sourceAuctionId: `${it.accountId ?? "x"}-${it.assetId}`,
- sourceUrl: it.url || "https://www.govdeals.com",
- title,
- description: stripHtml(it.description),
- category: it.category || it.parentCategory || undefined,
- manufacturer: it.make || undefined,
- model: it.model || undefined,
- condition: CONDITION_MAP[(it.condition || "").trim().toUpperCase()] || "UNKNOWN",
- quantity: it.quantity && it.quantity > 0 ? it.quantity : 1,
- weightLbs: it.weight ?? undefined,
- locationCity: it.locationCity,
- locationState: it.locationState,
- locationZip: it.locationZip,
- currentBid: it.currentBid ?? 0,
- bidCount: it.bidCount ?? 0,
- closingAt: it.auctionEndUtc || it.auctionEnd || null,
- imageUrls: photoUrls(it),
- auctionTerms: [it.specialInstructions, it.removalInstructions, it.paymentInstructions]
- .map(stripHtml)
- .filter(Boolean)
- .join(" ") || undefined,
- };
-}
-
-async function apifyJson(path: string): Promise<unknown> {
- const token = process.env.APIFY_TOKEN;
- if (!token) throw new Error("APIFY_TOKEN not set");
- const sep = path.includes("?") ? "&" : "?";
- const res = await fetch(`${API}${path}${sep}token=${token}&clean=true`);
- if (!res.ok) throw new Error(`Apify ${res.status}: ${(await res.text()).slice(0, 160)}`);
- return res.json();
-}
-
-/** Read an already-scraped dataset by id (free). */
-export async function fetchApifyDataset(datasetId: string, limit = 200): Promise<RawListing[]> {
- const items = (await apifyJson(`/datasets/${datasetId}/items?limit=${limit}`)) as ApifyItem[];
- return items.map(mapItem).filter((x): x is RawListing => x !== null);
-}
-
-/** Read the most recent SUCCEEDED run's dataset for the GovDeals actor (free). */
-export async function fetchApifyLastRun(limit = 200): Promise<RawListing[]> {
- const items = (await apifyJson(
- `/acts/${DEFAULT_ACTOR}/runs/last/dataset/items?status=SUCCEEDED&limit=${limit}`,
- )) as ApifyItem[];
- return items.map(mapItem).filter((x): x is RawListing => x !== null);
-}
-
-/**
- * Trigger a NEW GovDeals scrape run (PAID — ~$0.0037/listing) and return the
- * scraped rows plus the run's actual USD cost. Steve-authorized for the daily
- * 100-listing job. Polls up to ~8 min for completion.
- */
-export async function triggerApifyRun(
- maxItems = 100,
-): Promise<{ rows: RawListing[]; costUsd: number; runId: string }> {
- const token = process.env.APIFY_TOKEN;
- if (!token) throw new Error("APIFY_TOKEN not set");
-
- const startRes = await fetch(`${API}/acts/${DEFAULT_ACTOR}/runs?token=${token}`, {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ maxItems, sortOrder: "asc" }),
- });
- if (!startRes.ok) throw new Error(`Apify run start ${startRes.status}: ${(await startRes.text()).slice(0, 160)}`);
- const run = ((await startRes.json()) as { data: { id: string; status: string; defaultDatasetId: string } }).data;
-
- const deadline = Date.now() + 8 * 60 * 1000;
- let status = run.status;
- let datasetId = run.defaultDatasetId;
- let costUsd = 0;
- while (Date.now() < deadline) {
- await new Promise((r) => setTimeout(r, 5000));
- const res = await fetch(`${API}/actor-runs/${run.id}?token=${token}`);
- const s = ((await res.json()) as { data: { status: string; defaultDatasetId: string; usageTotalUsd?: number } }).data;
- status = s.status;
- datasetId = s.defaultDatasetId;
- costUsd = s.usageTotalUsd ?? 0;
- if (["SUCCEEDED", "FAILED", "ABORTED", "TIMED-OUT"].includes(status)) break;
- }
- if (status !== "SUCCEEDED") throw new Error(`Apify run ${run.id} ended ${status}`);
-
- const rows = await fetchApifyDataset(datasetId, maxItems);
- return { rows, costUsd, runId: run.id };
-}
diff --git a/govarbitrage/src/importers/csv.ts b/govarbitrage/src/importers/csv.ts
deleted file mode 100644
index 5e255fe..0000000
--- a/govarbitrage/src/importers/csv.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import { parse } from "csv-parse/sync";
-import type { RawListing } from "./ingest";
-
-// Column aliases → RawListing fields, so operators can paste varied CSVs.
-const FIELD_ALIASES: Record<string, keyof RawListing> = {
- source: "source",
- auction: "sourceAuctionId",
- "auction #": "sourceAuctionId",
- auction_id: "sourceAuctionId",
- sourceauctionid: "sourceAuctionId",
- url: "sourceUrl",
- link: "sourceUrl",
- title: "title",
- name: "title",
- description: "description",
- desc: "description",
- category: "category",
- manufacturer: "manufacturer",
- mfr: "manufacturer",
- brand: "manufacturer",
- model: "model",
- condition: "condition",
- quantity: "quantity",
- qty: "quantity",
- weight: "weightLbs",
- weightlbs: "weightLbs",
- dimensions: "dimensions",
- city: "locationCity",
- state: "locationState",
- zip: "locationZip",
- bid: "currentBid",
- currentbid: "currentBid",
- "current bid": "currentBid",
- bidcount: "bidCount",
- bids: "bidCount",
- closing: "closingAt",
- closingat: "closingAt",
- "closing date": "closingAt",
- images: "imageUrls",
- imageurls: "imageUrls",
- terms: "auctionTerms",
-};
-
-const NUMERIC: (keyof RawListing)[] = ["quantity", "weightLbs", "currentBid", "bidCount"];
-
-/** Parse a CSV string into normalized RawListing rows (header-driven, alias-aware). */
-export function parseListingsCsv(text: string): RawListing[] {
- const records = parse(text, {
- columns: (header: string[]) => header.map((h) => h.trim().toLowerCase()),
- skip_empty_lines: true,
- trim: true,
- relax_column_count: true,
- }) as Record<string, string>[];
-
- return records.map((rec) => {
- const raw: Record<string, unknown> = {};
- for (const [key, value] of Object.entries(rec)) {
- const field = FIELD_ALIASES[key];
- if (!field || value === "" || value == null) continue;
- if (NUMERIC.includes(field)) {
- const num = Number(String(value).replace(/[$,]/g, ""));
- if (!Number.isNaN(num)) raw[field] = num;
- } else if (field === "imageUrls") {
- raw[field] = String(value).split(/[|;]/).map((s) => s.trim()).filter(Boolean);
- } else {
- raw[field] = value;
- }
- }
- return raw as unknown as RawListing;
- });
-}
diff --git a/govarbitrage/src/importers/govdeals-free.ts b/govarbitrage/src/importers/govdeals-free.ts
deleted file mode 100644
index ef95144..0000000
--- a/govarbitrage/src/importers/govdeals-free.ts
+++ /dev/null
@@ -1,127 +0,0 @@
-import type { RawListing } from "./ingest";
-
-// FREE GovDeals importer — hits GovDeals' own backend search API directly
-// (maestro.lqdt1.com/search/list), the same call the site's Angular app makes.
-// No Apify, no scraping, no login, $0. The x-api-key is GovDeals' PUBLIC client
-// key (shipped in their public JS bundle), overridable via GOVDEALS_MAESTRO_KEY.
-//
-// The same endpoint serves sibling Liquidity Services marketplaces by businessId:
-// GD = GovDeals · GI = GoIndustry DoveBid · NI = Network Int'l.
-
-const MAESTRO = "https://maestro.lqdt1.com/search/list";
-const API_KEY = process.env.GOVDEALS_MAESTRO_KEY || "af93060f-337e-428c-87b8-c74b5837d6cd";
-const PHOTO_BASE = "https://webassets.lqdt1.com/assets/photos";
-
-interface Asset {
- accountId?: number;
- assetId?: number;
- assetShortDescription?: string;
- assetLongDescription?: string | null;
- makebrand?: string | null;
- model?: string | null;
- modelYear?: string | null;
- categoryDescription?: string | null;
- currentBid?: number | null;
- bidCount?: number | null;
- assetAuctionEndDate?: string | null;
- locationCity?: string;
- locationState?: string;
- locationZip?: string;
- photo?: string | null;
-}
-
-const uuid = () => globalThis.crypto.randomUUID();
-
-// Liquidity Services marketplaces served by the same maestro API, keyed by businessId.
-export const MARKETS: Record<string, { source: string; base: string }> = {
- GD: { source: "GOVDEALS", base: "https://www.govdeals.com" },
- GI: { source: "GOINDUSTRY", base: "https://www.go-dove.com" },
- NI: { source: "NETWORK_INTL", base: "https://www.networkintl.com" },
-};
-
-function mapAsset(a: Asset, market: { source: string; base: string }): RawListing | null {
- if (!a.assetShortDescription || a.assetId == null) return null;
- return {
- source: market.source,
- sourceAuctionId: `${a.accountId ?? "x"}-${a.assetId}`,
- sourceUrl: `${market.base}/en/asset/${a.accountId}/${a.assetId}`,
- title: a.assetShortDescription.trim(),
- description: a.assetLongDescription || undefined,
- category: a.categoryDescription || undefined,
- manufacturer: a.makebrand || undefined,
- model: a.model || undefined,
- condition: "UNKNOWN",
- quantity: 1,
- locationCity: a.locationCity,
- locationState: a.locationState,
- locationZip: a.locationZip,
- currentBid: Number(a.currentBid) || 0,
- bidCount: Number(a.bidCount) || 0,
- closingAt: a.assetAuctionEndDate || null,
- imageUrls: a.photo ? [`${PHOTO_BASE}/${a.accountId}/${a.photo}`] : [],
- };
-}
-
-async function fetchPage(businessId: string, page: number, displayRows: number): Promise<Asset[]> {
- const body = {
- categoryIds: "",
- businessId,
- searchText: "*",
- isQAL: false,
- locationId: null,
- model: "",
- makebrand: "",
- auctionTypeId: null,
- page,
- displayRows,
- sortField: "bestfit",
- sortOrder: "",
- sessionId: uuid(),
- requestType: "search",
- responseStyle: "fullResponse",
- facets: [
- "categoryName", "auctionTypeID", "condition", "saleEventName", "sellerDisplayName",
- "product_pricecents", "isReserveMet", "hasBuyNowPrice", "isReserveNotMet", "sellerType",
- "warehouseId", "region", "currencyTypeCode", "tierId",
- ],
- facetsFilter: [],
- timeType: "newListings",
- sellerTypeId: null,
- accountIds: [],
- };
- const res = await fetch(MAESTRO, {
- method: "POST",
- headers: {
- "x-api-key": API_KEY,
- "Content-Type": "application/json",
- audience: "Ecom",
- "x-user-id": "-1",
- "x-api-correlation-id": uuid(),
- },
- body: JSON.stringify(body),
- });
- if (!res.ok) throw new Error(`maestro ${res.status}: ${(await res.text()).slice(0, 160)}`);
- const j = (await res.json()) as { assetSearchResults?: Asset[] };
- return j.assetSearchResults ?? [];
-}
-
-/** Fetch newest GovDeals (or GI/NI) listings, paging until `limit`. Free, $0. */
-export async function fetchGovdealsFree(
- opts: { limit?: number; businessId?: string } = {},
-): Promise<RawListing[]> {
- const businessId = (opts.businessId || "GD").toUpperCase();
- const market = MARKETS[businessId] ?? MARKETS.GD;
- const limit = opts.limit ?? 120;
- const perPage = 120;
- const out: RawListing[] = [];
- for (let page = 1; out.length < limit && page <= 20; page++) {
- const assets = await fetchPage(businessId, page, perPage);
- if (!assets.length) break;
- for (const a of assets) {
- const m = mapAsset(a, market);
- if (m) out.push(m);
- }
- if (assets.length < perPage) break;
- }
- return out.slice(0, limit);
-}
diff --git a/govarbitrage/src/importers/govplanet-free.ts b/govarbitrage/src/importers/govplanet-free.ts
deleted file mode 100644
index a9bf76f..0000000
--- a/govarbitrage/src/importers/govplanet-free.ts
+++ /dev/null
@@ -1,227 +0,0 @@
-import type { RawListing } from "./ingest";
-
-// FREE GovPlanet importer. $0, no browser at runtime.
-//
-// GovPlanet runs the IronPlanet / Ritchie Bros commerce stack (Java, `.ips`
-// URLs). It is NOT on the Liquidity Services `maestro.lqdt1.com` API (verified:
-// businessIds GP/GOVPLANET/IP/IRONPLANET all return 0 results). Its category
-// landing pages are JS-hydrated, BUT the item search page embeds a per-item
-// `quickviews.push({...})` JSON object with every field we need — served to
-// plain curl (HTTP 200, no bot wall). So the crack is: fetch the search HTML,
-// extract each quickviews object with a brace/string-aware scanner, JSON.parse.
-//
-// Verified 2026-07-10. Endpoints (each returns ~60 items):
-// https://www.govplanet.com/buy-now
-// https://www.govplanet.com/searchResults.ips?keyword=<kw> (empty kw = all)
-// quickviews object fields:
-// equipId, description (title), price/convPrice (USD), currency ("USD"),
-// eumeLocation, itemPageUri, photoThumb, timeLeft (relative), bidCnt, features
-// Prices are already USD (US government surplus) — no FX conversion needed.
-// Native pagination is AJAX-only, so we broaden coverage across the two base
-// endpoints plus a set of high-value category keywords, deduped by equipId.
-
-const BASE = "https://www.govplanet.com";
-const UA =
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " +
- "(KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36";
-
-// High-value US-resale categories to broaden coverage beyond the ~60-item
-// default page (GovPlanet's on-page pagination is AJAX-only).
-const KEYWORDS = [
- "", // all
- "generator",
- "truck",
- "trailer",
- "forklift",
- "excavator",
- "loader",
- "trailer",
- "tractor",
- "compressor",
- "welder",
- "hmmwv",
- "humvee",
-];
-
-function stripTags(s: string): string {
- return s
- .replace(/<[^>]*>/g, " ")
- .replace(/&/g, "&")
- .replace(/'/g, "'")
- .replace(/"/g, '"')
- .replace(/ /g, " ")
- .replace(/\s+/g, " ")
- .trim();
-}
-
-function toNumber(s: string | undefined): number {
- if (!s) return 0;
- const m = /([\d,]+(?:\.\d+)?)/.exec(s.replace(/[^0-9.,]/g, ""));
- return m ? Number(m[1].replace(/,/g, "")) : 0;
-}
-
-// Parse a relative "timeLeft" like "2 days", "4 hrs", "15 mins" -> ISO close.
-// GovPlanet often renders " " (blank) for offer-only items -> null.
-function parseRelativeClose(raw: string | undefined): string | null {
- if (!raw) return null;
- const txt = stripTags(raw).toLowerCase();
- if (!txt || /ended|closed/.test(txt)) return null;
- const units: [RegExp, number][] = [
- [/(\d+)\s*day/, 86400_000],
- [/(\d+)\s*h(?:ou)?r/, 3600_000],
- [/(\d+)\s*min/, 60_000],
- [/(\d+)\s*sec/, 1000],
- ];
- let deltaMs = 0;
- let matched = false;
- for (const [re, ms] of units) {
- const m = re.exec(txt);
- if (m) {
- deltaMs += Number(m[1]) * ms;
- matched = true;
- }
- }
- if (!matched) return null;
- return new Date(Date.now() + deltaMs).toISOString();
-}
-
-/**
- * Extract every `quickviews.push({...})` object from a GovPlanet search page.
- * Uses a string/brace-aware scanner because values contain unescaped `)` and
- * `{` inside strings (e.g. "(2,424 mi away)"), which a greedy regex would break.
- */
-function extractQuickviews(html: string): Record<string, unknown>[] {
- const out: Record<string, unknown>[] = [];
- const marker = "quickviews.push(";
- let idx = html.indexOf(marker);
- while (idx !== -1) {
- let i = idx + marker.length;
- // Expect the object to start at '{'.
- while (i < html.length && html[i] !== "{") i++;
- if (i >= html.length) break;
- const start = i;
- let depth = 0;
- let inStr = false;
- let quote = "";
- for (; i < html.length; i++) {
- const ch = html[i];
- if (inStr) {
- if (ch === "\\") {
- i++; // skip escaped char
- continue;
- }
- if (ch === quote) inStr = false;
- } else {
- if (ch === '"' || ch === "'") {
- inStr = true;
- quote = ch;
- } else if (ch === "{") depth++;
- else if (ch === "}") {
- depth--;
- if (depth === 0) {
- i++;
- break;
- }
- }
- }
- }
- const objStr = html.slice(start, i);
- try {
- out.push(JSON.parse(objStr));
- } catch {
- // Some pages use single-quoted values in a few fields; best-effort skip.
- }
- idx = html.indexOf(marker, i);
- }
- return out;
-}
-
-function qvToListing(qv: Record<string, unknown>): RawListing | null {
- const id = String(qv.equipId || qv.itemId || "").trim();
- const title = stripTags(String(qv.description || "")).trim();
- if (!id || !title) return null;
-
- const priceHtml = String(qv.price || qv.convPrice || "");
- const currentBid = toNumber(priceHtml);
-
- const uri = String(qv.itemPageUri || `/item/${id}`);
- const sourceUrl = uri.startsWith("http") ? uri : `${BASE}${uri}`;
-
- const state = String(qv.eumeLocation || "").trim() || undefined;
- const img = qv.photoThumb ? String(qv.photoThumb) : undefined;
- const bidCount = toNumber(String(qv.bidCnt || "")) || 0;
- const closingAt = parseRelativeClose(qv.timeLeft ? String(qv.timeLeft) : undefined);
- const features = stripTags(String(qv.features || "")) || undefined;
-
- return {
- source: "GOVPLANET",
- sourceAuctionId: id,
- sourceUrl,
- title,
- description: features,
- locationState: state,
- currentBid,
- bidCount,
- closingAt,
- imageUrls: img ? [img] : [],
- };
-}
-
-async function fetchSearch(keyword: string): Promise<string> {
- const url = keyword
- ? `${BASE}/searchResults.ips?keyword=${encodeURIComponent(keyword)}`
- : `${BASE}/buy-now`;
- const res = await fetch(url, {
- headers: {
- "User-Agent": UA,
- Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
- "Accept-Language": "en-US,en;q=0.9",
- },
- });
- if (!res.ok) throw new Error(`GovPlanet "${keyword || "buy-now"}" -> HTTP ${res.status}`);
- return res.text();
-}
-
-export interface FetchGovPlanetOpts {
- limit?: number;
-}
-
-/**
- * Fetch up to `limit` active GovPlanet items by scanning the buy-now page and a
- * set of high-value category keyword searches, deduped by equipId. All prices
- * are USD. $0 — plain HTTPS, no browser, no API key.
- */
-export async function fetchGovPlanetFree(
- opts: FetchGovPlanetOpts = {},
-): Promise<RawListing[]> {
- const limit = opts.limit ?? 100;
- const seen = new Set<string>();
- const rows: RawListing[] = [];
-
- // Always start with the dedicated buy-now page, then keyword searches.
- const queries = ["", ...KEYWORDS];
- const uniqueQueries = [...new Set(queries)];
-
- for (const kw of uniqueQueries) {
- if (rows.length >= limit) break;
- let html: string;
- try {
- html = await fetchSearch(kw);
- } catch (e) {
- console.warn(`[govplanet-free] ${(e as Error).message}`);
- continue;
- }
- const qvs = extractQuickviews(html);
- for (const qv of qvs) {
- const listing = qvToListing(qv);
- if (!listing) continue;
- if (seen.has(listing.sourceAuctionId)) continue;
- seen.add(listing.sourceAuctionId);
- rows.push(listing);
- if (rows.length >= limit) break;
- }
- await new Promise((r) => setTimeout(r, 350));
- }
-
- return rows.slice(0, limit);
-}
diff --git a/govarbitrage/src/importers/grays-free.ts b/govarbitrage/src/importers/grays-free.ts
deleted file mode 100644
index 67cc4fd..0000000
--- a/govarbitrage/src/importers/grays-free.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import type { RawListing } from "./ingest";
-
-// FREE GraysOnline (Australia) importer via its public Algolia search index —
-// harvested App-Id + search key from the site's client (feed-first). $0, no
-// scraping. Grays prices are AUD; converted to USD so the valuation engine stays
-// coherent (rough fixed rate — refine with a live FX feed if needed).
-
-const APP_ID = process.env.GRAYS_ALGOLIA_APP_ID || "CKPAMVUUBE";
-const API_KEY = process.env.GRAYS_ALGOLIA_KEY || "1a31357659d5c40f4641cc0d46c172d0";
-const INDEX = "GOL_MAIN";
-const AUD_TO_USD = Number(process.env.AUD_USD || 0.66);
-
-interface Hit {
- objectID?: string;
- ObjectTitle?: string;
- ObjectType?: string;
- Category?: string;
- ParentCategory?: string;
- CONDITION?: string;
- UnitQuantity?: number;
- ObjectPrice?: number;
- BidActionCount?: number;
- LOT_DEFAULT_END_TIME?: number;
- LOT_SKU?: string;
- LOT_ID?: number;
- ITEM_URL?: string;
- ImageURLS?: string[];
- SaleSuburb?: string;
- SaleState?: string;
-}
-
-function mapHit(h: Hit): RawListing | null {
- if (!h.ObjectTitle || !(h.LOT_SKU || h.LOT_ID)) return null;
- const closing = h.LOT_DEFAULT_END_TIME ? new Date(h.LOT_DEFAULT_END_TIME * 1000).toISOString() : null;
- return {
- source: "GRAYS_AU",
- sourceAuctionId: String(h.LOT_SKU || h.LOT_ID),
- sourceUrl: h.ITEM_URL ? `https://www.grays.com${h.ITEM_URL}` : "https://www.grays.com",
- title: h.ObjectTitle.trim(),
- category: h.Category || h.ParentCategory || undefined,
- condition: (h.CONDITION || "").toUpperCase().includes("NEW") ? "NEW" : "UNKNOWN",
- quantity: h.UnitQuantity && h.UnitQuantity > 0 ? Math.floor(h.UnitQuantity) : 1,
- locationCity: h.SaleSuburb,
- locationState: h.SaleState,
- // AUD → USD so downstream USD math is coherent.
- currentBid: h.ObjectPrice ? Math.round(h.ObjectPrice * AUD_TO_USD * 100) / 100 : 0,
- bidCount: h.BidActionCount ?? 0,
- closingAt: closing,
- imageUrls: Array.isArray(h.ImageURLS) ? h.ImageURLS.slice(0, 6) : [],
- auctionTerms: "GraysOnline (AU). Prices shown converted AUD→USD; freight from Australia applies.",
- };
-}
-
-/** Fetch newest Grays lots via Algolia, paging until `limit`. Free, $0. */
-export async function fetchGraysFree(opts: { limit?: number } = {}): Promise<RawListing[]> {
- const limit = opts.limit ?? 100;
- const perPage = 100;
- const out: RawListing[] = [];
- for (let page = 0; out.length < limit && page < 20; page++) {
- const res = await fetch(`https://${APP_ID}-dsn.algolia.net/1/indexes/*/queries`, {
- method: "POST",
- headers: {
- "X-Algolia-Application-Id": APP_ID,
- "X-Algolia-API-Key": API_KEY,
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- requests: [
- {
- indexName: INDEX,
- query: "",
- params: `hitsPerPage=${perPage}&page=${page}&filters=${encodeURIComponent("ObjectType:LOT OR ObjectType:RETAIL")}`,
- },
- ],
- }),
- });
- if (!res.ok) throw new Error(`Grays Algolia ${res.status}: ${(await res.text()).slice(0, 160)}`);
- const j = (await res.json()) as { results?: { hits?: Hit[] }[] };
- const hits = j.results?.[0]?.hits ?? [];
- if (!hits.length) break;
- for (const h of hits) {
- const m = mapHit(h);
- if (m) out.push(m);
- }
- if (hits.length < perPage) break;
- }
- return out.slice(0, limit);
-}
diff --git a/govarbitrage/src/importers/gsa.ts b/govarbitrage/src/importers/gsa.ts
deleted file mode 100644
index 7e3c490..0000000
--- a/govarbitrage/src/importers/gsa.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import type { RawListing } from "./ingest";
-
-// Official GSA Auctions API — free, JSON, no scraping/bot-wall. Federal surplus
-// auction listings from all participating agencies.
-// GET https://api.gsa.gov/assets/gsaauctions/v2/auctions (X-API-KEY header)
-// The endpoint 303-redirects to a pre-generated active-auctions.json on S3;
-// fetch() follows the redirect automatically.
-//
-// GSA_API_KEY defaults to the public DEMO_KEY (rate-limited). Supply an
-// api.data.gov key for production volume.
-
-const GSA_URL = "https://api.gsa.gov/assets/gsaauctions/v2/auctions";
-
-// The API returns lowercase-first field names; type them loosely + read defensively.
-interface GsaRow {
- saleNo?: string;
- lotNo?: string;
- itemName?: string;
- itemDescURL?: string;
- lotInfo?: string;
- aucStartDt?: string;
- aucEndDt?: string;
- auctionStatus?: string;
- highBidAmount?: string | number;
- reserve?: string | number;
- aucIncrement?: string | number;
- biddersCount?: string | number;
- propertyCity?: string;
- propertyState?: string;
- propertyZip?: string;
- agencyName?: string;
- bureauName?: string;
- imageURL?: string;
- instruction1?: string;
- instruction2?: string;
- instruction3?: string;
-}
-
-const numOr = (v: unknown, d = 0): number => {
- const n = Number(String(v ?? "").replace(/[$,]/g, ""));
- return Number.isFinite(n) ? n : d;
-};
-
-function mapRow(r: GsaRow): RawListing | null {
- const sale = r.saleNo?.trim();
- const lot = r.lotNo?.trim();
- const title = r.itemName?.trim();
- if (!sale || !title) return null;
-
- const terms = [r.instruction1, r.instruction2, r.instruction3, r.reserve ? `Reserve: ${r.reserve}` : "", r.aucIncrement ? `Bid increment: ${r.aucIncrement}` : ""]
- .filter(Boolean)
- .join(" ");
-
- return {
- source: "GSA_AUCTIONS",
- sourceAuctionId: [sale, lot].filter(Boolean).join("-"),
- sourceUrl: r.itemDescURL || "https://gsaauctions.gov",
- title,
- description: [r.lotInfo, r.agencyName, r.bureauName].filter(Boolean).join(" · ") || undefined,
- category: r.agencyName || undefined,
- condition: "UNKNOWN",
- quantity: 1,
- locationCity: r.propertyCity,
- locationState: r.propertyState,
- locationZip: r.propertyZip,
- currentBid: numOr(r.highBidAmount),
- bidCount: numOr(r.biddersCount),
- closingAt: r.aucEndDt || null,
- imageUrls: r.imageURL ? [r.imageURL] : [],
- auctionTerms: terms || undefined,
- };
-}
-
-/** Fetch active GSA auction listings and normalize them to RawListing[]. */
-export async function fetchGsaAuctions(opts: { limit?: number; onlyOpen?: boolean } = {}): Promise<RawListing[]> {
- const key = process.env.GSA_API_KEY || "DEMO_KEY";
- const res = await fetch(GSA_URL, {
- headers: { "X-API-KEY": key, Accept: "application/json" },
- // fetch follows the 303 → S3 automatically.
- });
- if (!res.ok) {
- throw new Error(`GSA Auctions API ${res.status}: ${(await res.text()).slice(0, 200)}`);
- }
- const data = (await res.json()) as { Results?: GsaRow[] };
- const rows = (data.Results ?? []).map(mapRow).filter((x): x is RawListing => x !== null);
-
- const filtered = opts.onlyOpen
- ? rows.filter((r) => r.closingAt && new Date(r.closingAt).getTime() >= Date.now() - 86_400_000)
- : rows;
- return opts.limit ? filtered.slice(0, opts.limit) : filtered;
-}
diff --git a/govarbitrage/src/importers/ingest.ts b/govarbitrage/src/importers/ingest.ts
deleted file mode 100644
index df822df..0000000
--- a/govarbitrage/src/importers/ingest.ts
+++ /dev/null
@@ -1,159 +0,0 @@
-import { prisma } from "@/lib/db";
-import { runResearch } from "@/pipeline/research";
-import type { AuctionSource, Condition } from "@prisma/client";
-
-// Normalized import shape every importer (CSV, extension, URL scrape) produces.
-export interface RawListing {
- source: string;
- sourceAuctionId: string;
- sourceUrl?: string;
- title: string;
- description?: string;
- category?: string;
- manufacturer?: string;
- model?: string;
- condition?: string;
- quantity?: number;
- weightLbs?: number;
- dimensions?: string;
- locationCity?: string;
- locationState?: string;
- locationZip?: string;
- currentBid?: number;
- bidCount?: number;
- closingAt?: string | Date | null;
- imageUrls?: string[];
- auctionTerms?: string;
-}
-
-const SOURCE_MAP: Record<string, AuctionSource> = {
- GOVDEALS: "GOVDEALS",
- PUBLIC_SURPLUS: "PUBLIC_SURPLUS",
- PUBLICSURPLUS: "PUBLIC_SURPLUS",
- GSA_AUCTIONS: "GSA_AUCTIONS",
- GSA: "GSA_AUCTIONS",
- COUNTY: "COUNTY",
- STATE_SURPLUS: "STATE_SURPLUS",
- UNIVERSITY_SURPLUS: "UNIVERSITY_SURPLUS",
- MUNICIBID: "MUNICIBID",
- BID4ASSETS: "BID4ASSETS",
- GOINDUSTRY: "GOINDUSTRY",
- NETWORK_INTL: "NETWORK_INTL",
- GRAYS_AU: "GRAYS_AU",
- GOVPLANET: "GOVPLANET",
- CSV: "CSV",
- EXTENSION: "EXTENSION",
-};
-
-const CONDITION_MAP: Record<string, Condition> = {
- NEW: "NEW",
- LIKE_NEW: "LIKE_NEW",
- LIKENEW: "LIKE_NEW",
- USED_GOOD: "USED_GOOD",
- GOOD: "USED_GOOD",
- USED: "USED_GOOD",
- USED_FAIR: "USED_FAIR",
- FAIR: "USED_FAIR",
- FOR_PARTS: "FOR_PARTS",
- PARTS: "FOR_PARTS",
- SALVAGE: "FOR_PARTS",
- UNKNOWN: "UNKNOWN",
-};
-
-export function normalizeSource(s: string | undefined): AuctionSource {
- return SOURCE_MAP[(s || "").toUpperCase().replace(/[\s-]/g, "_")] ?? "OTHER";
-}
-
-export function normalizeCondition(c: string | undefined): Condition {
- return CONDITION_MAP[(c || "").toUpperCase().replace(/[\s-]/g, "_")] ?? "UNKNOWN";
-}
-
-export interface IngestResult {
- listingId: string;
- created: boolean;
- research?: Awaited<ReturnType<typeof runResearch>>;
-}
-
-/**
- * Ingest one normalized listing: upsert by (source, sourceAuctionId), then run
- * the research pipeline (local AI identification + engines). Idempotent.
- */
-export async function ingest(
- raw: RawListing,
- opts: { research?: boolean; useAI?: boolean } = {},
-): Promise<IngestResult> {
- if (!raw.title || !raw.sourceAuctionId) {
- throw new Error("Import requires at least title and sourceAuctionId");
- }
- const source = normalizeSource(raw.source);
- const closingAt = raw.closingAt ? new Date(raw.closingAt) : null;
-
- const existing = await prisma.listing.findUnique({
- where: { source_sourceAuctionId: { source, sourceAuctionId: raw.sourceAuctionId } },
- });
-
- const data = {
- source,
- sourceAuctionId: raw.sourceAuctionId,
- sourceUrl: raw.sourceUrl ?? null,
- title: raw.title,
- description: raw.description ?? null,
- category: raw.category ?? null,
- manufacturer: raw.manufacturer ?? null,
- model: raw.model ?? null,
- condition: normalizeCondition(raw.condition),
- quantity: raw.quantity && raw.quantity > 0 ? Math.floor(raw.quantity) : 1,
- weightLbs: raw.weightLbs ?? null,
- dimensions: raw.dimensions ?? null,
- locationCity: raw.locationCity ?? null,
- locationState: raw.locationState ?? null,
- locationZip: raw.locationZip ?? null,
- currentBid: raw.currentBid ?? 0,
- bidCount: raw.bidCount ?? 0,
- closingAt: closingAt && !isNaN(closingAt.getTime()) ? closingAt : null,
- imageUrls: raw.imageUrls ?? [],
- auctionTerms: raw.auctionTerms ?? null,
- // Seeing the item in an import = it's live on the source right now.
- // Refresh lastSeenAt and reactivate (an item that reappears is live again).
- lastSeenAt: new Date(),
- listingStatus: "ACTIVE" as const,
- endedAt: null,
- };
-
- const listing = existing
- ? await prisma.listing.update({ where: { id: existing.id }, data })
- : await prisma.listing.create({ data: { ...data, researchStatus: "PENDING" } });
-
- await prisma.listingEvent.create({
- data: {
- listingId: listing.id,
- type: existing ? "MANUAL_EDIT" : "IMPORTED",
- message: existing ? `Re-imported from ${source}` : `Imported from ${source}`,
- },
- });
-
- let research;
- if (opts.research !== false) {
- // Live single imports use the local AI identifier; bulk imports pass
- // useAI:false for speed (the worker AI-enriches later). Failures degrade
- // to the heuristic path inside runResearch either way.
- const useAI = opts.useAI !== false;
- research = await runResearch(listing.id, { useAI, writeIdentity: useAI });
- }
-
- return { listingId: listing.id, created: !existing, research };
-}
-
-/** Bulk ingest with per-row error capture. */
-export async function ingestMany(rows: RawListing[], opts: { research?: boolean; useAI?: boolean } = {}) {
- const results: { ok: boolean; listingId?: string; created?: boolean; error?: string; title: string }[] = [];
- for (const row of rows) {
- try {
- const r = await ingest(row, opts);
- results.push({ ok: true, listingId: r.listingId, created: r.created, title: row.title });
- } catch (e) {
- results.push({ ok: false, error: (e as Error).message, title: row.title || "(untitled)" });
- }
- }
- return results;
-}
diff --git a/govarbitrage/src/importers/municibid-free.ts b/govarbitrage/src/importers/municibid-free.ts
deleted file mode 100644
index 1e5dcc8..0000000
--- a/govarbitrage/src/importers/municibid-free.ts
+++ /dev/null
@@ -1,246 +0,0 @@
-import type { RawListing } from "./ingest";
-
-// FREE Municibid importer. $0, no browser at runtime.
-//
-// Municibid is a classic server-side-rendered ASP.NET site (jQuery + SignalR
-// for live bid pushes) — there is NO JSON search/listings API to replay. The
-// listing cards arrive inside the initial /browse HTML document, and plain
-// curl gets HTTP 200 (no Cloudflare wall). So the crack is straight HTML
-// parsing of the `.browse-item` cards, paginated via `?page=N`.
-//
-// Verified 2026-07-10 via openclaw real-Chrome capture:
-// - performance.getEntriesByType('resource') showed ZERO listings API —
-// only analytics (Google/Clarity/Customer.io), FontAwesome, wisepops, and
-// SignalR (/signalr/* on `listinghub` = live bid-price push, not data).
-// - The "gist.build" lead from an earlier pass was a red herring: it's the
-// Customer.io "Gist" support-chat widget, unrelated to auctions.
-//
-// Card shape (per `div.browse-item[data-listingid]`):
-// id -> data-listingid
-// title -> desktop <h2 class="text-card"><a>FULL TITLE</a>
-// url -> /Listing/Details/{id}/{slug}
-// bid -> <span class="awe-rt-CurrentPrice ...">$<span class="NumberPart">235.00</span>
-// bids -> <span class="awe-rt-AcceptedListingActionCount" ...>8</span>
-// close -> <span data-epoch="ending" data-action-time="MM/DD/YYYY HH:MM:SS">
-// image -> storagemunicibidpro.blob.core.windows.net/assets/media/{uuid}_thumbcrop.jpg
-// loc -> <p class="card-subtitle">City , ST | Seller Agency</p>
-
-const BASE = "https://municibid.com";
-const UA =
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " +
- "(KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36";
-
-const STATE_ABBR = new Set([
- "AL","AK","AZ","AR","CA","CO","CT","DE","FL","GA","HI","ID","IL","IN","IA","KS",
- "KY","LA","ME","MD","MA","MI","MN","MS","MO","MT","NE","NV","NH","NJ","NM","NY",
- "NC","ND","OH","OK","OR","PA","RI","SC","SD","TN","TX","UT","VT","VA","WA","WV",
- "WI","WY","DC","PR",
-]);
-
-function decode(s: string | undefined): string {
- if (!s) return "";
- return s
- .replace(/&/g, "&")
- .replace(/'/g, "'")
- .replace(/'/g, "'")
- .replace(/"/g, '"')
- .replace(/ /g, " ")
- .replace(/</g, "<")
- .replace(/>/g, ">")
- .replace(/\s+/g, " ")
- .trim();
-}
-
-function first(re: RegExp, s: string): string | undefined {
- const m = re.exec(s);
- return m ? m[1] : undefined;
-}
-
-// Parse "MM/DD/YYYY HH:MM:SS" (US Eastern, Municibid's server zone) to ISO.
-// We treat it as local wall-clock; exactness to the minute isn't required by
-// the research pipeline, and a naive Date parse of this format is stable.
-function parseCloseTime(raw: string | undefined): string | null {
- if (!raw) return null;
- const m = /(\d{1,2})\/(\d{1,2})\/(\d{4})\s+(\d{1,2}):(\d{2}):(\d{2})/.exec(raw);
- if (!m) return null;
- const [, mo, d, y, h, mi, s] = m;
- const dt = new Date(
- Number(y),
- Number(mo) - 1,
- Number(d),
- Number(h),
- Number(mi),
- Number(s),
- );
- return isNaN(dt.getTime()) ? null : dt.toISOString();
-}
-
-function parseCard(block: string): RawListing | null {
- const id = first(/data-listingid="(\d+)"/, block);
- if (!id) return null;
-
- // Full (untruncated) title from the desktop `.text-card` <h2><a>…</a>.
- // Fall back to the slug in the detail URL, or the truncated card-title.
- const detailRe = new RegExp(
- `/Listing/Details/${id}/([A-Za-z0-9%\\-_.]+)`,
- );
- const slug = first(detailRe, block);
- let title = first(
- /class="text-card"[^>]*>\s*<a[^>]*>([\s\S]*?)<\/a>/,
- block,
- );
- title = decode(title);
- if (!title && slug) {
- title = decode(decodeURIComponent(slug).replace(/[-_]+/g, " "));
- }
- if (!title) {
- title = decode(
- first(/class="card-title[^"]*"[^>]*>\s*<a[^>]*>([\s\S]*?)<\/a>/, block),
- ).replace(/\.\.\.$/, "");
- }
- if (!title) return null;
-
- const url = slug
- ? `${BASE}/Listing/Details/${id}/${slug}`
- : `${BASE}/Listing/Details/${id}`;
-
- // Current bid: $<span class="NumberPart">235.00</span>
- const priceStr = first(
- /awe-rt-CurrentPrice[^>]*>\s*\$?\s*<span class="NumberPart">([\d,]+(?:\.\d+)?)<\/span>/,
- block,
- );
- const currentBid = priceStr ? Number(priceStr.replace(/,/g, "")) : 0;
-
- // Bid count.
- const bidStr = first(
- /awe-rt-AcceptedListingActionCount[^>]*>\s*(\d+)\s*</,
- block,
- );
- const bidCount = bidStr ? Number(bidStr) : 0;
-
- // Absolute close time.
- const closingAt = parseCloseTime(
- first(/data-epoch="ending"[^>]*data-action-time="([^"]+)"/, block) ||
- first(/data-action-time="([^"]+)"[^>]*data-epoch="ending"/, block),
- );
-
- // Image (thumbcrop → strip to a larger asset when possible).
- let img = first(
- /(https:\/\/storagemunicibidpro\.blob\.core\.windows\.net\/assets\/media\/[A-Za-z0-9-]+_thumbcrop\.jpg)/,
- block,
- );
- const imageUrls = img ? [img] : [];
-
- // Location + seller from card-subtitle: "City , ST | Seller Agency".
- const subtitle = decode(
- first(/class="card-subtitle[^"]*"[^>]*>([\s\S]*?)<\/p>/, block),
- );
- let locationCity: string | undefined;
- let locationState: string | undefined;
- let seller: string | undefined;
- if (subtitle) {
- const [locPart, ...rest] = subtitle.split("|");
- seller = rest.join("|").trim() || undefined;
- const lm = /^(.*?)[,\s]+([A-Z]{2})\s*$/.exec(locPart.trim());
- if (lm && STATE_ABBR.has(lm[2])) {
- locationCity = lm[1].replace(/,\s*$/, "").trim() || undefined;
- locationState = lm[2];
- } else {
- locationCity = locPart.trim() || undefined;
- }
- }
-
- const descParts = [
- seller ? `Seller: ${seller}` : "",
- locationCity || locationState
- ? `Location: ${[locationCity, locationState].filter(Boolean).join(", ")}`
- : "",
- ].filter(Boolean);
-
- return {
- source: "MUNICIBID",
- sourceAuctionId: id,
- sourceUrl: url,
- title,
- description: descParts.join(" · ") || undefined,
- // NB: `seller` is the government agency, NOT the product maker — keep it in
- // description only. Leaving `manufacturer` unset lets the research pipeline
- // extract the real brand from the title.
- locationCity,
- locationState,
- currentBid,
- bidCount,
- closingAt,
- imageUrls,
- };
-}
-
-async function fetchPage(page: number): Promise<string> {
- const url = page <= 1 ? `${BASE}/browse` : `${BASE}/browse?page=${page}`;
- const res = await fetch(url, {
- headers: {
- "User-Agent": UA,
- Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
- "Accept-Language": "en-US,en;q=0.9",
- },
- });
- if (!res.ok) throw new Error(`Municibid /browse page ${page} -> HTTP ${res.status}`);
- return res.text();
-}
-
-function parsePage(html: string): RawListing[] {
- // Split into per-card blocks on the data-listingid boundary. Each card's
- // markup (mobile + desktop) lives between one data-listingid and the next.
- const parts = html.split(/(?=<div class="row browse-item)/);
- const out: RawListing[] = [];
- for (const part of parts) {
- if (!/data-listingid="\d+"/.test(part)) continue;
- const card = parseCard(part);
- if (card) out.push(card);
- }
- return out;
-}
-
-export interface FetchMunicibidOpts {
- limit?: number;
- maxPages?: number;
-}
-
-/**
- * Fetch up to `limit` active Municibid listings by paginating /browse?page=N.
- * Dedupes by listing id. $0 — plain HTTPS, no browser, no API key.
- */
-export async function fetchMunicibidFree(
- opts: FetchMunicibidOpts = {},
-): Promise<RawListing[]> {
- const limit = opts.limit ?? 100;
- const maxPages = opts.maxPages ?? 40;
- const seen = new Set<string>();
- const rows: RawListing[] = [];
-
- for (let page = 1; page <= maxPages && rows.length < limit; page++) {
- let html: string;
- try {
- html = await fetchPage(page);
- } catch (e) {
- console.warn(`[municibid-free] page ${page} fetch failed: ${(e as Error).message}`);
- break;
- }
- const cards = parsePage(html);
- if (cards.length === 0) break; // ran past the last page
- let added = 0;
- for (const c of cards) {
- if (seen.has(c.sourceAuctionId)) continue;
- seen.add(c.sourceAuctionId);
- rows.push(c);
- added++;
- if (rows.length >= limit) break;
- }
- // If a full page yielded no NEW ids, we've looped back to the start.
- if (added === 0) break;
- // Be polite: small jitter between page fetches.
- await new Promise((r) => setTimeout(r, 350 + Math.floor(page % 3) * 120));
- }
-
- return rows.slice(0, limit);
-}
diff --git a/govarbitrage/src/importers/publicsurplus-free.ts b/govarbitrage/src/importers/publicsurplus-free.ts
deleted file mode 100644
index 8c03d1a..0000000
--- a/govarbitrage/src/importers/publicsurplus-free.ts
+++ /dev/null
@@ -1,211 +0,0 @@
-import type { RawListing } from "./ingest";
-
-// FREE Public Surplus importer. $0, no browser at runtime.
-//
-// Public Surplus is server-rendered (Java/Spring `/sms/…` app). The category
-// listing pages return fully-rendered auction cards to plain curl (HTTP 200,
-// no bot wall), so the crack is HTML parsing of the `.auction-item` cards.
-//
-// Verified 2026-07-10:
-// list -> GET /sms/browse/cataucs?catid={C}&page={P} (25 cards/page, 0-idx)
-// item -> /sms/auction/view?auc={id}
-// card (per `div.auction-item[id="{id}catGrid"]`):
-// id -> id="{id}catGrid"
-// title -> <a href="/sms/auction/view?auc={id}" title="#{id} - {TITLE}">
-// state -> <span class="auction-item-state"> CA </span>
-// price -> <b id="val_{id}catGrid"> $35.00 </b>
-// time -> <span id="timeLeftValue{id}catGrid" ...> 4 mins </span> (RELATIVE)
-// image -> https://d37qv0n5b4mbzm.cloudfront.net/.../thumb-b/{id}/{doc}
-//
-// Close time is relative ("4 mins" / "2 days" / "1 hour"), not absolute, so we
-// compute closingAt = now + parsed delta. Categories enumerated from the home
-// page (catid 1..29). No API key, no browser.
-
-const BASE = "https://www.publicsurplus.com";
-const UA =
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " +
- "(KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36";
-
-// Category ids present on the browse home (2026-07-10). Enumerated rather than
-// hardcoded 1..N because 7 is absent; kept as a static list for stability.
-const CATEGORY_IDS = [
- 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 27, 28, 29,
-];
-
-function decode(s: string | undefined): string {
- if (!s) return "";
- return s
- .replace(/&/g, "&")
- .replace(/'/g, "'")
- .replace(/'/g, "'")
- .replace(/"/g, '"')
- .replace(/ /g, " ")
- .replace(/</g, "<")
- .replace(/>/g, ">")
- .replace(/\s+/g, " ")
- .trim();
-}
-
-function first(re: RegExp, s: string): string | undefined {
- const m = re.exec(s);
- return m ? m[1] : undefined;
-}
-
-// Parse relative "Time Left" like "4 mins", "2 days", "1 hour", "3 hrs",
-// "5 days, 2 hours" -> ISO close time (now + delta). Returns null if unparseable
-// or already ended.
-function parseRelativeClose(raw: string | undefined): string | null {
- if (!raw) return null;
- const txt = raw.toLowerCase();
- if (/ended|closed|over/.test(txt)) return null;
- const units: [RegExp, number][] = [
- [/(\d+)\s*day/, 86400_000],
- [/(\d+)\s*h(?:ou)?r/, 3600_000],
- [/(\d+)\s*min/, 60_000],
- [/(\d+)\s*sec/, 1000],
- ];
- let deltaMs = 0;
- let matched = false;
- for (const [re, ms] of units) {
- const m = re.exec(txt);
- if (m) {
- deltaMs += Number(m[1]) * ms;
- matched = true;
- }
- }
- if (!matched) return null;
- return new Date(Date.now() + deltaMs).toISOString();
-}
-
-function parseCard(block: string, id: string): RawListing | null {
- // Title: prefer the <a title="#id - TITLE"> attribute (full), strip the
- // leading "#id - " prefix.
- let title = decode(
- first(
- new RegExp(`/sms/auction/view\\?auc=${id}"[^>]*title="([^"]+)"`),
- block,
- ),
- );
- title = title.replace(new RegExp(`^#?${id}\\s*[-–]\\s*`), "").trim();
- if (!title) {
- // fallback: visible anchor text
- title = decode(
- first(
- new RegExp(`/sms/auction/view\\?auc=${id}"[^>]*>([\\s\\S]*?)</a>`),
- block,
- ),
- ).replace(new RegExp(`^#?${id}\\s*[-–]\\s*`), "");
- }
- if (!title || title === "...") return null;
-
- const priceStr = first(
- new RegExp(`id="val_${id}catGrid"[^>]*>\\s*\\$?([\\d,]+(?:\\.\\d+)?)`),
- block,
- );
- const currentBid = priceStr ? Number(priceStr.replace(/,/g, "")) : 0;
-
- const timeRaw = decode(
- first(
- new RegExp(`id="timeLeftValue${id}catGrid"[^>]*>([\\s\\S]*?)</span>`),
- block,
- ),
- );
- const closingAt = parseRelativeClose(timeRaw);
-
- const state = decode(
- first(/class="auction-item-state"[^>]*>([\s\S]*?)<\/span>/, block),
- );
-
- const img = first(
- /(https:\/\/[a-z0-9]+\.cloudfront\.net\/sms\/docviewer\/[^\s"']+)/,
- block,
- );
-
- return {
- source: "PUBLIC_SURPLUS",
- sourceAuctionId: id,
- sourceUrl: `${BASE}/sms/auction/view?auc=${id}`,
- title,
- locationState: state && /^[A-Z]{2}$/.test(state) ? state : undefined,
- currentBid,
- bidCount: 0, // not shown on the list card; enriched later if needed
- closingAt,
- imageUrls: img ? [img] : [],
- };
-}
-
-function parsePage(html: string): RawListing[] {
- const out: RawListing[] = [];
- // Each card is `<div class="auction-item" id="{id}catGrid">`. Split on that
- // boundary and parse each block against its own id.
- const re = /id="(\d+)catGrid"/g;
- const ids: { id: string; idx: number }[] = [];
- let m: RegExpExecArray | null;
- while ((m = re.exec(html))) ids.push({ id: m[1], idx: m.index });
- for (let i = 0; i < ids.length; i++) {
- const start = ids[i].idx;
- const end = i + 1 < ids.length ? ids[i + 1].idx : Math.min(html.length, start + 4000);
- const block = html.slice(start, end);
- const card = parseCard(block, ids[i].id);
- if (card) out.push(card);
- }
- return out;
-}
-
-async function fetchList(catid: number, page: number): Promise<string> {
- const url = `${BASE}/sms/browse/cataucs?catid=${catid}&page=${page}`;
- const res = await fetch(url, {
- headers: {
- "User-Agent": UA,
- Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
- "Accept-Language": "en-US,en;q=0.9",
- },
- });
- if (!res.ok) throw new Error(`PublicSurplus cataucs c=${catid} p=${page} -> HTTP ${res.status}`);
- return res.text();
-}
-
-export interface FetchPublicSurplusOpts {
- limit?: number;
- pagesPerCategory?: number;
-}
-
-/**
- * Fetch up to `limit` active Public Surplus listings by walking categories and
- * paginating each. Dedupes by auction id. $0 — plain HTTPS, no browser/API key.
- */
-export async function fetchPublicSurplusFree(
- opts: FetchPublicSurplusOpts = {},
-): Promise<RawListing[]> {
- const limit = opts.limit ?? 100;
- const pagesPerCategory = opts.pagesPerCategory ?? 4;
- const seen = new Set<string>();
- const rows: RawListing[] = [];
-
- outer: for (const catid of CATEGORY_IDS) {
- for (let page = 0; page < pagesPerCategory; page++) {
- let html: string;
- try {
- html = await fetchList(catid, page);
- } catch (e) {
- console.warn(`[publicsurplus-free] ${(e as Error).message}`);
- break; // next category
- }
- const cards = parsePage(html);
- if (cards.length === 0) break; // past the last page of this category
- let added = 0;
- for (const c of cards) {
- if (seen.has(c.sourceAuctionId)) continue;
- seen.add(c.sourceAuctionId);
- rows.push(c);
- added++;
- if (rows.length >= limit) break outer;
- }
- if (added === 0) break; // looped back — next category
- await new Promise((r) => setTimeout(r, 300 + (page % 3) * 120));
- }
- }
-
- return rows.slice(0, limit);
-}
diff --git a/govarbitrage/src/importers/scrape.ts b/govarbitrage/src/importers/scrape.ts
deleted file mode 100644
index cf79eca..0000000
--- a/govarbitrage/src/importers/scrape.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import type { RawListing } from "./ingest";
-
-// Best-effort single-URL importer. Uses Playwright (a devDependency) to render
-// the page, then extracts fields with host-specific selectors and generic
-// fallbacks (og: tags, $-regex). Live auction-site DOMs change often, so this is
-// intentionally defensive: whatever it can't find is left undefined and the
-// research pipeline's AI identifier fills gaps from the title/description.
-
-function sourceFromHost(host: string): string {
- if (host.includes("govdeals")) return "GOVDEALS";
- if (host.includes("publicsurplus")) return "PUBLIC_SURPLUS";
- if (host.includes("gsaauctions")) return "GSA_AUCTIONS";
- if (host.includes("municibid")) return "MUNICIBID";
- if (host.includes("bid4assets")) return "BID4ASSETS";
- return "OTHER";
-}
-
-function auctionIdFromUrl(u: URL): string {
- const q =
- u.searchParams.get("itemid") ||
- u.searchParams.get("auc") ||
- u.searchParams.get("id") ||
- u.searchParams.get("ac");
- if (q) return q;
- const segs = u.pathname.split("/").filter(Boolean);
- return segs[segs.length - 1] || u.pathname;
-}
-
-export async function scrapeUrl(url: string): Promise<RawListing> {
- const u = new URL(url);
- const source = sourceFromHost(u.hostname);
-
- // Dynamic import so the main app bundle never hard-depends on Playwright.
- let chromium: typeof import("playwright").chromium;
- try {
- ({ chromium } = await import("playwright"));
- } catch {
- throw new Error(
- "Playwright is not installed. Run `npx playwright install chromium` to enable URL import.",
- );
- }
-
- const browser = await chromium.launch({ headless: true });
- try {
- const page = await browser.newPage({ userAgent: "Mozilla/5.0 GovArbitrageBot/0.1" });
- await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30_000 });
-
- const extracted = await page.evaluate(() => {
- const meta = (p: string) =>
- (document.querySelector(`meta[property="${p}"]`) as HTMLMetaElement | null)?.content ||
- (document.querySelector(`meta[name="${p}"]`) as HTMLMetaElement | null)?.content ||
- undefined;
- const text = document.body?.innerText || "";
- const priceMatch = text.match(/\$\s?([\d,]+(?:\.\d{2})?)/);
- const images = Array.from(document.querySelectorAll("img"))
- .map((i) => (i as HTMLImageElement).src)
- .filter((s) => s && s.startsWith("http"))
- .slice(0, 6);
- const ogImage = meta("og:image");
- return {
- title: meta("og:title") || document.querySelector("h1")?.textContent?.trim() || document.title,
- description: meta("og:description") || undefined,
- currentBid: priceMatch ? Number(priceMatch[1].replace(/,/g, "")) : undefined,
- imageUrls: ogImage ? [ogImage, ...images] : images,
- };
- });
-
- return {
- source,
- sourceAuctionId: auctionIdFromUrl(u),
- sourceUrl: url,
- title: extracted.title || `${source} lot ${auctionIdFromUrl(u)}`,
- description: extracted.description,
- currentBid: extracted.currentBid,
- imageUrls: extracted.imageUrls,
- };
- } finally {
- await browser.close();
- }
-}
diff --git a/govarbitrage/src/lib/ai.ts b/govarbitrage/src/lib/ai.ts
deleted file mode 100644
index 725384a..0000000
--- a/govarbitrage/src/lib/ai.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-// Local-first AI layer. Product identification runs on Ollama (this machine,
-// $0/query). Anthropic is an opt-in fallback only, enabled by setting
-// AI_PROVIDER=anthropic and ANTHROPIC_API_KEY. If no model is reachable, callers
-// fall back to the deterministic heuristic in engines/demand.ts.
-
-const OLLAMA_BASE = process.env.OLLAMA_BASE_URL || "http://localhost:11434";
-const TEXT_MODEL = process.env.OLLAMA_TEXT_MODEL || "qwen3:14b";
-const VISION_MODEL = process.env.OLLAMA_VISION_MODEL || "qwen2.5vl:7b";
-
-export interface AiIdentification {
- manufacturer?: string;
- model?: string;
- category?: string;
- estimatedNewRetail?: number;
- demandScore?: number; // 0..100
- confidence?: number; // 0..1
- reasoning?: string;
-}
-
-const SYSTEM = `You are a resale-arbitrage product analyst. Given a government-surplus
-auction listing, identify the product and estimate its market. Respond ONLY with
-compact JSON matching:
-{"manufacturer":string,"model":string,"category":string,"estimatedNewRetail":number,"demandScore":number,"confidence":number,"reasoning":string}
-demandScore is 0-100 (secondary-market liquidity). confidence is 0-1. Use USD.`;
-
-async function ollamaJson(prompt: string, model = TEXT_MODEL, images?: string[]): Promise<AiIdentification | null> {
- try {
- const controller = new AbortController();
- const timeout = setTimeout(() => controller.abort(), 45_000);
- const res = await fetch(`${OLLAMA_BASE}/api/generate`, {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- signal: controller.signal,
- body: JSON.stringify({
- model,
- prompt: `${SYSTEM}\n\nLISTING:\n${prompt}`,
- stream: false,
- format: "json",
- options: { temperature: 0.1 },
- ...(images && images.length ? { images } : {}),
- }),
- });
- clearTimeout(timeout);
- if (!res.ok) return null;
- const data = (await res.json()) as { response?: string };
- if (!data.response) return null;
- return JSON.parse(data.response) as AiIdentification;
- } catch {
- return null;
- }
-}
-
-/** Identify a product from listing text (and optionally base64 images). */
-export async function identifyProduct(args: {
- title: string;
- description?: string | null;
- category?: string | null;
- imagesBase64?: string[];
-}): Promise<{ result: AiIdentification | null; model: string }> {
- const provider = process.env.AI_PROVIDER || "ollama";
- const text = [
- `Title: ${args.title}`,
- args.category ? `Category: ${args.category}` : "",
- args.description ? `Description: ${args.description}` : "",
- ]
- .filter(Boolean)
- .join("\n");
-
- // Vision path when images are supplied and a vision model is configured.
- if (args.imagesBase64 && args.imagesBase64.length) {
- const v = await ollamaJson(text, VISION_MODEL, args.imagesBase64);
- if (v) return { result: v, model: `ollama:${VISION_MODEL}` };
- }
-
- const t = await ollamaJson(text, TEXT_MODEL);
- if (t) return { result: t, model: `ollama:${TEXT_MODEL}` };
-
- // Opt-in cloud fallback.
- if (provider === "anthropic" && process.env.ANTHROPIC_API_KEY) {
- const a = await anthropicJson(text);
- if (a) return { result: a, model: "anthropic:claude" };
- }
-
- return { result: null, model: "heuristic" };
-}
-
-async function anthropicJson(text: string): Promise<AiIdentification | null> {
- try {
- const res = await fetch("https://api.anthropic.com/v1/messages", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "x-api-key": process.env.ANTHROPIC_API_KEY as string,
- "anthropic-version": "2023-06-01",
- },
- body: JSON.stringify({
- model: "claude-haiku-4-5-20251001",
- max_tokens: 512,
- system: SYSTEM,
- messages: [{ role: "user", content: `LISTING:\n${text}` }],
- }),
- });
- if (!res.ok) return null;
- const data = (await res.json()) as { content?: { text?: string }[] };
- const raw = data.content?.[0]?.text;
- if (!raw) return null;
- const match = raw.match(/\{[\s\S]*\}/);
- return match ? (JSON.parse(match[0]) as AiIdentification) : null;
- } catch {
- return null;
- }
-}
-
-/** Is a local model reachable? Used by health checks + the worker banner. */
-export async function ollamaReachable(): Promise<boolean> {
- try {
- const res = await fetch(`${OLLAMA_BASE}/api/tags`, { signal: AbortSignal.timeout(3000) });
- return res.ok;
- } catch {
- return false;
- }
-}
diff --git a/govarbitrage/src/lib/auth.test.ts b/govarbitrage/src/lib/auth.test.ts
deleted file mode 100644
index cf22604..0000000
--- a/govarbitrage/src/lib/auth.test.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { describe, expect, it, beforeAll } from "vitest";
-import { hashPassword, verifyPassword } from "./password";
-import { createSession, verifySession } from "./session";
-
-beforeAll(() => {
- process.env.AUTH_SECRET = "test-secret-please-change";
-});
-
-describe("password hashing (scrypt)", () => {
- it("verifies a correct password and rejects a wrong one", () => {
- const hash = hashPassword("s3cret-pw");
- expect(hash.startsWith("scrypt$")).toBe(true);
- expect(verifyPassword("s3cret-pw", hash)).toBe(true);
- expect(verifyPassword("wrong", hash)).toBe(false);
- });
-
- it("salts so identical passwords hash differently", () => {
- expect(hashPassword("same")).not.toBe(hashPassword("same"));
- });
-
- it("rejects malformed stored hashes", () => {
- expect(verifyPassword("x", "$demo$changeme")).toBe(false);
- expect(verifyPassword("x", "garbage")).toBe(false);
- });
-});
-
-describe("session JWT", () => {
- it("round-trips a session payload", async () => {
- const token = await createSession({ sub: "u1", email: "a@b.com", role: "ADMIN" });
- const payload = await verifySession(token);
- expect(payload?.sub).toBe("u1");
- expect(payload?.email).toBe("a@b.com");
- expect(payload?.role).toBe("ADMIN");
- });
-
- it("rejects a tampered/garbage token", async () => {
- expect(await verifySession("not.a.jwt")).toBeNull();
- const token = await createSession({ sub: "u1", email: "a@b.com", role: "ADMIN" });
- expect(await verifySession(token + "x")).toBeNull();
- });
-});
diff --git a/govarbitrage/src/lib/auth.ts b/govarbitrage/src/lib/auth.ts
deleted file mode 100644
index c9b639e..0000000
--- a/govarbitrage/src/lib/auth.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { SESSION_COOKIE, verifySession } from "@/lib/session";
-
-export type Role = "ADMIN" | "ANALYST" | "VIEWER";
-const RANK: Record<Role, number> = { VIEWER: 0, ANALYST: 1, ADMIN: 2 };
-
-/** Resolve the caller's role from the session cookie, or null if unauthenticated. */
-async function sessionRole(req: NextRequest): Promise<Role | null> {
- const token = req.cookies.get(SESSION_COOKIE)?.value;
- const s = token ? await verifySession(token) : null;
- if (!s) return null;
- return ((s.role as Role) ?? "VIEWER");
-}
-
-function deny(role: Role | null): NextResponse {
- // Distinguish unauthenticated (401) from authenticated-but-insufficient (403).
- const status = role ? 403 : 401;
- return NextResponse.json({ error: status === 403 ? "Forbidden" : "Unauthorized" }, { status });
-}
-
-/**
- * Write-guard for import + operational endpoints (defense-in-depth behind the
- * middleware). Allows the request when EITHER:
- * • a logged-in user whose role meets `minRole` (default ANALYST — a VIEWER
- * session, including one minted from the fleet SSO cookie, CANNOT write), OR
- * • the machine `x-import-token` header matches IMPORT_TOKEN (extension / CSV).
- * Returns a 401/403 NextResponse when denied, or null when allowed.
- */
-export async function requireWrite(req: NextRequest, minRole: Role = "ANALYST"): Promise<NextResponse | null> {
- const role = await sessionRole(req);
- if (role && RANK[role] >= RANK[minRole]) return null;
-
- const importToken = process.env.IMPORT_TOKEN;
- if (importToken && req.headers.get("x-import-token") === importToken) return null;
-
- return deny(role);
-}
-
-/**
- * Admin-only guard for tier-0 surfaces (stored provider credentials/secrets).
- * NO machine-token bypass and NO fleet-SSO VIEWER access — a full ADMIN session
- * is required, which on this app means the local username/password login.
- */
-export async function requireAdmin(req: NextRequest): Promise<NextResponse | null> {
- const role = await sessionRole(req);
- if (role === "ADMIN") return null;
- return deny(role);
-}
diff --git a/govarbitrage/src/lib/billing.ts b/govarbitrage/src/lib/billing.ts
deleted file mode 100644
index 063dff4..0000000
--- a/govarbitrage/src/lib/billing.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-// Stripe billing for the paid-alerts SaaS — TEST/MOCK ONLY.
-// HARD RAIL: a live secret key (sk_live_) is REFUSED — going live is Steve
-// flipping the switch himself, never us. With no key we run in MOCK mode: no
-// real Stripe call, but the upgrade flow still completes so it's demoable.
-import Stripe from "stripe";
-import type { Tier } from "@prisma/client";
-import { TIERS } from "@/lib/tiers";
-
-const KEY = process.env.STRIPE_TEST_SECRET_KEY || "";
-export const LIVE_KEY_REFUSED = KEY.startsWith("sk_live_");
-export const STRIPE_MODE: "test" | "mock" =
- KEY.startsWith("sk_test_") && !LIVE_KEY_REFUSED ? "test" : "mock";
-
-let _stripe: Stripe | null = null;
-function stripe(): Stripe | null {
- if (STRIPE_MODE !== "test") return null;
- if (!_stripe) _stripe = new Stripe(KEY);
- return _stripe;
-}
-
-export interface CheckoutResult {
- ok: boolean;
- mode: "test" | "mock";
- url: string;
- error?: string;
-}
-
-/**
- * Create a (TEST) subscription Checkout session for a tier. In mock mode returns
- * a local success URL that simulates the upgrade so the flow is demoable.
- */
-export async function createCheckout(opts: {
- userId: string;
- email: string;
- tier: Tier;
- baseUrl: string;
-}): Promise<CheckoutResult> {
- const def = TIERS[opts.tier];
- if (!def || def.priceUsd <= 0) {
- return { ok: false, mode: STRIPE_MODE, url: "", error: "not a paid tier" };
- }
- if (LIVE_KEY_REFUSED) {
- return { ok: false, mode: "mock", url: "", error: "live key refused — TEST only" };
- }
-
- // MOCK: no Stripe call; simulate the successful upgrade locally.
- if (STRIPE_MODE === "mock") {
- const url = `${opts.baseUrl}/billing/success?tier=${opts.tier}&mock=1&session=mock_${opts.userId.slice(0, 8)}`;
- return { ok: true, mode: "mock", url };
- }
-
- // TEST: real Stripe test-mode subscription checkout with inline recurring price.
- const s = stripe()!;
- const session = await s.checkout.sessions.create({
- mode: "subscription",
- customer_email: opts.email,
- client_reference_id: opts.userId,
- metadata: { userId: opts.userId, tier: opts.tier },
- line_items: [
- {
- quantity: 1,
- price_data: {
- currency: "usd",
- recurring: { interval: "month" },
- unit_amount: Math.round(def.priceUsd * 100),
- product_data: { name: `GovArbitrage ${def.label} — hot-deal alerts` },
- },
- },
- ],
- success_url: `${opts.baseUrl}/billing/success?tier=${opts.tier}&session={CHECKOUT_SESSION_ID}`,
- cancel_url: `${opts.baseUrl}/pricing?canceled=1`,
- });
- return { ok: true, mode: "test", url: session.url || "" };
-}
-
-/** Verify a Stripe webhook (TEST). Returns the event or null if unverifiable. */
-export function verifyWebhook(rawBody: string, sig: string | null): Stripe.Event | null {
- const s = stripe();
- const secret = process.env.STRIPE_WEBHOOK_SECRET || "";
- if (!s || !sig || !secret) return null;
- try {
- return s.webhooks.constructEvent(rawBody, sig, secret);
- } catch {
- return null;
- }
-}
diff --git a/govarbitrage/src/lib/crypto.test.ts b/govarbitrage/src/lib/crypto.test.ts
deleted file mode 100644
index e32e8a7..0000000
--- a/govarbitrage/src/lib/crypto.test.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { describe, expect, it, beforeAll } from "vitest";
-import { encryptSecret, decryptSecret } from "./crypto";
-
-beforeAll(() => {
- process.env.ENCRYPTION_KEY = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
-});
-
-describe("crypto (AES-256-GCM secret storage)", () => {
- it("round-trips a secret", () => {
- const enc = encryptSecret("sk-super-secret-token");
- expect(enc.ciphertext).not.toContain("super-secret");
- expect(decryptSecret(enc)).toBe("sk-super-secret-token");
- });
-
- it("produces a fresh IV each time (non-deterministic ciphertext)", () => {
- const a = encryptSecret("same");
- const b = encryptSecret("same");
- expect(a.iv).not.toBe(b.iv);
- expect(a.ciphertext).not.toBe(b.ciphertext);
- });
-
- it("rejects a tampered auth tag", () => {
- const enc = encryptSecret("payload");
- expect(() => decryptSecret({ ...enc, authTag: Buffer.from("00".repeat(16), "hex").toString("base64") })).toThrow();
- });
-});
diff --git a/govarbitrage/src/lib/crypto.ts b/govarbitrage/src/lib/crypto.ts
deleted file mode 100644
index 571ad21..0000000
--- a/govarbitrage/src/lib/crypto.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import crypto from "node:crypto";
-
-// AES-256-GCM encryption for secrets at rest (e.g. provider API keys stored in
-// ApiCredential). ENCRYPTION_KEY must be 32 bytes as 64 hex chars.
-
-export interface Encrypted {
- ciphertext: string; // base64
- iv: string; // base64
- authTag: string; // base64
-}
-
-function key(): Buffer {
- const hex = process.env.ENCRYPTION_KEY || "";
- const buf = Buffer.from(hex, "hex");
- if (buf.length !== 32) {
- throw new Error("ENCRYPTION_KEY must be 32 bytes (64 hex chars) for AES-256-GCM");
- }
- return buf;
-}
-
-export function encryptSecret(plaintext: string): Encrypted {
- const iv = crypto.randomBytes(12);
- const cipher = crypto.createCipheriv("aes-256-gcm", key(), iv);
- const ct = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
- return {
- ciphertext: ct.toString("base64"),
- iv: iv.toString("base64"),
- authTag: cipher.getAuthTag().toString("base64"),
- };
-}
-
-export function decryptSecret(enc: Encrypted): string {
- const decipher = crypto.createDecipheriv("aes-256-gcm", key(), Buffer.from(enc.iv, "base64"));
- decipher.setAuthTag(Buffer.from(enc.authTag, "base64"));
- const pt = Buffer.concat([
- decipher.update(Buffer.from(enc.ciphertext, "base64")),
- decipher.final(),
- ]);
- return pt.toString("utf8");
-}
diff --git a/govarbitrage/src/lib/current-user.ts b/govarbitrage/src/lib/current-user.ts
deleted file mode 100644
index 6d38562..0000000
--- a/govarbitrage/src/lib/current-user.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { cookies } from "next/headers";
-import { SESSION_COOKIE, verifySession, type SessionPayload } from "./session";
-import { tierDef } from "./tiers";
-
-/** Read + verify the session for the current request (server components / routes). */
-export async function getCurrentUser(): Promise<SessionPayload | null> {
- const store = await cookies();
- const token = store.get(SESSION_COOKIE)?.value;
- if (!token) return null;
- return verifySession(token);
-}
-
-export type Role = "ADMIN" | "ANALYST" | "VIEWER";
-const RANK: Record<Role, number> = { VIEWER: 0, ANALYST: 1, ADMIN: 2 };
-
-/** True if the user's role meets or exceeds the required role. */
-export function hasRole(user: SessionPayload | null, required: Role): boolean {
- if (!user) return false;
- return (RANK[(user.role as Role) ?? "VIEWER"] ?? 0) >= RANK[required];
-}
-
-/**
- * Resolve the current request's subscription tier from the DB (not the JWT — a
- * subscription can change mid-session). Unauthenticated → FREE. ADMIN → PREMIUM
- * (Steve always sees everything). Imported lazily to keep this edge-safe module light.
- */
-export async function getCurrentTier(): Promise<import("@prisma/client").Tier> {
- const user = await getCurrentUser();
- if (!user) return "FREE";
- if (user.role === "ADMIN") return "PREMIUM";
- // The synthetic fleet-SSO session is Steve arriving via the fleet login — an
- // internal operator, so show full data (money-math). It is still only ANALYST,
- // so the ADMIN-gated credential surface stays closed.
- if (user.sub === "fleet-sso") return "PREMIUM";
- const { prisma } = await import("./db");
- const row = await prisma.user.findUnique({ where: { id: user.sub }, select: { tier: true } });
- return row?.tier ?? "FREE";
-}
-
-/**
- * Whether the money-math (recommended max bid / ROI / valuations / opportunity
- * scores) is visible for this request. Visibility is a function of the resolved
- * subscription tier ONLY — every client (iOS app, browser, curl) sees identical
- * data for a given tier. The FREE tier includes the full analysis, so a fresh
- * install with no account and no purchase gets the same JSON a signed-in user or
- * an anonymous browser gets. Nothing keys off the client, a header, or any other
- * undisclosed signal.
- */
-export async function moneyMathVisible(
- tier: import("@prisma/client").Tier
-): Promise<boolean> {
- return tierDef(tier).limits.showMoneyMath;
-}
diff --git a/govarbitrage/src/lib/dashboard.ts b/govarbitrage/src/lib/dashboard.ts
deleted file mode 100644
index 1e90cab..0000000
--- a/govarbitrage/src/lib/dashboard.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { prisma } from "@/lib/db";
-
-export interface DashboardStats {
- activeAuctions: number;
- closingToday: number;
- highestProfit: number;
- highestRoi: number;
- cashRequired: number; // sum of recommended max bids across active opportunities
- expectedProfit: number; // sum of expected net profit
- highestScore: number;
- pendingResearch: number;
-}
-
-/** Aggregate the summary-card metrics in a single pass. */
-export async function getDashboardStats(): Promise<DashboardStats> {
- const now = new Date();
- const endOfDay = new Date(now);
- endOfDay.setHours(23, 59, 59, 999);
-
- const [activeAuctions, closingToday, pendingResearch, costAgg, topScore] = await Promise.all([
- prisma.listing.count({ where: { listingStatus: "ACTIVE", closingAt: { gte: now } } }),
- prisma.listing.count({ where: { listingStatus: "ACTIVE", closingAt: { gte: now, lte: endOfDay } } }),
- prisma.listing.count({ where: { researchStatus: { in: ["PENDING", "QUEUED", "IN_PROGRESS"] } } }),
- prisma.costBreakdown.aggregate({
- _sum: { expectedNetProfit: true, recommendedMaxBid: true },
- _max: { expectedNetProfit: true, roi: true },
- }),
- prisma.score.aggregate({ where: { profile: "OVERALL_OPPORTUNITY" }, _max: { value: true } }),
- ]);
-
- return {
- activeAuctions,
- closingToday,
- highestProfit: Number(costAgg._max.expectedNetProfit ?? 0),
- highestRoi: Number(costAgg._max.roi ?? 0),
- cashRequired: Number(costAgg._sum.recommendedMaxBid ?? 0),
- expectedProfit: Number(costAgg._sum.expectedNetProfit ?? 0),
- highestScore: Number(topScore._max.value ?? 0),
- pendingResearch,
- };
-}
diff --git a/govarbitrage/src/lib/db.ts b/govarbitrage/src/lib/db.ts
deleted file mode 100644
index 84941e8..0000000
--- a/govarbitrage/src/lib/db.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { PrismaClient } from "@prisma/client";
-
-// Reuse a single PrismaClient across hot-reloads in dev to avoid exhausting
-// Postgres connections (Next.js re-evaluates modules on every change).
-const globalForPrisma = globalThis as unknown as { prisma?: PrismaClient };
-
-export const prisma =
- globalForPrisma.prisma ??
- new PrismaClient({
- log: process.env.NODE_ENV === "development" ? ["warn", "error"] : ["error"],
- });
-
-if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
diff --git a/govarbitrage/src/lib/digest-snapshot.ts b/govarbitrage/src/lib/digest-snapshot.ts
deleted file mode 100644
index 1588270..0000000
--- a/govarbitrage/src/lib/digest-snapshot.ts
+++ /dev/null
@@ -1,134 +0,0 @@
-import { prisma } from "@/lib/db";
-import { findHotDeals, type HotDeal, type Confidence } from "@/lib/hot-deals";
-import type { DigestSlot, Prisma } from "@prisma/client";
-
-// Freezes each digest run into a DigestSnapshot so the public /deals archive
-// renders a stable, indexable record instead of re-querying live listings
-// that expire. Only PUBLIC-SAFE display fields are serialized — exactly what
-// the free-tier digest email already shows, never internal cost math.
-
-export interface SnapshotDeal {
- rank: number;
- title: string;
- source: string;
- locationCity: string | null;
- locationState: string | null;
- currentBid: number;
- recMax: number;
- expectedSaleLow: number;
- confidence: Confidence;
- roiConservative: number;
- roiCapped: boolean;
- disclaimer: string;
- closingAt: string | null;
- sourceUrl: string | null;
-}
-
-export function digestDateString(d = new Date()): string {
- // en-CA renders YYYY-MM-DD; PT is the digest's home timezone (6am/5pm sends).
- return d.toLocaleDateString("en-CA", { timeZone: "America/Los_Angeles" });
-}
-
-export function currentSlot(d = new Date()): DigestSlot {
- const hour = Number(
- d.toLocaleString("en-US", { timeZone: "America/Los_Angeles", hour: "numeric", hour12: false }),
- );
- return hour < 12 ? "AM" : "PM";
-}
-
-export function toSnapshotDeals(deals: HotDeal[]): SnapshotDeal[] {
- return deals.map((d, i) => ({
- rank: i + 1,
- title: d.listing.title,
- source: d.listing.source,
- locationCity: d.listing.locationCity,
- locationState: d.listing.locationState,
- currentBid: d.currentBid,
- recMax: d.recMax,
- expectedSaleLow: d.expectedSaleLow,
- confidence: d.confidence,
- roiConservative: d.roiConservative,
- roiCapped: d.roiCapped,
- disclaimer: d.disclaimer,
- closingAt: d.closingAt ? new Date(d.closingAt).toISOString() : null,
- sourceUrl: d.listing.sourceUrl,
- }));
-}
-
-/** Persist a snapshot from already-fetched deals (used at digest send time). */
-export async function persistDigestSnapshot(slot: DigestSlot, deals: HotDeal[], date = digestDateString()) {
- const snapshotDeals = toSnapshotDeals(deals);
- const dealsJson = snapshotDeals as unknown as Prisma.InputJsonValue;
- return prisma.digestSnapshot.upsert({
- where: { date_slot: { date, slot } },
- create: { date, slot, dealsJson, dealCount: snapshotDeals.length },
- update: { dealsJson, dealCount: snapshotDeals.length },
- });
-}
-
-/** Standalone capture: run the honesty-gated Top-10 and freeze it. */
-export async function captureDigestSnapshot(slot: DigestSlot = currentSlot()) {
- const deals = await findHotDeals({ limit: 10 });
- return persistDigestSnapshot(slot, deals);
-}
-
-// ── read side for the /deals archive pages ─────────────────────────────────
-
-export interface DigestEdition {
- date: string;
- slot: DigestSlot;
- dealCount: number;
- createdAt: Date;
- deals: SnapshotDeal[];
-}
-
-function parseDeals(dealsJson: Prisma.JsonValue): SnapshotDeal[] {
- return Array.isArray(dealsJson) ? (dealsJson as unknown as SnapshotDeal[]) : [];
-}
-
-function toEdition(r: { date: string; slot: DigestSlot; dealCount: number; createdAt: Date; dealsJson: Prisma.JsonValue }): DigestEdition {
- return {
- date: r.date,
- slot: r.slot,
- dealCount: r.dealCount,
- createdAt: r.createdAt,
- deals: parseDeals(r.dealsJson),
- };
-}
-
-// Fabricated seed editions never reach the public archive. Schema-level flag,
-// not a delete-before-launch convention — opt in locally with SHOW_SEED_DIGESTS=1.
-function seedFilter(): { isSeed?: false } {
- return process.env.SHOW_SEED_DIGESTS === "1" ? {} : { isSeed: false };
-}
-
-export async function listDigestEditions(limit = 60): Promise<DigestEdition[]> {
- const rows = await prisma.digestSnapshot.findMany({
- where: seedFilter(),
- orderBy: [{ date: "desc" }, { slot: "asc" }],
- take: limit,
- });
- return rows.map(toEdition);
-}
-
-export async function getDigestEditionsForDate(date: string): Promise<DigestEdition[]> {
- const rows = await prisma.digestSnapshot.findMany({
- where: { date, ...seedFilter() },
- orderBy: { slot: "asc" },
- });
- return rows.map(toEdition);
-}
-
-export async function listDigestDates(): Promise<{ date: string; lastModified: Date }[]> {
- const rows = await prisma.digestSnapshot.findMany({
- where: seedFilter(),
- select: { date: true, createdAt: true },
- orderBy: { date: "desc" },
- });
- const byDate = new Map<string, Date>();
- for (const r of rows) {
- const prev = byDate.get(r.date);
- if (!prev || r.createdAt > prev) byDate.set(r.date, r.createdAt);
- }
- return [...byDate.entries()].map(([date, lastModified]) => ({ date, lastModified }));
-}
diff --git a/govarbitrage/src/lib/digest-top.ts b/govarbitrage/src/lib/digest-top.ts
deleted file mode 100644
index 072b665..0000000
--- a/govarbitrage/src/lib/digest-top.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { queryListings, type ListingRow } from "@/lib/listings";
-
-// Shared "top ranked opportunities" selection — the single definition of how
-// the Top-10 digest (scripts/send-digest.ts) and the skeptic agent pick the
-// ranked head of the corpus, so the adversarial gate audits exactly what the
-// digest is about to email.
-
-export interface TopRankedOptions {
- limit: number;
- /**
- * When true (digest behavior) only still-open auctions (closingAt in the
- * future) are returned. The skeptic passes false so it can also catch
- * stale rows — closed auctions still ranked as if live.
- */
- openOnly?: boolean;
-}
-
-/** ACTIVE listings ranked by Overall Opportunity, best first. */
-export async function topRankedOpportunities(opts: TopRankedOptions): Promise<ListingRow[]> {
- const { limit, openOnly = true } = opts;
- const { rows } = await queryListings({
- profile: "OVERALL_OPPORTUNITY",
- sort: "opportunityScore",
- dir: "desc",
- pageSize: Math.max(200, limit),
- });
- const now = Date.now();
- const pool = openOnly
- ? rows.filter((r) => r.closingAt && new Date(r.closingAt).getTime() > now)
- : rows;
- return pool.slice(0, limit);
-}
diff --git a/govarbitrage/src/lib/fleet-sso.ts b/govarbitrage/src/lib/fleet-sso.ts
deleted file mode 100644
index 427a034..0000000
--- a/govarbitrage/src/lib/fleet-sso.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-// Fleet single-sign-on cookie ("aafleet") — a stateless HMAC token shared
-// across every *.agentabrams.com site, issued by the fleet-sso service
-// (/var/www/fleet-sso/server.mjs). Format: "v1.<exp>.<sig>" where
-// sig = HMAC-SHA256(FLEET_SSO_SECRET, "v1." + exp) (hex)
-// and exp is a unix-seconds expiry. Because the cookie's Domain is
-// ".agentabrams.com", auctions already receives it — validating it here lets a
-// single fleet login carry into this app with no second sign-in.
-//
-// This mirrors the verifier's valid() exactly and is Edge-safe (Web Crypto,
-// no Node `crypto`), so it runs inside the Next.js middleware.
-
-export const FLEET_SSO_COOKIE = "aafleet";
-
-const TOKEN_RE = /^v1\.(\d+)\.([0-9a-f]{64})$/;
-
-function toHex(buf: ArrayBuffer): string {
- return Array.from(new Uint8Array(buf), (b) => b.toString(16).padStart(2, "0")).join("");
-}
-
-// Constant-time-ish compare of two equal-length hex strings.
-function safeEqualHex(a: string, b: string): boolean {
- if (a.length !== b.length) return false;
- let diff = 0;
- for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
- return diff === 0;
-}
-
-export async function fleetSsoOk(token: string | undefined | null): Promise<boolean> {
- const secret = process.env.FLEET_SSO_SECRET;
- if (!secret || !token) return false;
- const m = TOKEN_RE.exec(token);
- if (!m) return false;
- const exp = parseInt(m[1], 10);
- if (!(exp > Math.floor(Date.now() / 1000))) return false; // expired
- const key = await crypto.subtle.importKey(
- "raw",
- new TextEncoder().encode(secret),
- { name: "HMAC", hash: "SHA-256" },
- false,
- ["sign"],
- );
- const mac = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode("v1." + m[1]));
- return safeEqualHex(toHex(mac), m[2]);
-}
diff --git a/govarbitrage/src/lib/hot-deals.ts b/govarbitrage/src/lib/hot-deals.ts
deleted file mode 100644
index 287ecc1..0000000
--- a/govarbitrage/src/lib/hot-deals.ts
+++ /dev/null
@@ -1,191 +0,0 @@
-import { prisma } from "@/lib/db";
-
-// A HOT DEAL is not merely a cheap lot — it is a lot where BOTH sides check out:
-// BUY side — there is still headroom to bid profitably (recommendedMaxBid is
-// meaningfully above the current bid), the net profit and ROI clear
-// the bar, and the auction is still open (or a make-offer item).
-// SELL side — "real opportunity to sell before you buy": genuine resale demand
-// (demand score + probability of sale) and a valued expected sale.
-// This is the gate behind the 🔥 alert. Thresholds are env-tunable so Steve can
-// dial the signal without a code change.
-
-export interface HotDealCriteria {
- minScore: number; // OVERALL_OPPORTUNITY value 0..100
- minArbitrage: number; // arbitrage sub-score
- minDemand: number; // demand sub-score (sell-side proof)
- minProbSale: number; // Research.probabilityOfSale 0..1
- minNetProfit: number; // $ expected net profit
- minRoi: number; // ratio, 0.5 = 50%
- minHeadroomPct: number; // (recMaxBid - currentBid)/recMaxBid, room to still bid & profit
-}
-
-function envNum(key: string, dflt: number): number {
- const v = process.env[key];
- const n = v == null ? NaN : Number(v);
- return Number.isFinite(n) ? n : dflt;
-}
-
-export function defaultCriteria(): HotDealCriteria {
- // Tuned 2026-07-10 against the live corpus: the Overall score is bimodal —
- // a loose 75-81 cluster (~9% of all listings, inflated by the heuristic,
- // no-AI valuation engine) and a small genuine elite at 82+. Anchoring at
- // score≥82 surfaces only true standouts instead of flooding. Every threshold
- // is env-overridable so Steve can loosen/tighten without a code change.
- // NOTE: valuations are heuristic (optimistic) until real marketplace-comp
- // calibration lands — treat ROI as directional, verify comps before bidding.
- return {
- minScore: envNum("HOT_MIN_SCORE", 82),
- minArbitrage: envNum("HOT_MIN_ARBITRAGE", 72),
- minDemand: envNum("HOT_MIN_DEMAND", 55),
- minProbSale: envNum("HOT_MIN_PROB_SALE", 0.55),
- minNetProfit: envNum("HOT_MIN_NET", 300),
- minRoi: envNum("HOT_MIN_ROI", 0.75),
- minHeadroomPct: envNum("HOT_MIN_HEADROOM_PCT", 0.2),
- };
-}
-
-export type HotDeal = Awaited<ReturnType<typeof findHotDeals>>[number];
-
-const num = (d: unknown): number => (d == null ? 0 : Number(d));
-
-// ── HONESTY GATE ──────────────────────────────────────────────────────────
-// The valuation engine is heuristic and runs OPTIMISTIC (a "727% ROI" is not a
-// promise we can keep). Charging for alerts built on inflated ROI is a
-// chargeback/trust trap. So every alert is discounted by our CONFIDENCE in it
-// and always carries the evidence basis + a verify-comps disclaimer. We sell
-// "curated + de-duped + early", never a guaranteed number. Under-promise.
-export type Confidence = "LOW" | "MEDIUM" | "HIGH";
-
-// Confidence from REAL evidence: how many comparable sales back the estimate,
-// the modeled probability of sale, and whether we have used-market comps at all.
-export function assessConfidence(
- comparableCount: number,
- probSale: number,
- hasUsedComps: boolean,
-): Confidence {
- if (comparableCount >= 5 && probSale >= 0.7) return "HIGH";
- if (comparableCount >= 2 && probSale >= 0.55 && hasUsedComps) return "MEDIUM";
- return "LOW";
-}
-
-// Haircut applied to the optimistic sale/ROI by confidence — the number we
-// actually SHOW is the conservative low band, so reality tends to beat it.
-export const CONFIDENCE_HAIRCUT: Record<Confidence, number> = {
- LOW: 0.5,
- MEDIUM: 0.7,
- HIGH: 0.9,
-};
-
-// Displayed ROI is capped so a heuristic outlier can never render as hype.
-export const ROI_DISPLAY_CAP = 2.0; // 200%
-
-/**
- * Find ACTIVE listings that pass the HOT DEAL gate. If `onlyUnalerted`, skip
- * ones already alerted (hotAlertedAt set) — the alerter uses this to notify
- * each deal exactly once.
- */
-export async function findHotDeals(opts: {
- criteria?: HotDealCriteria;
- onlyUnalerted?: boolean;
- limit?: number;
-} = {}) {
- const c = opts.criteria ?? defaultCriteria();
- const now = new Date();
-
- // Pull ACTIVE listings with a strong overall score, then apply the full gate
- // in JS (mixes Score + CostBreakdown + Research fields across relations).
- const listings = await prisma.listing.findMany({
- where: {
- listingStatus: "ACTIVE",
- ...(opts.onlyUnalerted ? { hotAlertedAt: null } : {}),
- scores: { some: { profile: "OVERALL_OPPORTUNITY", value: { gte: c.minScore } } },
- },
- include: {
- research: true,
- costBreakdown: true,
- scores: true,
- buyerLeads: true,
- buyerPage: true,
- comparables: true,
- },
- });
-
- const deals = [];
- for (const l of listings) {
- const s = l.scores.find((x) => x.profile === "OVERALL_OPPORTUNITY");
- const cb = l.costBreakdown;
- const r = l.research;
- if (!s || !cb) continue;
-
- const currentBid = num(l.currentBid);
- const recMax = num(cb.recommendedMaxBid);
- const netProfit = num(cb.expectedNetProfit);
- const roi = num(cb.roi);
- const probSale = num(r?.probabilityOfSale);
-
- // Auction must still be live: either open (closingAt in the future) or a
- // make-offer/no-deadline item (null closingAt).
- const open = !l.closingAt || new Date(l.closingAt).getTime() > now.getTime();
- if (!open) continue;
-
- // BUY-side headroom: recommended max bid must sit above the current bid by
- // at least minHeadroomPct — i.e. you can still bid and profit.
- const headroom = recMax > 0 ? (recMax - currentBid) / recMax : 0;
-
- const pass =
- s.value >= c.minScore &&
- s.arbitrage >= c.minArbitrage &&
- s.demand >= c.minDemand &&
- probSale >= c.minProbSale &&
- netProfit >= c.minNetProfit &&
- roi >= c.minRoi &&
- recMax > currentBid &&
- headroom >= c.minHeadroomPct;
-
- if (!pass) continue;
-
- // ── Honesty Gate: discount the optimistic estimate by our confidence ──
- const comparableCount = l.comparables.length;
- const hasUsedComps = r?.usedLow != null || r?.usedSoldPrice != null || r?.usedHigh != null;
- const confidence = assessConfidence(comparableCount, probSale, hasUsedComps);
- const haircut = CONFIDENCE_HAIRCUT[confidence];
- const expectedSale = num(r?.expectedSalePrice);
- const expectedSaleLow = Math.round(expectedSale * haircut);
- // Conservative ROI we actually SHOW: haircut by confidence, then capped.
- const roiConservative = Math.min(roi * haircut, ROI_DISPLAY_CAP);
- const roiCapped = roi > ROI_DISPLAY_CAP; // flag when the raw number was hype
- const disclaimer = `Heuristic estimate${comparableCount ? ` from ${comparableCount} comp${comparableCount === 1 ? "" : "s"}` : " (thin comp data)"} — verify before bidding.`;
-
- deals.push({
- listing: l,
- score: s,
- cost: cb,
- research: r,
- currentBid,
- recMax,
- headroom,
- netProfit,
- roi,
- probSale,
- expectedSale,
- // Honesty Gate outputs (what the paid alert should DISPLAY):
- confidence,
- expectedSaleLow,
- roiConservative,
- roiCapped,
- disclaimer,
- demandScore: s.demand,
- comparableCount,
- buyerLeadCount: l.buyerLeads.length,
- buyerLeadTop: l.buyerLeads
- .map((b) => num(b.offer))
- .filter((x) => x > 0)
- .sort((a, b) => b - a)[0] ?? 0,
- closingAt: l.closingAt,
- });
- }
-
- // Best first: highest score, then net profit.
- deals.sort((a, b) => b.score.value - a.score.value || b.netProfit - a.netProfit);
- return typeof opts.limit === "number" ? deals.slice(0, opts.limit) : deals;
-}
diff --git a/govarbitrage/src/lib/listing-detail.test.ts b/govarbitrage/src/lib/listing-detail.test.ts
deleted file mode 100644
index e874ee6..0000000
--- a/govarbitrage/src/lib/listing-detail.test.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { describe, expect, it } from "vitest";
-import { Prisma } from "@prisma/client";
-import { decimalsToNumbers } from "./listing-detail";
-
-// Regression test for TK-10279: the listing DETAIL endpoint (unlike the LIST
-// endpoint's flattenListing(), which already ran every Decimal through
-// num()/numN()) used to return raw Prisma Decimal instances straight to
-// NextResponse.json(). JSON.stringify() serializes a Decimal via its own
-// toJSON() -> a STRING ("103.93"), which the mobile client's Number.isFinite()
-// render guards (fmtUSD/fmtPct/fmtScore) correctly treat as non-finite and
-// render "—" -- so a fully-researched listing showed an all-null Valuation
-// table + null Recommended Max Bid on the detail screen while the LIST screen
-// (same listing, same underlying data) showed real numbers. This test locks
-// in the fix: decimalsToNumbers() must turn every Decimal in the object graph
-// into a real `number` so it survives a JSON round-trip as a JSON number, not
-// a string.
-describe("decimalsToNumbers (TK-10279 detail-screen null-valuation regression)", () => {
- it("converts a top-level Decimal to a real number", () => {
- const out = decimalsToNumbers(new Prisma.Decimal("103.93"));
- expect(typeof out).toBe("number");
- expect(out).toBe(103.93);
- });
-
- it("converts nested Decimals inside relation objects (costBreakdown / research)", () => {
- const listing = {
- id: "l1",
- currentBid: new Prisma.Decimal("10"),
- research: {
- newRetail: new Prisma.Decimal("900"),
- avgRetail: new Prisma.Decimal("828"),
- usedLow: null,
- },
- costBreakdown: {
- recommendedMaxBid: new Prisma.Decimal("103.93"),
- expectedNetProfit: new Prisma.Decimal("182.96"),
- roi: 1.91, // Float column — already a plain number, must pass through unchanged
- },
- scores: [{ value: 82.07, risk: "MEDIUM" }],
- };
-
- const fixed = decimalsToNumbers(listing);
-
- expect(typeof fixed.currentBid).toBe("number");
- expect(fixed.currentBid).toBe(10);
- expect(typeof fixed.research!.newRetail).toBe("number");
- expect(fixed.research!.newRetail).toBe(900);
- expect(fixed.research!.usedLow).toBeNull();
- expect(typeof fixed.costBreakdown!.recommendedMaxBid).toBe("number");
- expect(fixed.costBreakdown!.recommendedMaxBid).toBe(103.93);
- expect(fixed.costBreakdown!.roi).toBe(1.91);
- expect(fixed.scores[0].value).toBe(82.07);
- });
-
- it("survives a JSON.stringify round-trip as a JSON number, not a string (the actual client-visible bug)", () => {
- const raw = { costBreakdown: { recommendedMaxBid: new Prisma.Decimal("4736.72") } };
-
- // BEFORE the fix: JSON.stringify(raw) directly would produce
- // '{"costBreakdown":{"recommendedMaxBid":"4736.72"}}' — a STRING.
- const buggyRoundTrip = JSON.parse(JSON.stringify(raw));
- expect(typeof buggyRoundTrip.costBreakdown.recommendedMaxBid).toBe("string");
- expect(Number.isFinite(buggyRoundTrip.costBreakdown.recommendedMaxBid)).toBe(false);
-
- // AFTER the fix: decimalsToNumbers() first, then serialize.
- const fixedRoundTrip = JSON.parse(JSON.stringify(decimalsToNumbers(raw)));
- expect(typeof fixedRoundTrip.costBreakdown.recommendedMaxBid).toBe("number");
- expect(Number.isFinite(fixedRoundTrip.costBreakdown.recommendedMaxBid)).toBe(true);
- expect(fixedRoundTrip.costBreakdown.recommendedMaxBid).toBe(4736.72);
- });
-
- it("leaves non-Decimal values (strings, Dates, null, arrays) untouched", () => {
- const now = new Date("2026-09-03T00:00:00Z");
- const out = decimalsToNumbers({
- title: "Late 2013 Apple iMac 21.5\"",
- sourceAuctionId: "29250-189",
- closingAt: now,
- imageUrls: ["https://example.com/a.jpg"],
- description: null,
- });
- expect(out.title).toBe("Late 2013 Apple iMac 21.5\"");
- expect(out.sourceAuctionId).toBe("29250-189");
- expect(out.closingAt).toBe(now);
- expect(out.imageUrls).toEqual(["https://example.com/a.jpg"]);
- expect(out.description).toBeNull();
- });
-});
diff --git a/govarbitrage/src/lib/listing-detail.ts b/govarbitrage/src/lib/listing-detail.ts
deleted file mode 100644
index 9b31dfc..0000000
--- a/govarbitrage/src/lib/listing-detail.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { prisma } from "@/lib/db";
-import { getCurrentTier, moneyMathVisible } from "@/lib/current-user";
-import { Prisma, type Tier } from "@prisma/client";
-
-// Single source of truth for the listing DETAIL payload and its tier gate.
-// Visibility depends on the resolved tier only, never on the client type. All
-// current tiers (FREE included) show the full analysis, so the redaction below
-// is dormant — retained so a future gated tier can null the money-math
-// relations (costBreakdown, research valuations, scores, comparables, buyer
-// leads) consistently with the list endpoint.
-
-export type ListingDetail = NonNullable<Awaited<ReturnType<typeof queryListingDetail>>>;
-
-function queryListingDetail(id: string) {
- return prisma.listing.findUnique({
- where: { id },
- include: {
- research: true,
- costBreakdown: true,
- scores: { orderBy: { value: "desc" } },
- comparables: { orderBy: { price: "desc" } },
- notes: { orderBy: { createdAt: "desc" } },
- events: { orderBy: { createdAt: "desc" }, take: 20 },
- buyerLeads: { orderBy: { createdAt: "desc" } },
- buyerPage: true,
- outcome: true,
- },
- });
-}
-
-// Root-cause fix (TK-10279, 2026-09-03): every money-math field on Listing /
-// Research / CostBreakdown is a Prisma Decimal. JSON.stringify() (what
-// NextResponse.json() uses) serializes a Decimal via its own toJSON(), which
-// returns a STRING (e.g. "103.93"), not a JSON number. The LIST endpoint
-// (src/lib/listings.ts flattenListing()) already runs every Decimal through
-// num()/numN() so it emits real numbers — but this DETAIL path returned the
-// raw Prisma object untouched, so its JSON carried numeric-looking strings.
-// The mobile client's Number.isFinite() render guards (fmtUSD/fmtPct/fmtScore)
-// correctly reject a string as non-finite and render "—" — so a fully
-// populated listing (proven identical to the list's $183 net profit / 191%
-// ROI numbers) showed an all-null Valuation table + a null Recommended Max
-// Bid + "Current bid: —" on the detail screen only. Recursively converting
-// every Decimal to a plain number before the route serializes it makes the
-// detail payload's JSON shape match the list's (and match the mobile client's
-// own `ListingDetail`/`CostBreakdown`/`Research` types, which already declare
-// these fields as `number | null`).
-export function decimalsToNumbers<T>(value: T): T {
- if (value instanceof Prisma.Decimal) return value.toNumber() as unknown as T;
- if (Array.isArray(value)) return value.map((v) => decimalsToNumbers(v)) as unknown as T;
- if (value instanceof Date) return value;
- if (value && typeof value === "object") {
- const out: Record<string, unknown> = {};
- for (const [k, v] of Object.entries(value as Record<string, unknown>)) {
- out[k] = decimalsToNumbers(v);
- }
- return out as T;
- }
- return value;
-}
-
-export async function getGatedListingDetail(
- id: string
-): Promise<{ listing: ListingDetail | null; tier: Tier; gated: boolean }> {
- const tier = await getCurrentTier();
- const gated = !(await moneyMathVisible(tier));
- const raw = await queryListingDetail(id);
- const listing = raw ? decimalsToNumbers(raw) : raw;
- if (!listing || !gated) return { listing, tier, gated };
-
- const redacted: ListingDetail = {
- ...listing,
- research: null,
- costBreakdown: null,
- scores: [],
- comparables: [],
- buyerLeads: [],
- buyerPage: null,
- outcome: null,
- };
- return { listing: redacted, tier, gated };
-}
diff --git a/govarbitrage/src/lib/listings-sort.test.ts b/govarbitrage/src/lib/listings-sort.test.ts
deleted file mode 100644
index 38b4553..0000000
--- a/govarbitrage/src/lib/listings-sort.test.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { describe, it, expect } from "vitest";
-import { Prisma } from "@prisma/client";
-
-// Regression guard for TK-11464: sorting the listings grid by a non-nullable
-// native column (title, source, condition, …) returned HTTP 500 because the
-// DB-side orderBy applied Prisma's { sort, nulls } object form to EVERY native
-// column. Prisma only accepts that object form on OPTIONAL (nullable) fields;
-// a required field must use the bare SortOrder string, else it throws
-// PrismaClientValidationError ("Expected SortOrder, provided Object.").
-//
-// listings.ts gates the object form behind NULLABLE_NATIVE_SORT_COLUMNS. This
-// test keeps that gate honest against the schema with no DB needed: a native
-// column is classified nullable iff the Prisma field is optional. It fails if
-// a field's nullability changes without updating the set, or a new native sort
-// column is added unclassified.
-
-// Mirror of the sets in src/lib/listings.ts (this test is their sync-check).
-const NATIVE_SORT_COLUMNS = [
- "currentBid",
- "closingAt",
- "title",
- "source",
- "sourceAuctionId",
- "category",
- "manufacturer",
- "model",
- "condition",
- "quantity",
- "researchStatus",
-] as const;
-
-const NULLABLE_NATIVE_SORT_COLUMNS = new Set<string>([
- "closingAt",
- "category",
- "manufacturer",
- "model",
-]);
-
-describe("listings native sort classification (TK-11464)", () => {
- const listing = Prisma.dmmf.datamodel.models.find((m) => m.name === "Listing");
-
- it("resolves the Listing model from the Prisma DMMF", () => {
- expect(listing).toBeDefined();
- });
-
- it("classifies a native sort column as nullable iff the schema field is optional", () => {
- for (const name of NATIVE_SORT_COLUMNS) {
- const field = listing!.fields.find((f) => f.name === name);
- expect(field, `${name} is not a scalar field on Listing`).toBeDefined();
- // Prisma: optional field => isRequired === false => may carry { sort, nulls }.
- expect(
- NULLABLE_NATIVE_SORT_COLUMNS.has(name),
- `${name}: orderBy nullability classification must match schema (schema optional=${!field!.isRequired})`,
- ).toBe(!field!.isRequired);
- }
- });
-});
diff --git a/govarbitrage/src/lib/listings.ts b/govarbitrage/src/lib/listings.ts
deleted file mode 100644
index c0d826b..0000000
--- a/govarbitrage/src/lib/listings.ts
+++ /dev/null
@@ -1,254 +0,0 @@
-import { prisma } from "@/lib/db";
-import type { Prisma } from "@prisma/client";
-
-// Flat row shape backing the dashboard table — every sortable column the spec
-// lists, denormalized from Listing + Research + CostBreakdown + the chosen Score.
-export interface ListingRow {
- id: string;
- source: string;
- sourceAuctionId: string;
- sourceUrl: string | null;
- title: string;
- category: string | null;
- manufacturer: string | null;
- model: string | null;
- condition: string;
- quantity: number;
- currentBid: number;
- currentCost: number; // bid + premium + tax (acquisition-in)
- recommendedMaxBid: number;
- retailLow: number | null;
- retailAverage: number | null;
- retailHigh: number | null;
- usedLow: number | null;
- usedAverage: number | null;
- usedHigh: number | null;
- wholesale: number | null;
- liquidation: number | null;
- sellNow: number | null;
- value7Day: number | null;
- value30Day: number | null;
- value90Day: number | null;
- expectedSale: number | null;
- shipping: number;
- freight: number;
- repairs: number;
- marketplaceFees: number;
- netProfit: number;
- roi: number;
- risk: string;
- confidence: number | null;
- opportunityScore: number;
- arbitrageScore: number;
- demandScore: number;
- velocityScore: number;
- logisticsScore: number;
- conditionScore: number;
- competitionScore: number;
- buyerScore: number;
- dropShip: string;
- closingAt: string | null;
- researchStatus: string;
- imageUrl: string | null;
-}
-
-type FullListing = Prisma.ListingGetPayload<{
- include: { research: true; costBreakdown: true; scores: true };
-}>;
-
-const num = (d: Prisma.Decimal | number | null | undefined): number =>
- d == null ? 0 : typeof d === "number" ? d : Number(d);
-const numN = (d: Prisma.Decimal | number | null | undefined): number | null =>
- d == null ? null : typeof d === "number" ? d : Number(d);
-
-export function flattenListing(l: FullListing, profile = "OVERALL_OPPORTUNITY"): ListingRow {
- const r = l.research;
- const c = l.costBreakdown;
- const s = l.scores.find((x) => x.profile === profile) ?? l.scores[0];
- const currentCost = c ? num(c.winningBid) + num(c.buyerPremium) + num(c.salesTax) : num(l.currentBid);
- return {
- id: l.id,
- source: l.source,
- sourceAuctionId: l.sourceAuctionId,
- sourceUrl: l.sourceUrl,
- title: l.title,
- category: l.category,
- manufacturer: l.manufacturer,
- model: l.model,
- condition: l.condition,
- quantity: l.quantity,
- currentBid: num(l.currentBid),
- currentCost,
- recommendedMaxBid: num(c?.recommendedMaxBid),
- retailLow: numN(r?.usedLow),
- retailAverage: numN(r?.avgRetail),
- retailHigh: numN(r?.newRetail),
- usedLow: numN(r?.usedLow),
- usedAverage: numN(r?.usedSoldPrice),
- usedHigh: numN(r?.usedHigh),
- wholesale: numN(r?.wholesaleValue),
- liquidation: numN(r?.liquidationValue),
- sellNow: numN(r?.sellTodayValue),
- value7Day: numN(r?.value7Day),
- value30Day: numN(r?.value30Day),
- value90Day: numN(r?.value90Day),
- expectedSale: numN(r?.expectedSalePrice),
- shipping: num(c?.shipping),
- freight: num(c?.freight),
- repairs: num(c?.repairs),
- marketplaceFees: num(c?.marketplaceFees),
- netProfit: num(c?.expectedNetProfit),
- roi: num(c?.roi),
- risk: s?.risk ?? "MEDIUM",
- confidence: numN(r?.confidenceScore),
- opportunityScore: s?.value ?? 0,
- arbitrageScore: s?.arbitrage ?? 0,
- demandScore: s?.demand ?? 0,
- velocityScore: s?.velocity ?? 0,
- logisticsScore: s?.logistics ?? 0,
- conditionScore: s?.condition ?? 0,
- competitionScore: s?.competition ?? 0,
- buyerScore: s?.buyer ?? 0,
- dropShip: s?.dropShip ?? "MODERATE",
- closingAt: l.closingAt ? l.closingAt.toISOString() : null,
- researchStatus: l.researchStatus,
- imageUrl: l.imageUrls[0] ?? null,
- };
-}
-
-export interface QueryParams {
- search?: string;
- source?: string;
- category?: string;
- condition?: string;
- risk?: string;
- closingWithinHours?: number;
- sort?: keyof ListingRow;
- dir?: "asc" | "desc";
- page?: number;
- pageSize?: number;
- profile?: string;
- // Listing lifecycle filter. Defaults to ACTIVE so ended/removed (dead)
- // listings never show on the live grid. Pass "ALL" to include everything.
- status?: string;
-}
-
-// Listing scalar columns that map 1-to-1 to a DB field and can therefore be
-// pushed into Prisma's orderBy. Everything else (scores, risk, computed cost
-// fields) lives on joined relations and must be sorted in JS.
-const NATIVE_SORT_COLUMNS = new Set<keyof ListingRow>([
- "currentBid",
- "closingAt",
- "title",
- "source",
- "sourceAuctionId",
- "category",
- "manufacturer",
- "model",
- "condition",
- "quantity",
- "researchStatus",
-]);
-
-const NULLABLE_NATIVE_SORT_COLUMNS = new Set<keyof ListingRow>([
- "closingAt",
- "category",
- "manufacturer",
- "model",
-]);
-
-export async function queryListings(params: QueryParams) {
- const {
- search,
- source,
- category,
- condition,
- risk,
- closingWithinHours,
- sort = "opportunityScore",
- dir = "desc",
- page = 1,
- pageSize = 50,
- profile = "OVERALL_OPPORTUNITY",
- status = "ACTIVE",
- } = params;
-
- const where: Prisma.ListingWhereInput = {};
- if (status && status !== "ALL") {
- where.listingStatus = status as Prisma.ListingWhereInput["listingStatus"];
- }
- if (source) where.source = source as Prisma.ListingWhereInput["source"];
- if (condition) where.condition = condition as Prisma.ListingWhereInput["condition"];
- if (category) where.category = { contains: category, mode: "insensitive" };
- if (search) {
- where.OR = [
- { title: { contains: search, mode: "insensitive" } },
- { manufacturer: { contains: search, mode: "insensitive" } },
- { model: { contains: search, mode: "insensitive" } },
- { sourceAuctionId: { contains: search, mode: "insensitive" } },
- ];
- }
- if (closingWithinHours) {
- where.closingAt = { lte: new Date(Date.now() + closingWithinHours * 3_600_000), gte: new Date() };
- }
-
- // DB-side sort + pagination path: only when the sort column is a native
- // Listing scalar AND no risk filter is active (risk is derived from the
- // Score relation and cannot be pushed to the DB without a schema change).
- const canPaginateAtDb = NATIVE_SORT_COLUMNS.has(sort) && !risk;
-
- if (canPaginateAtDb) {
- const [rawRows, total] = await Promise.all([
- prisma.listing.findMany({
- where,
- include: { research: true, costBreakdown: true, scores: true },
- // nulls first on asc / last on desc mirrors the JS fallback's
- // String(v ?? "") ordering, so the DB path is order-equivalent.
- orderBy: {
- [sort]: NULLABLE_NATIVE_SORT_COLUMNS.has(sort)
- ? { sort: dir, nulls: dir === "asc" ? "first" : "last" }
- : dir,
- } as Prisma.ListingOrderByWithRelationInput,
- skip: (page - 1) * pageSize,
- take: pageSize,
- }),
- prisma.listing.count({ where }),
- ]);
- const rows = rawRows.map((l) => flattenListing(l, profile));
- return { rows, total, page, pageSize };
- }
-
- // JS-side sort + pagination fallback: used when sort is a relation/computed
- // field (opportunityScore, arbitrageScore, netProfit, roi, risk, etc.) or
- // when a risk filter is active. A hard cap prevents unbounded memory load.
- // TODO(perf): denormalize score columns (value, arbitrage, risk, …) onto
- // Listing to enable DB-side sort/pagination for score-based sorts — needs a
- // gated migration adding columns + a backfill job.
- const CAP = 5000;
- const all = await prisma.listing.findMany({
- where,
- include: { research: true, costBreakdown: true, scores: true },
- take: CAP,
- });
- if (all.length === CAP) {
- // Not silent: past the cap, total (rows.length) undercounts for this
- // filter+sort. The durable fix is the denormalization TODO above.
- console.warn(`[queryListings] hit ${CAP}-row cap (sort=${sort}, risk=${risk ?? "none"}); total may undercount`);
- }
-
- let rows = all.map((l) => flattenListing(l, profile));
- if (risk) rows = rows.filter((r) => r.risk === risk);
-
- rows.sort((a, b) => {
- const av = a[sort];
- const bv = b[sort];
- if (typeof av === "number" && typeof bv === "number") return dir === "asc" ? av - bv : bv - av;
- const as = String(av ?? "");
- const bs = String(bv ?? "");
- return dir === "asc" ? as.localeCompare(bs) : bs.localeCompare(as);
- });
-
- const total = rows.length;
- const start = (page - 1) * pageSize;
- return { rows: rows.slice(start, start + pageSize), total, page, pageSize };
-}
diff --git a/govarbitrage/src/lib/marketplace-links.test.ts b/govarbitrage/src/lib/marketplace-links.test.ts
deleted file mode 100644
index c7aec17..0000000
--- a/govarbitrage/src/lib/marketplace-links.test.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { describe, expect, it } from "vitest";
-import { searchQuery, auctionNetworkLinks, boardLinks, internationalNetworkLinks, internationalTopLinks } from "./marketplace-links";
-
-describe("searchQuery", () => {
- it("prefers manufacturer + model and strips lot/qty noise", () => {
- expect(searchQuery({ title: "Computer Tables (4 EA)", manufacturer: "Herman Miller", model: "Aeron B" })).toBe(
- "Herman Miller Aeron B",
- );
- expect(searchQuery({ title: "HOSPITAL STRECHERS (1 LOT)" })).toBe("HOSPITAL STRECHERS");
- expect(searchQuery({ title: "Lot of 12 Apple MacBook Pro 14" })).toContain("Apple MacBook Pro 14");
- });
-
- it("ignores generic manufacturer/model values", () => {
- expect(searchQuery({ title: "Mixed Metals Scrap", manufacturer: "Assorted", model: "Various" })).toBe(
- "Mixed Metals Scrap",
- );
- });
-});
-
-describe("link builders", () => {
- it("produces auction + resale + retail links, encoded", () => {
- const links = auctionNetworkLinks({ title: "Toyota Forklift", category: "Industrial" });
- const labels = links.map((l) => l.label);
- expect(labels).toContain("eBay Sold");
- expect(labels).toContain("GovDeals");
- expect(labels).toContain("MachineryTrader"); // category specialist
- expect(links.every((l) => l.url.includes("Toyota") || l.url.includes("Forklift"))).toBe(true);
- });
-
- it("adds DOTmed for medical items and produces board links", () => {
- const med = auctionNetworkLinks({ title: "Patient Transfer Chair", category: "Medical" });
- expect(med.map((l) => l.label)).toContain("DOTmed");
- const boards = boardLinks({ title: "Patient Transfer Chair" });
- expect(boards.map((l) => l.label)).toEqual(
- expect.arrayContaining(["Reddit", "r/Flipping", "Facebook Marketplace", "Discord (Disboard)"]),
- );
- });
-
- it("covers all five international regions with encoded queries", () => {
- const intl = internationalNetworkLinks({ title: "Toyota Forklift" });
- expect(intl.map((r) => r.region)).toEqual(["Europe", "Japan", "Hong Kong", "Australia", "China"]);
- const allUrls = intl.flatMap((r) => r.links.map((l) => l.url));
- expect(allUrls.some((u) => u.includes("yahoo.co.jp"))).toBe(true);
- expect(allUrls.some((u) => u.includes("taobao.com"))).toBe(true);
- expect(allUrls.some((u) => u.includes("graysonline.com"))).toBe(true);
- expect(allUrls.every((u) => u.includes("Toyota") || u.includes("Forklift"))).toBe(true);
- expect(internationalTopLinks({ title: "Toyota Forklift" })).toHaveLength(4);
- });
-});
diff --git a/govarbitrage/src/lib/marketplace-links.ts b/govarbitrage/src/lib/marketplace-links.ts
deleted file mode 100644
index ad2ddc8..0000000
--- a/govarbitrage/src/lib/marketplace-links.ts
+++ /dev/null
@@ -1,138 +0,0 @@
-// Build deep-search links to (a) other auction/resale marketplaces and (b)
-// social "goods-needed"/flipping boards, from a listing's identifying terms.
-// All $0, no API keys — each link opens the network's live results for the item.
-
-export interface LinkChip {
- label: string;
- url: string;
- group: "auction" | "resale" | "retail" | "board";
-}
-
-interface Named {
- title: string;
- manufacturer?: string | null;
- model?: string | null;
- category?: string | null;
-}
-
-/** Best short search query for an item: prefer brand+model, strip lot/qty noise. */
-export function searchQuery(l: Named): string {
- const generic = /^(assorted|mixed|various|lot|n\/a|unknown|misc)/i;
- const parts: string[] = [];
- if (l.manufacturer && !generic.test(l.manufacturer)) parts.push(l.manufacturer);
- if (l.model && !generic.test(l.model)) parts.push(l.model);
- let q = parts.join(" ").trim();
- if (!q) q = l.title;
- // Strip lot/quantity noise: "(4 EA)", "Lot of 12", "1 LOT", trailing counts.
- q = q
- .replace(/\([^)]*\)/g, " ")
- .replace(/\b(lot of|qty|quantity)\b\s*\d*/gi, " ")
- .replace(/\b\d+\s*(ea|each|lot|pcs?|units?)\b/gi, " ")
- .replace(/\bDEMIL\b/gi, " ")
- .replace(/[^\w\s.\-/]/g, " ")
- .replace(/\s+/g, " ")
- .trim();
- return q.split(/\s+/).slice(0, 7).join(" ");
-}
-
-const enc = (s: string) => encodeURIComponent(s);
-
-/** Actual offers/comps on other auction + resale + retail networks. */
-export function auctionNetworkLinks(l: Named): LinkChip[] {
- const q = searchQuery(l);
- const e = enc(q);
- const links: LinkChip[] = [
- { label: "eBay Sold", url: `https://www.ebay.com/sch/i.html?_nkw=${e}&LH_Sold=1&LH_Complete=1`, group: "resale" },
- { label: "eBay Active", url: `https://www.ebay.com/sch/i.html?_nkw=${e}`, group: "resale" },
- { label: "GovDeals", url: `https://www.govdeals.com/search?kWord=${e}`, group: "auction" },
- { label: "AllSurplus", url: `https://www.allsurplus.com/search?query=${e}`, group: "auction" },
- { label: "Public Surplus", url: `https://www.publicsurplus.com/sms/browse/search?keyword=${e}`, group: "auction" },
- { label: "Municibid", url: `https://municibid.com/Browse?search=${e}`, group: "auction" },
- { label: "Google Shopping", url: `https://www.google.com/search?tbm=shop&q=${e}`, group: "retail" },
- ];
- // Category-specialist venues.
- const cat = `${l.category ?? ""} ${l.title}`.toLowerCase();
- if (/forklift|generator|welder|lathe|cnc|scissor|mower|tractor|compressor|industrial|machin/.test(cat)) {
- links.push({ label: "MachineryTrader", url: `https://www.machinerytrader.com/listings/search?keywords=${e}`, group: "resale" });
- }
- if (/lab|microscope|centrifuge|analyzer|hplc|spectro|scientific/.test(cat)) {
- links.push({ label: "LabX", url: `https://www.labx.com/search?q=${e}`, group: "resale" });
- }
- if (/medical|dental|patient|exam|surgical|hospital|stretcher|vital/.test(cat)) {
- links.push({ label: "DOTmed", url: `https://www.dotmed.com/equipment/search?q=${e}`, group: "resale" });
- }
- return links;
-}
-
-export interface RegionLinks {
- region: string;
- links: LinkChip[];
-}
-
-/** International resale + auction venues to check an item's price abroad. */
-export function internationalNetworkLinks(l: Named): RegionLinks[] {
- const e = enc(searchQuery(l));
- return [
- {
- region: "Europe",
- links: [
- { label: "eBay UK", url: `https://www.ebay.co.uk/sch/i.html?_nkw=${e}`, group: "resale" },
- { label: "eBay Germany", url: `https://www.ebay.de/sch/i.html?_nkw=${e}`, group: "resale" },
- { label: "Catawiki", url: `https://www.catawiki.com/en/s?q=${e}`, group: "auction" },
- { label: "Troostwijk", url: `https://www.troostwijkauctions.com/en/l?searchQuery=${e}`, group: "auction" },
- ],
- },
- {
- region: "Japan",
- links: [
- { label: "Yahoo! Auctions JP", url: `https://auctions.yahoo.co.jp/search/search?p=${e}`, group: "resale" },
- { label: "Mercari JP", url: `https://jp.mercari.com/search?keyword=${e}`, group: "resale" },
- ],
- },
- {
- region: "Hong Kong",
- links: [{ label: "Carousell HK", url: `https://www.carousell.com.hk/search/${e}`, group: "resale" }],
- },
- {
- region: "Australia",
- links: [
- { label: "GraysOnline", url: `https://www.graysonline.com/search?keywords=${e}`, group: "auction" },
- { label: "Pickles", url: `https://www.pickles.com.au/search?q=${e}`, group: "auction" },
- { label: "eBay AU", url: `https://www.ebay.com.au/sch/i.html?_nkw=${e}`, group: "resale" },
- ],
- },
- {
- region: "China",
- links: [
- { label: "Taobao", url: `https://s.taobao.com/search?q=${e}`, group: "resale" },
- { label: "JD Auction", url: `https://auction.jd.com/searchList.html?keyword=${e}`, group: "auction" },
- { label: "Alibaba", url: `https://www.alibaba.com/trade/search?SearchText=${e}`, group: "retail" },
- ],
- },
- ];
-}
-
-/** Flat top-N international chips (for the compact dashboard column). */
-export function internationalTopLinks(l: Named): LinkChip[] {
- const e = enc(searchQuery(l));
- return [
- { label: "eBay UK", url: `https://www.ebay.co.uk/sch/i.html?_nkw=${e}`, group: "resale" },
- { label: "Yahoo! JP", url: `https://auctions.yahoo.co.jp/search/search?p=${e}`, group: "resale" },
- { label: "Grays AU", url: `https://www.graysonline.com/search?keywords=${e}`, group: "auction" },
- { label: "Taobao CN", url: `https://s.taobao.com/search?q=${e}`, group: "resale" },
- ];
-}
-
-/** Social "goods-needed"/flipping/ISO boards + local marketplaces. */
-export function boardLinks(l: Named): LinkChip[] {
- const q = searchQuery(l);
- const e = enc(q);
- return [
- { label: "Reddit", url: `https://www.reddit.com/search/?q=${e}`, group: "board" },
- { label: "r/Flipping", url: `https://www.reddit.com/r/Flipping/search/?q=${e}&restrict_sr=1`, group: "board" },
- { label: "Reddit ISO/Wanted", url: `https://www.reddit.com/search/?q=${enc(`${q} ISO OR wanted OR "looking for"`)}`, group: "board" },
- { label: "Facebook Marketplace", url: `https://www.facebook.com/marketplace/search/?query=${e}`, group: "board" },
- { label: "Craigslist", url: `https://www.craigslist.org/search/sss?query=${e}`, group: "board" },
- { label: "Discord (Disboard)", url: `https://disboard.org/search?keyword=${e}`, group: "board" },
- ];
-}
diff --git a/govarbitrage/src/lib/money-math-visibility.test.ts b/govarbitrage/src/lib/money-math-visibility.test.ts
deleted file mode 100644
index eafd783..0000000
--- a/govarbitrage/src/lib/money-math-visibility.test.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { describe, expect, it } from "vitest";
-import { moneyMathVisible } from "./current-user";
-import { TIERS, TIER_ORDER } from "./tiers";
-
-// Guideline 5.6 regression lock (TK-10279). The app was rejected because
-// money-math visibility keyed off an undisclosed client signal (the presence of
-// any Authorization header). The fix removed all client-sniffing: visibility is
-// a pure function of the resolved tier. These tests fail the moment anyone
-// reintroduces a client/header-dependent branch or re-gates the FREE tier.
-describe("money-math visibility (Guideline 5.6 lock)", () => {
- it("moneyMathVisible depends ONLY on the tier argument — no request/header input", () => {
- // A pure function of one argument cannot vary by client. Same tier in ⇒
- // same answer out, every call.
- expect(moneyMathVisible.length).toBe(1);
- });
-
- it("the FREE tier shows the full analysis, so a fresh anonymous install is complete", async () => {
- expect(TIERS.FREE.limits.showMoneyMath).toBe(true);
- expect(await moneyMathVisible("FREE")).toBe(true);
- });
-
- it("every tier shows money-math identically (nothing is client-specific)", async () => {
- for (const t of TIER_ORDER) {
- expect(await moneyMathVisible(t)).toBe(true);
- }
- });
-});
diff --git a/govarbitrage/src/lib/newsletter.ts b/govarbitrage/src/lib/newsletter.ts
deleted file mode 100644
index 5090442..0000000
--- a/govarbitrage/src/lib/newsletter.ts
+++ /dev/null
@@ -1,141 +0,0 @@
-import { randomBytes } from "node:crypto";
-import { appendFile, mkdir } from "node:fs/promises";
-import path from "node:path";
-
-// Newsletter email dispatch — TEST mode by default.
-//
-// Env placeholders (all optional until a live send is approved):
-// NEWSLETTER_SEND_MODE "test" (default) | "live". Live additionally
-// requires NEWSLETTER_SEND_APPROVAL_TOKEN to be
-// set — both must be present or we stay in test.
-// NEWSLETTER_SEND_APPROVAL_TOKEN Steve-issued token gating live sends.
-// NEWSLETTER_FROM_NAME Display name for the From header.
-// NEWSLETTER_FROM_EMAIL From address (live wiring TBD via George/SMTP).
-// NEWSLETTER_MAILING_ADDRESS CAN-SPAM physical postal address (required in
-// every commercial email footer before go-live).
-// NEWSLETTER_BASE_URL Public origin for confirm/unsubscribe links;
-// falls back to the request origin.
-//
-// In TEST mode every would-be email is written to the console AND appended to
-// logs/newsletter-outbox.jsonl. LIVE mode (both NEWSLETTER_SEND_MODE=live and
-// NEWSLETTER_SEND_APPROVAL_TOKEN set) sends via George /api/send; both modes
-// append a redacted record to the outbox as the audit trail.
-
-export interface NewsletterEmail {
- to: string;
- subject: string;
- text: string;
-}
-
-export function newsletterSendMode(): "test" | "live" {
- const live =
- process.env.NEWSLETTER_SEND_MODE === "live" &&
- !!process.env.NEWSLETTER_SEND_APPROVAL_TOKEN;
- return live ? "live" : "test";
-}
-
-const OUTBOX = path.join(process.cwd(), "logs", "newsletter-outbox.jsonl");
-
-// Confirm/unsubscribe tokens are live single-use credentials — anything that
-// lands in a log file must carry only a redacted prefix, never the full token.
-export function redactTokens(text: string): string {
- return text.replace(/(token=)([A-Za-z0-9_-]{9,})/g, (_, k, v) => `${k}${v.slice(0, 8)}…`);
-}
-
-export async function sendNewsletterEmail(email: NewsletterEmail): Promise<void> {
- const record = {
- ...email,
- text: redactTokens(email.text),
- mode: newsletterSendMode(),
- fromName: process.env.NEWSLETTER_FROM_NAME || "GovArbitrage Digest (unset)",
- mailingAddress: process.env.NEWSLETTER_MAILING_ADDRESS || "(NEWSLETTER_MAILING_ADDRESS unset)",
- at: new Date().toISOString(),
- };
-
- if (record.mode === "live") {
- // Live transport: George /api/send (approved 2026-07-13). External sends
- // require the X-Send-Approval token — George fail-closes without it. The
- // transport gets `email.text` (full tokens); everything logged is redacted.
- const base = process.env.GEORGE_URL;
- const auth = process.env.GEORGE_BASIC_AUTH;
- const sendToken = process.env.GEORGE_EXTERNAL_SEND_TOKEN;
- if (!base || !auth || !sendToken) {
- throw new Error("Live send needs GEORGE_URL, GEORGE_BASIC_AUTH, and GEORGE_EXTERNAL_SEND_TOKEN.");
- }
- const HTML_ESCAPE: Record<string, string> = { "&": "&", "<": "<", ">": ">" };
- const html = `<pre style="font-family:ui-monospace,Menlo,monospace;font-size:14px;white-space:pre-wrap">${email.text
- .replace(/[&<>]/g, (c) => HTML_ESCAPE[c] ?? c)
- .replace(/(https?:\/\/[^\s]+)/g, '<a href="$1">$1</a>')}</pre>`;
- const res = await fetch(`${base}/api/send`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- Authorization: `Basic ${auth}`,
- "X-Send-Approval": sendToken,
- },
- body: JSON.stringify({
- account: process.env.NEWSLETTER_GEORGE_ACCOUNT || "steve-office",
- to: email.to,
- subject: email.subject,
- body: html,
- }),
- });
- if (!res.ok) {
- const text = await res.text();
- throw new Error(`George send failed ${res.status}: ${text.slice(0, 300)}`);
- }
- } else {
- console.log(`[newsletter:test-outbox] to=${email.to} subject="${email.subject}"`);
- console.log(record.text);
- }
-
- // Both modes append to the outbox (redacted) — the audit trail of every send.
- await mkdir(path.dirname(OUTBOX), { recursive: true });
- await appendFile(OUTBOX, JSON.stringify(record) + "\n", "utf8");
-}
-
-export function newToken(): string {
- return randomBytes(32).toString("base64url");
-}
-
-export function normalizeEmail(raw: string): string {
- return raw.trim().toLowerCase();
-}
-
-function footer(): string {
- const addr = process.env.NEWSLETTER_MAILING_ADDRESS || "(mailing address pending)";
- const from = process.env.NEWSLETTER_FROM_NAME || "GovArbitrage Digest";
- return `—\n${from}\n${addr}`;
-}
-
-export function buildConfirmEmail(to: string, baseUrl: string, confirmToken: string): NewsletterEmail {
- const confirmUrl = `${baseUrl}/api/newsletter/confirm?token=${confirmToken}`;
- return {
- to,
- subject: "Confirm your GovArbitrage digest subscription",
- text: [
- "You (or someone using this address) asked to receive the GovArbitrage",
- "Top-10 government-surplus deals digest, sent twice daily (6am & 5pm PT).",
- "Confirm below and the next digest is yours.",
- "",
- `Confirm your subscription: ${confirmUrl}`,
- "",
- "If you didn't request this, ignore this email and you won't be subscribed.",
- "",
- footer(),
- ].join("\n"),
- };
-}
-
-export function buildUnsubscribeNoticeEmail(to: string): NewsletterEmail {
- return {
- to,
- subject: "You've been unsubscribed from the GovArbitrage digest",
- text: [
- "You've been unsubscribed and will receive no further digests.",
- "This was effective immediately — no login or confirmation was required.",
- "",
- footer(),
- ].join("\n"),
- };
-}
diff --git a/govarbitrage/src/lib/password.ts b/govarbitrage/src/lib/password.ts
deleted file mode 100644
index 7bb1bc7..0000000
--- a/govarbitrage/src/lib/password.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import crypto from "node:crypto";
-
-// Password hashing with Node's built-in scrypt — no native deps. Format:
-// "scrypt$<saltHex>$<derivedKeyHex>". Node-runtime only (login route).
-
-const KEYLEN = 64;
-
-export function hashPassword(password: string): string {
- const salt = crypto.randomBytes(16).toString("hex");
- const dk = crypto.scryptSync(password, salt, KEYLEN).toString("hex");
- return `scrypt$${salt}$${dk}`;
-}
-
-export function verifyPassword(password: string, stored: string): boolean {
- const parts = stored.split("$");
- if (parts.length !== 3 || parts[0] !== "scrypt") return false;
- const [, salt, dkHex] = parts;
- const expected = Buffer.from(dkHex, "hex");
- const actual = crypto.scryptSync(password, salt, KEYLEN);
- return expected.length === actual.length && crypto.timingSafeEqual(expected, actual);
-}
diff --git a/govarbitrage/src/lib/places.test.ts b/govarbitrage/src/lib/places.test.ts
deleted file mode 100644
index 2158bd4..0000000
--- a/govarbitrage/src/lib/places.test.ts
+++ /dev/null
@@ -1,538 +0,0 @@
-import { describe, expect, it } from "vitest";
-import {
- isCommercial,
- dedupeByContact,
- normalizePhone,
- normalizeHost,
- relevanceScore,
- type AgentResult,
- type RawPlace,
-} from "./places";
-
-// isCommercial() is the finder's core value prop: precision-first
-// commercial-vs-residential classification (the LA 57→28 verified drop).
-// These offline tests lock that behavior in — zero live Google Places billing,
-// per project rails. The apply order under test (see places.ts):
-// 1. off-topic Google type → DROP
-// 2. strong commercial name OR allowlisted brand → KEEP (beats residential)
-// 3. residential/irrelevant name → DROP
-// 4. residential-flavored type → DROP
-// 5/6. no commercial evidence → DROP (precision > recall)
-
-function place(name: string, types: string[] = ["real_estate_agency"]): RawPlace {
- return { id: "x", displayName: { text: name }, primaryType: types[0], types };
-}
-
-describe("isCommercial — KEEP on strong commercial name signals", () => {
- it.each([
- "Downtown Commercial Real Estate Brokers",
- "Metro CRE Advisors",
- "Industrial Property Group",
- "Prime Office Leasing",
- "Retail & Industrial Brokerage",
- "Apex Investment Sales",
- "Tenant Representation Partners",
- "Net Lease Advisors",
- "Summit Capital Markets",
- "Bay Area Multifamily Group",
- "Harbor Income Properties",
- ])("keeps %s", (name) => {
- expect(isCommercial(place(name))).toBe(true);
- });
-});
-
-describe("isCommercial — KEEP on allowlisted national brokerage brands", () => {
- it.each([
- "CBRE",
- "JLL Los Angeles",
- "Cushman & Wakefield",
- "Colliers International",
- "Marcus & Millichap",
- "Lee & Associates",
- "Newmark Group",
- "Avison Young",
- "Hughes Marino",
- "NAI Capital",
- ])("keeps brand %s", (name) => {
- expect(isCommercial(place(name))).toBe(true);
- });
-
- it("is case-insensitive on brand match", () => {
- expect(isCommercial(place("cbre commercial"))).toBe(true);
- expect(isCommercial(place("MARCUS AND MILLICHAP"))).toBe(true);
- });
-
- it("word-boundary matches brands — no substring over-match", () => {
- // A short brand like "voit" must not fire inside an unrelated word: a
- // residential "Savoit Home Realty" contains the substring "voit" but is
- // NOT the Voit brand and must drop (residential). The real brand still keeps.
- expect(isCommercial(place("Voit Real Estate Services"))).toBe(true);
- expect(isCommercial(place("Savoit Home Realty"))).toBe(false);
- expect(isCommercial(place("NAI Capital"))).toBe(true);
- // "nai" must not fire inside "domain"/"Sinai" (no word boundary).
- expect(isCommercial(place("Sinai Home Sales"))).toBe(false);
- });
-
- it("matches a multi-word brand across space/hyphen/dot separators", () => {
- // Google Places returns these two-word brands with varied separators; the
- // boundary match must not require a literal space between the words.
- expect(isCommercial(place("Jones-Lang LaSalle"))).toBe(true);
- expect(isCommercial(place("Avison-Young"))).toBe(true);
- expect(isCommercial(place("Kidder.Mathews"))).toBe(true);
- expect(isCommercial(place("Avison Young"))).toBe(true); // plain space still works
- });
-});
-
-describe("isCommercial — commercial evidence WINS over a residential word", () => {
- it("keeps a name carrying both commercial and residential signals", () => {
- // "commercial" (KEEP, step 2) is evaluated before "homes" (DROP, step 3).
- expect(isCommercial(place("Commercial & Home Sales Group"))).toBe(true);
- });
- it("keeps an allowlisted brand even next to a residential word", () => {
- expect(isCommercial(place("CBRE Residential Division"))).toBe(true);
- });
-});
-
-describe("isCommercial — DROP on residential / irrelevant names", () => {
- it.each([
- "John Smith, Realtor",
- "Dream Homes Realty",
- "Sunset Home Sales",
- "First-Time Buyer Specialists",
- "The Home Team",
- "Bluewater Property Management",
- "City Apartments Locators",
- "Acme Mortgage & Home Loans",
- "Luxury Condos of Malibu",
- "Single Family Realty Team",
- ])("drops %s", (name) => {
- expect(isCommercial(place(name))).toBe(false);
- });
-});
-
-describe("isCommercial — DROP residential firms rescued only by a generic token", () => {
- // Regression: COMMERCIAL_RE carries vertical-AMBIGUOUS tokens (brokerage/
- // advisors/leasing/investments) that appear in residential names too. The
- // commercial keep runs before the residential drop, so these were wrongly
- // KEPT as commercial brokers on the strength of the generic token alone.
- it.each([
- "Coldwell Banker Residential Brokerage", // "brokerage" only
- "Smith Residential Advisors", // "advisors" only
- "Apartment Homes Leasing", // "leasing" only, apartment locator
- "Hometown Residential Brokerage",
- "Family Home Realty Advisors",
- "Condo Leasing Specialists",
- ])("drops %s (no strong commercial token, no brand)", (name) => {
- expect(isCommercial(place(name))).toBe(false);
- });
-
- it("still KEEPS a strong commercial token next to a residential word", () => {
- expect(isCommercial(place("Commercial & Home Sales Group"))).toBe(true);
- expect(isCommercial(place("Office & Residential Brokerage"))).toBe(true); // "office" strong
- expect(isCommercial(place("Multifamily Apartment Advisors"))).toBe(true); // "multifamily" strong
- });
-
- it("still KEEPS an allowlisted brand next to a residential word", () => {
- expect(isCommercial(place("CBRE Residential"))).toBe(true);
- expect(isCommercial(place("Colliers Residential Brokerage"))).toBe(true);
- });
-});
-
-describe("isCommercial — DROP professional-practice offices (kept only by 'office' token)", () => {
- // "office" is a CRE asset-class token in COMMERCIAL_RE, so "Law Office of Smith"
- // was wrongly kept as a commercial broker. The "office OF <person>" structure
- // marks a practice; legit CRE "Office Building"/"Office Leasing" names have no "of".
- it.each([
- "Law Office of Smith & Associates",
- "Dental Office of Dr. Lee",
- "Medical Office of Dr. Patel",
- "Chiropractic Office of Dr. Kim",
- "Offices of Dr. Jane Doe",
- "Office of Attorney Robert Vance",
- ])("drops %s", (name) => {
- expect(isCommercial(place(name))).toBe(false);
- });
-
- it("does NOT over-drop legit commercial-RE office names (no 'of' structure)", () => {
- expect(isCommercial(place("Downtown Office Leasing Advisors"))).toBe(true);
- expect(isCommercial(place("Medical Office Building Advisors"))).toBe(true);
- expect(isCommercial(place("Suburban Office Properties Group"))).toBe(true);
- expect(isCommercial(place("Office & Industrial Brokerage"))).toBe(true);
- });
-
- it("does NOT mis-fire on 'Dr'-/'attorney'-prefixed surnames after 'Office of'", () => {
- // The "of dr" branch must require a boundary — "Drummond"/"Draper" are not "Dr.".
- expect(isCommercial(place("Office of Drummond Commercial Partners"))).toBe(true);
- expect(isCommercial(place("Office of Draper Industrial"))).toBe(true);
- // A real "Dr." / "Attorney" practice still drops.
- expect(isCommercial(place("Office of Dr. Chen Dental"))).toBe(false);
- expect(isCommercial(place("Office of Attorney Robert Vance"))).toBe(false);
- });
-});
-
-describe("isCommercial — DROP on generic / no-evidence real-estate results", () => {
- it("drops a plain real_estate_agency with no commercial signal", () => {
- // Precision-first: Google's real_estate_agency type can't confirm commercial.
- expect(isCommercial(place("Smith Real Estate"))).toBe(false);
- expect(isCommercial(place("Downtown Realty"))).toBe(false);
- });
- it("drops a non-real-estate result with no signal either way", () => {
- expect(isCommercial(place("Bob's Consulting", ["consultant"]))).toBe(false);
- });
-});
-
-describe("isCommercial — DROP on off-topic Google place types (regardless of name)", () => {
- it.each([
- ["The Maimon Group", "travel_agency"],
- ["Cozy Stays", "lodging"],
- ["Shield Insurance", "insurance_agency"],
- ["Two Guys Moving", "moving_company"],
- ["SecureBox Self Storage", "self_storage"],
- ["Mario's Restaurant", "restaurant"],
- ])("drops %s tagged %s", (name, type) => {
- expect(isCommercial(place(name, [type]))).toBe(false);
- });
-
- it("off-topic type beats an otherwise-commercial name", () => {
- // A travel_agency mis-tag on a 'commercial'-named place is still dropped.
- expect(isCommercial(place("Commercial Getaways", ["travel_agency"]))).toBe(false);
- });
-
- // Regression: Google place types are underscore-joined ("furniture_store"), and
- // "_" is a JS word char, so the old \bstore\b boundary NEVER fired inside them —
- // every compound retail/mall type with a commercial-sounding name leaked through
- // (an "Office Furniture Warehouse" tagged furniture_store was kept as a broker).
- // Now matched by exact type token + a "*_store" suffix rule.
- it.each([
- ["Office Furniture Warehouse", "furniture_store"],
- ["Commercial Hardware Supply", "hardware_store"],
- ["Downtown Office Depot", "office_supply_store"],
- ["Retail Plaza Shopping Mall", "shopping_mall"],
- ["Prime Electronics Outlet", "electronics_store"],
- ["Industrial Home Improvement Center", "home_improvement_store"],
- ["Commercial Auto Group", "car_dealer"],
- ["Office Legal Advisors", "lawyer"],
- ])("drops %s (compound off-topic type %s) despite a commercial-sounding name", (name, type) => {
- expect(isCommercial(place(name, [type]))).toBe(false);
- });
-
- it("catches an off-topic type buried in the secondary types array", () => {
- // primaryType is real_estate_agency but a furniture_store type is also present.
- expect(
- isCommercial({
- id: "x",
- displayName: { text: "Commercial Furnishings & Realty" },
- primaryType: "real_estate_agency",
- types: ["real_estate_agency", "furniture_store"],
- }),
- ).toBe(false);
- });
-
- it("does NOT over-drop a legit commercial real_estate_agency (no *_store false hit)", () => {
- expect(isCommercial(place("Commercial Real Estate Brokers", ["real_estate_agency"]))).toBe(true);
- });
-});
-
-// Regression: the "broker" and "finance" verticals overlap, so a Places text
-// search for "commercial real estate broker" surfaces WEALTH / FINANCIAL-
-// ADVISORY / securities firms. Their names carry finance-ambiguous tokens
-// ("investments", "advisors", "capital markets") that ALSO satisfy the generic
-// COMMERCIAL_RE keep — so before the fix, "Sterling Financial Advisors" and
-// "Vanguard Investment Advisors" were WRONGLY kept as CRE brokers. Now a
-// financial-advisory name with NO real-estate anchor is dropped, while a legit
-// CRE broker (which carries an RE anchor or an allowlisted brand) is preserved.
-describe("isCommercial — DROP on financial-advisory / wealth firms with no RE anchor", () => {
- it.each([
- "Morgan Stanley Wealth Investments",
- "Sterling Financial Advisors",
- "Vanguard Investment Advisors",
- "Edward Jones Investments",
- "Pinnacle Wealth Advisors",
- "Fidelity Asset Management",
- "Prudential Insurance Advisors",
- "Cornerstone Wealth Management",
- "Cambridge Investment Management",
- "Heritage Retirement Advisors",
- ])("drops finance firm %s (no real-estate anchor)", (name) => {
- expect(isCommercial(place(name))).toBe(false);
- });
-
- it.each([
- // A real-estate anchor rescues a finance-ambiguous name — these are real CRE.
- "Net Lease Advisors", // "net lease" + "leasing" anchor
- "Metro CRE Advisors", // "CRE" anchor
- "Apex Investment Sales", // "investment sales" is the CRE-specific phrase
- "Harbor Income Properties", // "properties" anchor
- "Commercial Real Estate Investment Advisors", // "real estate" anchor
- "Summit Capital Markets", // capital markets alone isn't a finance-drop token
- ])("keeps CRE broker %s despite a finance-ambiguous word", (name) => {
- expect(isCommercial(place(name))).toBe(true);
- });
-
- it("keeps an allowlisted CRE brand even when the name carries a finance word", () => {
- // Brand allowlist overrides the financial-advisory drop.
- expect(isCommercial(place("CBRE Investment Management"))).toBe(true);
- expect(isCommercial(place("JLL Capital Markets"))).toBe(true);
- });
-
- it("still keeps a plainly-commercial broker with no finance word at all", () => {
- // Guard against the finance gate over-reaching into ordinary CRE names.
- expect(isCommercial(place("Downtown Commercial Leasing"))).toBe(true);
- });
-});
-
-// CRE-adjacent SERVICE / trade false-positive gate. A Places "commercial real
-// estate broker" text search surfaces firms that WORK on commercial property but
-// are NOT buyer/leasing brokers — appraisers, title/escrow, construction, mortgage
-// lenders, inspectors, property/facilities managers. Their names carry the same
-// "commercial"/"property" tokens that satisfy COMMERCIAL_RE, so before the fix
-// "Commercial Property Appraisers" and "Sunbelt Commercial Construction" were
-// WRONGLY kept as brokers. Now a CRE-service name with NO explicit broker anchor
-// is dropped, while a real brokerage (broker anchor or allowlisted brand) — even
-// one with a valuation / property-management arm — is preserved.
-describe("isCommercial — DROP on CRE-adjacent service/trade firms with no broker anchor", () => {
- it.each([
- "Commercial Property Appraisers Inc",
- "Titan Commercial Title & Escrow",
- "Sunbelt Commercial Construction",
- "Meridian Commercial Property Management",
- "Apex Commercial Mortgage Capital",
- "National Commercial Property Inspections",
- "Green Commercial Environmental Services",
- "Premier Commercial Interior Design Group",
- "Statewide Commercial Escrow Services",
- "Metro Commercial Facilities Management",
- "Cornerstone Commercial Appraisal & Valuation",
- "Summit Commercial General Contractors",
- ])("drops CRE-service firm %s (no broker anchor)", (name) => {
- expect(isCommercial(place(name))).toBe(false);
- });
-
- it.each([
- // A broker anchor rescues a name that also mentions a service word.
- "Titan Commercial Real Estate Brokerage", // "brokerage" + "real estate"
- "Landmark Commercial Realty & Property Management", // "commercial realty" broker + PM arm
- "Apex Commercial Real Estate & Construction Advisors", // "real estate" anchor
- "Downtown Commercial Leasing", // "leasing" anchor, no service word
- "Net Lease Advisors", // pure broker, unaffected
- "Harbor Investment Sales", // "investment sales" anchor
- ])("keeps CRE broker %s despite (or without) a service word", (name) => {
- expect(isCommercial(place(name))).toBe(true);
- });
-
- it("keeps an allowlisted brand's valuation / management arm", () => {
- // Brand allowlist overrides the CRE-service drop.
- expect(isCommercial(place("Cushman & Wakefield Valuation Services"))).toBe(true);
- expect(isCommercial(place("CBRE Property Management"))).toBe(true);
- expect(isCommercial(place("Colliers Appraisal Group"))).toBe(true);
- });
-
- it("still keeps a plainly-commercial broker with no service word at all", () => {
- // Guard against the service gate over-reaching into ordinary CRE names.
- expect(isCommercial(place("Commercial Realty Advisors"))).toBe(true);
- expect(isCommercial(place("Downtown Commercial Real Estate Brokers"))).toBe(true);
- });
-});
-
-describe("isCommercial — DROP on residential-flavored place types", () => {
- it.each(["apartment_complex", "home_goods_store"])("drops type %s with no commercial name", (type) => {
- expect(isCommercial(place("Parkview", [type]))).toBe(false);
- });
- it("commercial name still wins over a residential-flavored type", () => {
- expect(isCommercial(place("Commercial Leasing at Parkview", ["apartment_complex"]))).toBe(true);
- });
-});
-
-describe("isCommercial — edge cases", () => {
- it("drops a place with no name", () => {
- expect(isCommercial({ id: "x", displayName: { text: "" }, types: ["real_estate_agency"] })).toBe(false);
- });
- it("drops a place with no types and no commercial name", () => {
- expect(isCommercial({ id: "x", displayName: { text: "Generic Agency" } })).toBe(false);
- });
-});
-
-// --- Contact-based dedupe -------------------------------------------------
-// dedupeByContact() collapses the same office surfaced under multiple lenses as
-// different place ids. Phone is authoritative; website only merges when phones
-// don't contradict (national brands share one domain across many branches).
-// Offline + deterministic — zero live Google Places billing.
-
-describe("normalizePhone", () => {
- it.each([
- ["(213) 555-0123", "2135550123"],
- ["213-555-0123", "2135550123"],
- ["+1 213 555 0123", "2135550123"],
- ["1 (213) 555-0123", "2135550123"],
- ])("normalizes %s → %s", (input, expected) => {
- expect(normalizePhone(input)).toBe(expected);
- });
- it("returns null for null / partial / non-10-digit numbers", () => {
- expect(normalizePhone(null)).toBeNull();
- expect(normalizePhone("555-0123")).toBeNull(); // 7 digits — not keyable
- expect(normalizePhone("")).toBeNull();
- });
-});
-
-describe("normalizeHost", () => {
- it.each([
- ["https://www.cbre.com/office/la", "cbre.com"],
- ["http://CBRE.com", "cbre.com"],
- ["https://la.cbre.com", "la.cbre.com"], // subdomains stay distinct (precise)
- ])("normalizes %s → %s", (input, expected) => {
- expect(normalizeHost(input)).toBe(expected);
- });
- it("returns null for null / unparseable", () => {
- expect(normalizeHost(null)).toBeNull();
- expect(normalizeHost("not a url")).toBeNull();
- });
-});
-
-function agent(over: Partial<AgentResult> & { id: string; name: string }): AgentResult {
- return {
- address: null,
- rating: null,
- reviews: 0,
- phone: null,
- website: null,
- mapsUrl: null,
- primaryType: null,
- kinds: ["buyer"],
- ...over,
- };
-}
-
-describe("dedupeByContact", () => {
- it("collapses the same office surfaced under two lenses (same phone)", () => {
- // The motivating case: "CBRE" + "CBRE Investment Sales", same office/phone,
- // two different place ids from two different query lenses.
- const out = dedupeByContact([
- agent({ id: "1", name: "CBRE", phone: "(213) 555-0100", reviews: 40, rating: 4.5, kinds: ["buyer"] }),
- agent({
- id: "2",
- name: "CBRE Investment Sales",
- phone: "213-555-0100",
- reviews: 3,
- rating: 4.9,
- kinds: ["leasing"],
- }),
- ]);
- expect(out).toHaveLength(1);
- expect(out[0].id).toBe("1"); // first-seen kept canonical
- expect(out[0].kinds.sort()).toEqual(["buyer", "leasing"]); // kinds unioned
- // Richer rating/review pair adopted from the MORE-rated listing (id 1).
- expect(out[0].reviews).toBe(40);
- expect(out[0].rating).toBe(4.5);
- });
-
- it("keeps two DIFFERENT branch offices of one brand (same domain, different phones)", () => {
- const out = dedupeByContact([
- agent({ id: "1", name: "CBRE Downtown", phone: "213-555-0100", website: "https://www.cbre.com" }),
- agent({ id: "2", name: "CBRE West LA", phone: "310-555-0200", website: "https://www.cbre.com" }),
- ]);
- expect(out).toHaveLength(2); // distinct phones ⇒ distinct offices, never merged
- });
-
- it("merges on website only when phones don't contradict (one side phone-less)", () => {
- const out = dedupeByContact([
- agent({ id: "1", name: "JLL", phone: "213-555-0300", website: "https://jll.com" }),
- agent({ id: "2", name: "JLL Capital Markets", phone: null, website: "https://jll.com" }),
- ]);
- expect(out).toHaveLength(1);
- expect(out[0].id).toBe("1");
- });
-
- it("enriches the canonical's missing contact fields from the duplicate", () => {
- const out = dedupeByContact([
- agent({ id: "1", name: "Colliers", phone: "213-555-0400", website: null, address: null }),
- agent({
- id: "2",
- name: "Colliers Intl",
- phone: "213-555-0400",
- website: "https://colliers.com",
- address: "1 Main St",
- }),
- ]);
- expect(out).toHaveLength(1);
- expect(out[0].website).toBe("https://colliers.com"); // filled from dup
- expect(out[0].address).toBe("1 Main St"); // filled from dup
- });
-
- it("leaves genuinely distinct agencies untouched (no shared phone or host)", () => {
- const out = dedupeByContact([
- agent({ id: "1", name: "Newmark", phone: "213-555-0500", website: "https://nmrk.com" }),
- agent({ id: "2", name: "Kidder Mathews", phone: "206-555-0600", website: "https://kidder.com" }),
- ]);
- expect(out).toHaveLength(2);
- });
-
- it("does not merge two phone-distinct entries that lack websites", () => {
- const out = dedupeByContact([
- agent({ id: "1", name: "Lee & Associates", phone: "213-555-0700" }),
- agent({ id: "2", name: "Avison Young", phone: "213-555-0800" }),
- ]);
- expect(out).toHaveLength(2);
- });
-});
-
-// relevanceScore() weights the RANKED list so a stronger CRE-broker match
-// (national brand / strong commercial name / surfaced by both lenses) surfaces
-// ahead of a weakly-commercial one at comparable rating-weight — without a
-// 0-review brand leapfrogging a genuinely reviewed office. Offline, no billing.
-describe("relevanceScore", () => {
- it("returns the 1.0 baseline for a plain commercial listing", () => {
- // No allowlisted brand, no strong COMMERCIAL_RE hit in the name, one lens.
- expect(relevanceScore(agent({ id: "x", name: "Downtown Advisory" }))).toBeCloseTo(1.0);
- });
-
- it("adds weight for an allowlisted national brokerage brand", () => {
- const s = relevanceScore(agent({ id: "x", name: "CBRE", kinds: ["buyer"] }));
- expect(s).toBeGreaterThan(1.0);
- // CBRE hits the brand bonus (+0.3) AND "commercial"? no — name is bare "CBRE"
- // so only the brand bonus applies.
- expect(s).toBeCloseTo(1.3);
- });
-
- it("adds weight for a strong commercial name signal", () => {
- // "Industrial Property Group" hits COMMERCIAL_RE but is not an allowlist brand.
- expect(relevanceScore(agent({ id: "x", name: "Industrial Property Group" }))).toBeCloseTo(1.2);
- });
-
- it("adds weight when surfaced by BOTH the buyer and leasing lenses", () => {
- const both = relevanceScore(agent({ id: "x", name: "Anon Realty", kinds: ["buyer", "leasing"] }));
- const one = relevanceScore(agent({ id: "x", name: "Anon Realty", kinds: ["buyer"] }));
- expect(both - one).toBeCloseTo(0.1);
- });
-
- it("stacks signals (brand + commercial name + both lenses) up to the bound", () => {
- const s = relevanceScore(
- agent({ id: "x", name: "CBRE Commercial", kinds: ["buyer", "leasing"] }),
- );
- // +0.3 brand +0.2 commercial-name +0.1 both-lenses = 1.6 ceiling.
- expect(s).toBeCloseTo(1.6);
- });
-});
-
-// The ranking must PROMOTE a stronger commercial match at comparable
-// rating-weight, but a zero-review brand must NOT jump a genuinely reviewed
-// office. dedupeByContact is a pass-through here (distinct contacts), so we can
-// assert ordering behavior on the same sort comparator via a tiny local sort
-// mirroring searchCommercialAgents (kept in sync with places.ts).
-describe("relevance-weighted ranking behavior", () => {
- const rankWeight = (r: AgentResult) =>
- (r.rating ?? 0) * Math.log((r.reviews ?? 0) + 1) * relevanceScore(r);
-
- it("promotes a stronger CRE match over a weakly-commercial one at equal rating/reviews", () => {
- const brand = agent({ id: "1", name: "CBRE", rating: 4.5, reviews: 30, kinds: ["buyer", "leasing"] });
- const weak = agent({ id: "2", name: "Anon Advisory", rating: 4.5, reviews: 30, kinds: ["buyer"] });
- expect(rankWeight(brand)).toBeGreaterThan(rankWeight(weak));
- });
-
- it("does NOT let a zero-review brand leapfrog a well-reviewed office", () => {
- const brandNoReviews = agent({ id: "1", name: "CBRE", rating: 5, reviews: 0, kinds: ["buyer", "leasing"] });
- const reviewedOffice = agent({ id: "2", name: "Metro Advisory", rating: 4.2, reviews: 120, kinds: ["buyer"] });
- // rating × log(1) = 0 for the brand regardless of relevance multiplier.
- expect(rankWeight(brandNoReviews)).toBe(0);
- expect(rankWeight(reviewedOffice)).toBeGreaterThan(rankWeight(brandNoReviews));
- });
-});
diff --git a/govarbitrage/src/lib/places.ts b/govarbitrage/src/lib/places.ts
deleted file mode 100644
index 9f339b9..0000000
--- a/govarbitrage/src/lib/places.ts
+++ /dev/null
@@ -1,634 +0,0 @@
-// Google Places API (New) — Text Search for COMMERCIAL real-estate professionals
-// near a government-surplus property: buyer / acquisition brokers + leasing agents.
-//
-// Commercial-only by construction: the text queries target commercial CRE, and a
-// light residential filter drops obvious home-sale / apartment-locator results
-// ("just commercial for this build"). Server-side ONLY — the API key never reaches
-// the client. Live-query with `no-store`; we don't persist Google place data beyond
-// the response (Places ToS: no long-term caching of place fields except the id).
-
-export type AgentKind = "buyer" | "leasing";
-
-export interface AgentResult {
- id: string;
- name: string;
- address: string | null;
- rating: number | null;
- reviews: number;
- phone: string | null;
- website: string | null;
- mapsUrl: string | null;
- primaryType: string | null;
- kinds: AgentKind[]; // which query lens(es) surfaced it
-}
-
-export interface CommercialAgentSearch {
- city?: string;
- state?: string;
- zip?: string;
- kinds: AgentKind[];
-}
-
-export interface CommercialAgentResponse {
- location: string;
- kinds: AgentKind[];
- results: AgentResult[];
- queries: number; // billed Places Text Search calls (for cost surfacing)
-}
-
-const ENDPOINT = "https://places.googleapis.com/v1/places:searchText";
-const FIELD_MASK = [
- "places.id",
- "places.displayName",
- "places.formattedAddress",
- "places.rating",
- "places.userRatingCount",
- "places.nationalPhoneNumber",
- "places.websiteUri",
- "places.googleMapsUri",
- "places.businessStatus",
- "places.primaryTypeDisplayName",
- "places.types",
- "places.primaryType",
-].join(",");
-
-// Curated query "lenses" per kind — a small set (≤3) of complementary CRE
-// angles that widen coverage without ballooning cost. Each lens is one billed
-// Places Text Search call; results are unioned across lenses by place id.
-const KIND_LENSES: Record<AgentKind, string[]> = {
- buyer: [
- "commercial real estate broker",
- "commercial real estate investment sales broker",
- "tenant representation broker",
- ],
- leasing: [
- "commercial real estate leasing agent",
- "office space leasing broker",
- "retail industrial leasing broker",
- ],
-};
-
-// Positive COMMERCIAL name evidence — the primary "keep" gate. A real-estate
-// result is only kept if it carries one of these strong commercial signals (or
-// an allowlisted brokerage brand, below). "office"/"retail"/"industrial" are
-// asset-class words that reliably read commercial in a broker name; "leasing"
-// stays because our query lenses are commercial-leasing lenses.
-const COMMERCIAL_RE =
- /\b(commercial|CRE|industrial|retail|office|investment\s+sales|investments?|tenant\s+rep(?:resentation)?|net\s+lease|leasing|brokerage|advisors?|capital\s+markets|properties\s+group|commercial\s+properties|multifamily|commercial\s+group|income\s+propert(?:y|ies))\b/i;
-
-// STRONG (vertical-UNAMBIGUOUS) commercial tokens — the subset of COMMERCIAL_RE
-// that reads commercial-only. It deliberately EXCLUDES the vertical-ambiguous
-// generics that appear just as often in residential firm names — "brokerage",
-// "advisors", "leasing", "investments" — because a residential firm is a
-// "brokerage" with "advisors" doing "leasing" too. Used by the residential gate
-// below so an explicit residential name isn't rescued by a generic token alone.
-const STRONG_COMMERCIAL_RE =
- /\b(commercial|CRE|industrial|retail|office|investment\s+sales|tenant\s+rep(?:resentation)?|net\s+lease|capital\s+markets|properties\s+group|commercial\s+properties|multifamily|commercial\s+group|income\s+propert(?:y|ies))\b/i;
-
-// Known national / regional COMMERCIAL brokerage brands. Case-insensitive
-// substring match — presence of any of these keeps the result outright, on par
-// with a strong commercial name signal (and ahead of the residential drop).
-const COMMERCIAL_BRANDS: string[] = [
- "cbre",
- "jll",
- "jones lang",
- "cushman",
- "wakefield",
- "colliers",
- "newmark",
- "marcus & millichap",
- "marcus and millichap",
- "kidder mathews",
- "lee & associates",
- "lee and associates",
- "avison young",
- "savills",
- "matthews real estate",
- "stan johnson",
- "northmarq",
- "berkadia",
- "institutional property advisors",
- "voit",
- "daum",
- "nai ",
- "nai capital",
- "cresa",
- "transwestern",
- "stream realty",
- "hughes marino",
-];
-
-// RESIDENTIAL / irrelevant name signals — drop UNLESS a commercial signal or an
-// allowlisted brand overrides (apply order enforced in isCommercial). Kept
-// word-boundary aware so "homes" hits "Earnest Homes" but the standalone-noun
-// senses don't over-match. Generic "realty"/"real estate" with no commercial
-// evidence is handled by the positive-gate default-drop, not here.
-const RESIDENTIAL_RE =
- /\b(residential|homes?|home\s+sales?|for\s+sale|realtor|property\s+m(?:anage|gmt)ment|apartments?|condos?|single\s+family|first[-\s]?time|home\s+team|realty\s+team|real\s+estate\s+team|mortgage|home\s+loans?)\b/i;
-
-// Places `types` signals. `real_estate_agency` is the generic real-estate type
-// (does NOT distinguish commercial vs residential — name text decides).
-const REAL_ESTATE_TYPES = new Set(["real_estate_agency"]);
-
-// Off-vertical / off-topic Google place types — drop on match regardless of
-// name. "The Maimon Group" came back as travel_agency; storage/lodging/moving/
-// insurance are common mis-tags that are never a commercial broker.
-//
-// Matched by EXACT type-token equality (not a \b-regex): Google's place types
-// are underscore-joined tokens (e.g. "furniture_store"), and "_" is a JS word
-// character, so a \bstore\b boundary never fires inside "furniture_store" —
-// it silently let every "*_store" / "shopping_mall" / etc. type through. Any
-// type ending in "_store" is also treated as off-topic (Places has dozens of
-// retail *_store subtypes: hardware_store, electronics_store, furniture_store…).
-const OFF_TOPIC_TYPES = new Set([
- "travel_agency",
- "lodging",
- "insurance_agency",
- "moving_company",
- "storage",
- "self_storage",
- "restaurant",
- "food",
- "store",
- "school",
- "hospital",
- "gym",
- "shopping_mall",
- "finance", // banks/lenders mis-tagged onto RE queries — not a broker
- "lawyer",
- "accounting",
- "car_dealer",
- "car_rental",
- "general_contractor",
- "home_improvement_store",
-]);
-
-function isOffTopicType(t: string): boolean {
- const tt = t.toLowerCase();
- return OFF_TOPIC_TYPES.has(tt) || tt.endsWith("_store");
-}
-
-// Residential-flavored place types — exact-token match (same underscore-boundary
-// reason as above). Complements the off-topic blocklist for apartment/home mis-tags.
-const RESIDENTIAL_TYPES = new Set(["apartment_complex", "home_goods_store"]);
-
-// FINANCIAL-ADVISORY / wealth / securities name signals — the "broker" and
-// "finance" verticals overlap, so a Places text search for "commercial real
-// estate broker" reliably surfaces wealth-management, financial-advisory and
-// securities firms. Google's `finance` type-gate only catches the ones Google
-// explicitly tagged finance; many advisory firms come back tagged
-// `establishment`/`point_of_interest` and slip past it. These names carry the
-// finance-ambiguous tokens ("investments", "advisors", "capital markets") that
-// ALSO appear in legit CRE names, so a firm matching this is dropped UNLESS it
-// also carries an unambiguous real-estate anchor (RE_ANCHOR_RE, below).
-// Note: "investment sales" is a CRE-specific phrase and is EXCLUDED here (it's a
-// real-estate anchor, below) — only bare "investment(s)" / "investment advisors"
-// (with no RE anchor) reads as a wealth firm. The negative lookahead on
-// "investment" avoids matching "investment sales".
-const FINANCIAL_ADVISORY_RE =
- /\b(wealth|financial\s+advisors?|financial\s+planning|financial\s+services|financial\s+group|securities|asset\s+management|wealth\s+management|investment\s+management|investment\s+advisors?|investments?(?!\s+sales)|private\s+equity|hedge\s+fund|insurance|retirement|portfolio\s+management|mutual\s+funds?|stockbrokers?|401k?)\b/i;
-
-// Unambiguous REAL-ESTATE anchor words. Presence of one proves a
-// finance-ambiguous name (e.g. "Investment Sales Advisors") is genuinely a
-// commercial-RE broker and not a wealth firm, so it survives the financial-
-// advisory drop. "real estate" / "realty" / "property/properties" / "leasing"
-// are the reliable RE anchors; "CRE" and "commercial real estate" too.
-const RE_ANCHOR_RE =
- /\b(real\s+estate|realty|CRE|propert(?:y|ies)|leasing|net\s+lease|tenant\s+rep(?:resentation)?|multifamily|land\s+brokerage|investment\s+sales|commercial)\b/i;
-
-// CRE-ADJACENT SERVICE / TRADE name signals — firms that WORK on commercial
-// property but are NOT buyer/leasing brokers: appraisal/valuation, title &
-// escrow, construction & general contracting, mortgage lending / loan servicing,
-// property inspection, environmental, interior design, architecture/engineering,
-// surveying, facilities & property management, and the trades (roofing/HVAC/…).
-// A Places "commercial real estate broker" text search surfaces these because
-// their names carry the same "commercial"/"property" asset-class tokens that
-// satisfy COMMERCIAL_RE (e.g. "Commercial Property Appraisers", "Sunbelt
-// Commercial Construction", "Apex Commercial Mortgage Capital"), so they'd
-// otherwise be kept as brokers and pollute the "brokers near this property"
-// answer. This is distinct from the FINANCIAL_ADVISORY drop (wealth/securities
-// firms) and from the off-topic Google-`types` drop (retail/mall mis-tags): here
-// the NAME itself reads commercial-RE, but the firm is a CRE trade/service, not a
-// brokerage. Dropped UNLESS the name ALSO carries an explicit broker anchor
-// (BROKER_ANCHOR_RE) or an allowlisted brokerage brand — a full-service
-// brokerage that happens to run a valuation / property-management arm survives.
-const CRE_SERVICE_RE =
- /\b(appraisals?|appraisers?|valuations?|title(?:\s+(?:company|services|insurance|&\s+escrow))?|escrow|construction|general\s+contract(?:or|ing)|contractors?|mortgage(?!\s+broker)|lending|lenders?|loan\s+servicing|inspections?|inspectors?|environmental|interior\s+design|architects?|architecture|engineering|surveyors?|surveying|janitorial|cleaning|landscaping|roofing|hvac|plumbing|restoration|property\s+tax|facilit(?:y|ies)\s+m(?:anage|gmt)ment|property\s+m(?:anage|gmt)ment)\b/i;
-
-// Explicit BROKER anchor — proves the firm actually does brokerage even if its
-// name also mentions a service word (e.g. a "Realty & Property Management" firm
-// or a "Real Estate & Construction Advisors" brokerage). Presence of one of
-// these overrides the CRE-service drop and keeps the listing.
-const BROKER_ANCHOR_RE =
- /\b(brokers?|brokerage|realty|real\s+estate|leasing|tenant\s+rep(?:resentation)?|investment\s+sales|net\s+lease|realtors?)\b/i;
-
-// Word-boundary match each brand rather than a bare substring: a plain
-// `name.includes("voit")` also fires inside unrelated words ("Savoit Home
-// Realty" → wrongly treated as the Voit brand, then kept as commercial), and
-// short brands (voit/daum/nai) are the ones most prone to it. A `\bBRAND\b`
-// test keeps "Voit Real Estate" while rejecting "Savoit…". Brand strings are
-// regex-escaped and trimmed (the legacy "nai " trailing-space guard is now
-// redundant — `\bnai\b` already won't fire inside "domain"/"Sinai").
-// Professional PRACTICE office — a law / dental / medical / chiropractic / … firm
-// named "<practice> Office of …" or "Office(s) of Dr./Attorney …". NOT a CRE
-// broker: "office" is a CRE asset-class token in COMMERCIAL_RE, so "Law Office of
-// Smith & Associates" was kept as a commercial broker. The reliable giveaway is
-// the "office OF <person/Dr./attorney>" structure — a practice names itself
-// "Office of Dr. Lee", whereas a CRE firm says "Medical Office BUILDING Advisors"
-// or "Office LEASING Group" (no "of" after "office"). Deliberately narrow (requires
-// the "of" preposition) so it does NOT touch legit CRE office names. An allowlisted
-// brand or explicit broker anchor overrides.
-const PROFESSIONAL_OFFICE_RE =
- /\b(?:law|dental|medical|chiropractic|veterinary|optometry|accounting|dermatolog\w*|orthodont\w*|podiatr\w*|pediatric|psychiatr\w*|counsel(?:ing|ling))\s+offices?\s+of\b|\boffices?\s+of\s+(?:drs?\.?\b|attorney\b|the\s+law\b)/i;
-
-function isProfessionalPracticeOffice(name: string): boolean {
- return (
- PROFESSIONAL_OFFICE_RE.test(name) &&
- !BROKER_ANCHOR_RE.test(name) &&
- !hasCommercialBrand(name)
- );
-}
-
-function hasCommercialBrand(name: string): boolean {
- const n = name.toLowerCase();
- return COMMERCIAL_BRANDS.some((b) => {
- const esc = b.trim().replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
- // A multi-word brand ("jones lang", "avison young") appears in real Google
- // Places names with a space, hyphen, or dot separator ("Jones-Lang LaSalle",
- // "Avison-Young"). Match any of those between words so the boundary fix
- // doesn't trade the substring over-match bug for a separator-rigidity miss.
- const pat = esc.replace(/ /g, "[\\s\\-.]");
- return new RegExp(`\\b${pat}\\b`, "i").test(n);
- });
-}
-
-// True when the name reads as a CRE-adjacent SERVICE / trade firm (appraisal,
-// title/escrow, construction, mortgage lending, inspection, property/facilities
-// management, …) that carries NO explicit broker anchor — i.e. a service
-// false-positive we must drop even though its "commercial"/"property" tokens
-// would otherwise satisfy COMMERCIAL_RE. An allowlisted brokerage brand always
-// overrides (a real brokerage's valuation / PM arm stays).
-function isCreServiceNoBroker(name: string): boolean {
- return (
- CRE_SERVICE_RE.test(name) &&
- !BROKER_ANCHOR_RE.test(name) &&
- !hasCommercialBrand(name)
- );
-}
-
-// True when the name reads as a financial-advisory / wealth firm that lacks a
-// real-estate anchor — i.e. a finance false-positive we must drop even though a
-// bare finance-ambiguous token (investments/advisors/capital markets) would
-// otherwise satisfy COMMERCIAL_RE. An allowlisted CRE brand always overrides
-// (a real brokerage that happens to include "insurance" etc. in its name stays).
-function isFinancialAdvisoryNoRE(name: string): boolean {
- return (
- FINANCIAL_ADVISORY_RE.test(name) &&
- !RE_ANCHOR_RE.test(name) &&
- !hasCommercialBrand(name)
- );
-}
-
-// True when the name carries an EXPLICIT residential signal (residential/homes/
-// apartments/realtor/…) and its only "commercial" evidence is a vertical-
-// AMBIGUOUS generic token (brokerage / advisors / leasing / investments) — i.e.
-// no STRONG (commercial-only) token and no allowlisted brand. This is the
-// residential mirror of the finance/service gates: without it, the positive
-// keep (COMMERCIAL_RE) short-circuits before the residential drop, so a plain
-// residential firm like "Coldwell Banker Residential Brokerage" or "Smith
-// Residential Advisors" is wrongly kept as a commercial broker on the strength
-// of "brokerage"/"advisors" alone. A strong commercial token ("Commercial &
-// Home Sales Group") or an allowlisted brand ("CBRE Residential") still wins.
-function isResidentialDespiteGeneric(name: string): boolean {
- return (
- RESIDENTIAL_RE.test(name) &&
- !STRONG_COMMERCIAL_RE.test(name) &&
- !hasCommercialBrand(name)
- );
-}
-
-// --- Commercial-relevance ranking weight ----------------------------------
-// Every result in the ranked list has ALREADY passed isCommercial() (precision
-// gate), but they're not equally strong CRE-broker matches. A listing that is
-// an allowlisted national brokerage AND was surfaced by BOTH the buyer- and
-// leasing-lenses is a far more confident "commercial broker near this property"
-// answer than a lone generic result that only just cleared the commercial name
-// gate. The old ranking (pure rating × log(reviews)) ignored this entirely, so
-// a highly-rated but weakly-commercial listing outranked a two-lens national
-// brokerage with modest reviews.
-//
-// relevanceScore() returns a small multiplier (1.0 baseline → up to ~1.6) that
-// nudges stronger CRE matches upward. It's deliberately BOUNDED and multiplied
-// into the existing rating-weight so it re-orders near-comparable results and
-// breaks near-ties in favor of the better commercial match — WITHOUT letting a
-// zero-review brand leapfrog a genuinely well-reviewed office (a 0-review brand
-// still scores rating×log(1)=0 and stays below any reviewed listing). Pure +
-// deterministic; unit-tested offline with zero live Places billing.
-export function relevanceScore(r: AgentResult): number {
- let s = 1;
- // Allowlisted national/regional brokerage brand → the most confident signal.
- if (hasCommercialBrand(r.name)) s += 0.3;
- // Strong commercial name evidence (CRE/industrial/office/investment sales…).
- if (COMMERCIAL_RE.test(r.name)) s += 0.2;
- // Surfaced by BOTH the buyer- and leasing-lens → broader CRE relevance.
- if (r.kinds.includes("buyer") && r.kinds.includes("leasing")) s += 0.1;
- return s;
-}
-
-// --- Contact-based dedupe -------------------------------------------------
-// Google Places returns the SAME physical brokerage office under several of our
-// query lenses as DIFFERENT place ids (e.g. "CBRE" from the buyer lens and
-// "CBRE Investment Sales" from the investment-sales lens). Place-id union alone
-// can't collapse those, so we add a precision-first second pass:
-//
-// • PHONE is the authoritative per-office identity — one number rings one
-// desk. Same normalized phone ⇒ same office ⇒ merge.
-// • WEBSITE is a WEAKER signal: national brands share ONE domain across every
-// branch (all CBRE offices are cbre.com). So a website match only merges
-// when the phones DON'T contradict (at least one side is phone-less, or the
-// phones are equal). Two same-domain entries with two DIFFERENT phones are
-// two real branch offices and are kept apart.
-
-// Normalize a US phone to its 10 significant digits, or null if it isn't a
-// usable 10-digit number (precision-first: never key a merge on partial digits).
-export function normalizePhone(phone: string | null): string | null {
- if (!phone) return null;
- let d = phone.replace(/\D+/g, "");
- if (d.length === 11 && d.startsWith("1")) d = d.slice(1);
- return d.length === 10 ? d : null;
-}
-
-// Normalize a website to its lowercased host without a leading "www.", or null
-// if it doesn't parse. Full host (not just registrable domain) keeps it precise:
-// a duplicate of the same office carries the identical URL, so it still matches.
-export function normalizeHost(website: string | null): string | null {
- if (!website) return null;
- try {
- const h = new URL(website).hostname.toLowerCase().replace(/^www\./, "");
- return h || null;
- } catch {
- return null;
- }
-}
-
-// Collapse near-identical listings that are the same office surfaced twice.
-// Keeps the first-seen record as canonical (preserving the ranked insertion
-// order), unions its `kinds`, adopts the richer rating/review pair, and fills
-// any missing contact fields from the duplicate. Pure + deterministic — no I/O,
-// so it's unit-tested offline with zero live Places billing.
-export function dedupeByContact(results: AgentResult[]): AgentResult[] {
- const canon: AgentResult[] = [];
- const byPhone = new Map<string, AgentResult>();
- const byHost = new Map<string, AgentResult>();
-
- const merge = (into: AgentResult, dup: AgentResult) => {
- for (const k of dup.kinds) if (!into.kinds.includes(k)) into.kinds.push(k);
- // Adopt the more-rated listing's rating/review pair (don't double-count).
- if (dup.reviews > into.reviews) {
- into.rating = dup.rating;
- into.reviews = dup.reviews;
- }
- into.address ??= dup.address;
- into.phone ??= dup.phone;
- into.website ??= dup.website;
- into.primaryType ??= dup.primaryType;
- into.mapsUrl ??= dup.mapsUrl;
- // Register any contact key the canonical only just adopted from the dup.
- const p = normalizePhone(into.phone);
- if (p) byPhone.set(p, into);
- const h = normalizeHost(into.website);
- if (h && !byHost.has(h)) byHost.set(h, into);
- };
-
- for (const r of results) {
- const p = normalizePhone(r.phone);
- const h = normalizeHost(r.website);
-
- // 1. Same phone ⇒ same office (authoritative).
- if (p && byPhone.has(p)) {
- merge(byPhone.get(p)!, r);
- continue;
- }
- // 2. Same website ⇒ merge ONLY when phones don't prove they're different
- // offices (national brands share one domain across many branches).
- if (h && byHost.has(h)) {
- const c = byHost.get(h)!;
- const cp = normalizePhone(c.phone);
- if (!p || !cp || p === cp) {
- merge(c, r);
- continue;
- }
- }
- // New canonical office.
- canon.push(r);
- if (p) byPhone.set(p, r);
- if (h && !byHost.has(h)) byHost.set(h, r);
- }
- return canon;
-}
-
-export interface RawPlace {
- id?: string;
- displayName?: { text?: string };
- formattedAddress?: string;
- rating?: number;
- userRatingCount?: number;
- nationalPhoneNumber?: string;
- websiteUri?: string;
- googleMapsUri?: string;
- businessStatus?: string;
- primaryTypeDisplayName?: { text?: string };
- primaryType?: string;
- types?: string[];
-}
-
-function locationString(city?: string, state?: string, zip?: string): string {
- return [city?.trim(), state?.trim(), zip?.trim()].filter(Boolean).join(", ");
-}
-
-// Precision-first commercial classifier. Google's `real_estate_agency` type does
-// NOT distinguish commercial from residential, so we REQUIRE positive commercial
-// evidence (a strong name signal or an allowlisted brokerage brand) to keep a
-// result, instead of defaulting to keep. Apply order:
-// 1. Off-topic Google type (travel/lodging/storage/…) → DROP regardless.
-// 2. Financial-advisory / wealth firm WITHOUT a real-estate anchor → DROP.
-// (Runs before the commercial keep because finance names carry ambiguous
-// "investments"/"advisors"/"capital markets" tokens that would otherwise
-// satisfy COMMERCIAL_RE — e.g. "Sterling Financial Advisors" is a wealth
-// firm, not a CRE broker. An allowlisted CRE brand overrides this.)
-// 3. CRE-adjacent SERVICE / trade firm WITHOUT an explicit broker anchor →
-// DROP. (Also runs before the commercial keep: appraisal/title/escrow/
-// construction/mortgage-lending/property-management names carry
-// "commercial"/"property" tokens that satisfy COMMERCIAL_RE but are NOT
-// brokers — e.g. "Sunbelt Commercial Construction". Broker anchor or brand
-// overrides.)
-// 3.5 Explicit RESIDENTIAL name whose only commercial evidence is a vertical-
-// AMBIGUOUS generic token (brokerage/advisors/leasing/investments) → DROP.
-// Runs before the positive keep so a residential firm ("Coldwell Banker
-// Residential Brokerage") isn't rescued by "brokerage" alone. A STRONG
-// commercial token or an allowlisted brand overrides.
-// 3.6 Professional PRACTICE office ("Law/Dental/Medical Office OF Dr. …") →
-// DROP. "office" is a CRE asset-class token that would otherwise keep it;
-// the "office of <person>" structure marks a practice, not a broker.
-// Narrow (requires the "of") so legit "Office Building"/"Office Leasing"
-// CRE names are untouched. Broker anchor or brand overrides.
-// 4. Strong commercial name signal OR allowlisted brand → KEEP (wins over
-// any residential signal, e.g. "Commercial Realty Advisors").
-// 5. Residential / irrelevant name signal → DROP.
-// 6. Residential-flavored place type → DROP.
-// 7. Generic real-estate result with no commercial evidence → DROP.
-// 8. Non-real-estate result with no signal either way → DROP (nothing kept it).
-export function isCommercial(p: RawPlace): boolean {
- const name = p.displayName?.text ?? "";
- const types = [p.primaryType ?? "", ...(p.types ?? [])];
-
- // 1. Off-vertical place type → drop outright (catches the travel_agency mis-tag
- // AND every underscore-compound retail type like furniture_store/shopping_mall).
- if (types.some((t) => isOffTopicType(t))) return false;
-
- const hasResidentialType = types.some((t) => RESIDENTIAL_TYPES.has(t.toLowerCase()));
-
- // 2. Financial-advisory / wealth / securities firm with no real-estate anchor →
- // drop. Guards against the broker↔finance vertical overlap that surfaces
- // wealth firms on a "commercial real estate broker" text search.
- if (isFinancialAdvisoryNoRE(name)) return false;
-
- // 3. CRE-adjacent SERVICE / trade firm with no explicit broker anchor → drop.
- // Catches appraisal/title/escrow/construction/mortgage-lending/inspection/
- // property-management firms whose "commercial"/"property" tokens satisfy
- // COMMERCIAL_RE but which are NOT buyer/leasing brokers. Runs before the
- // positive keep for the same reason as the finance gate. An allowlisted
- // brand or a broker anchor in the name overrides (handled inside).
- if (isCreServiceNoBroker(name)) return false;
-
- // 3.5 Explicit RESIDENTIAL name whose only commercial evidence is a vertical-
- // AMBIGUOUS generic token (brokerage/advisors/leasing/investments) → drop.
- // Runs before the positive keep for the same reason as the finance/service
- // gates: otherwise "Coldwell Banker Residential Brokerage" is kept on
- // "brokerage" alone. A STRONG commercial token or an allowlisted brand
- // (checked inside) overrides, so "Commercial & Home Sales Group" and
- // "CBRE Residential" still survive.
- if (isResidentialDespiteGeneric(name)) return false;
-
- // 3.6 Professional PRACTICE office ("Law/Dental/Medical Office of Dr. …") → drop.
- // "office" is a CRE asset-class token that would otherwise keep these; the
- // "office OF <person>" structure marks a practice, not a broker. Narrow by
- // design — legit CRE "Office Building"/"Office Leasing" names have no "of".
- if (isProfessionalPracticeOffice(name)) return false;
-
- // 4. Positive commercial evidence wins over everything below.
- if (COMMERCIAL_RE.test(name) || hasCommercialBrand(name)) return true;
-
- // 5. Explicit residential / irrelevant name → drop.
- if (RESIDENTIAL_RE.test(name)) return false;
-
- // 6. Residential-flavored place type with no commercial evidence → drop.
- if (hasResidentialType) return false;
-
- // 7 & 8. No commercial evidence at all — whether or not it's a generic
- // real_estate_agency, we can't confirm it's commercial, so drop it.
- // (Precision > recall: the page promises commercial-only.)
- return false;
-}
-
-async function textSearch(query: string, apiKey: string): Promise<RawPlace[]> {
- const res = await fetch(ENDPOINT, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "X-Goog-Api-Key": apiKey,
- "X-Goog-FieldMask": FIELD_MASK,
- },
- body: JSON.stringify({ textQuery: query, maxResultCount: 20, languageCode: "en", regionCode: "US" }),
- cache: "no-store",
- });
- if (!res.ok) {
- const detail = await res.text().catch(() => "");
- throw new Error(`Places ${res.status}: ${detail.slice(0, 200)}`);
- }
- const json = (await res.json()) as { places?: RawPlace[] };
- return json.places ?? [];
-}
-
-export async function searchCommercialAgents(
- input: CommercialAgentSearch,
-): Promise<CommercialAgentResponse> {
- const apiKey = process.env.GOOGLE_PLACES_API_KEY;
- if (!apiKey) throw new Error("GOOGLE_PLACES_API_KEY is not configured");
- const loc = locationString(input.city, input.state, input.zip);
- if (!loc) throw new Error("A city, state, or ZIP is required");
-
- const kinds = input.kinds.length ? input.kinds : (["buyer", "leasing"] as AgentKind[]);
- const byId = new Map<string, AgentResult>();
-
- // Build the full billed call plan: up to 3 lenses per kind. Each entry is one
- // Places Text Search call, so `queries` = plan length = actual billed calls.
- const plan = kinds.flatMap((kind) =>
- KIND_LENSES[kind].map((lens) => ({ kind, query: `${lens} in ${loc}` })),
- );
- // Fire all lens fetches concurrently. Use allSettled so one failing lens
- // (Google 429/500 on a single query) doesn't discard the results that DID
- // succeed. `queries` counts only fulfilled calls — the honest billed count.
- const settled = await Promise.allSettled(plan.map((p) => textSearch(p.query, apiKey)));
- // If EVERY lens failed, surface the failure (route maps it to 502) rather than
- // silently returning an empty "no agents found".
- if (!settled.some((r) => r.status === "fulfilled")) {
- const firstErr = settled.find((r) => r.status === "rejected") as PromiseRejectedResult | undefined;
- throw firstErr?.reason instanceof Error ? firstErr.reason : new Error("Places search failed");
- }
- let queries = 0;
-
- // Union results by place id, unioning the `kinds` array so a place surfaced by
- // both a buyer- and leasing-lens carries both.
- settled.forEach((r, i) => {
- if (r.status !== "fulfilled") return;
- queries++;
- const places = r.value;
- const kind = plan[i].kind;
- for (const p of places) {
- if (!p.id || !p.displayName?.text) continue;
- if (p.businessStatus && p.businessStatus !== "OPERATIONAL") continue;
- if (!isCommercial(p)) continue;
- const existing = byId.get(p.id);
- if (existing) {
- if (!existing.kinds.includes(kind)) existing.kinds.push(kind);
- continue;
- }
- byId.set(p.id, {
- id: p.id,
- name: p.displayName.text,
- address: p.formattedAddress ?? null,
- rating: typeof p.rating === "number" ? p.rating : null,
- reviews: p.userRatingCount ?? 0,
- phone: p.nationalPhoneNumber ?? null,
- website: p.websiteUri ?? null,
- mapsUrl: p.googleMapsUri ?? null,
- primaryType: p.primaryTypeDisplayName?.text ?? null,
- kinds: [kind],
- });
- }
- });
-
- // Collapse the same office surfaced under multiple lenses (same phone, or
- // same website when phones don't contradict) BEFORE ranking.
- const deduped = dedupeByContact([...byId.values()]);
-
- // Rank by rating weighted by review volume AND commercial-relevance, then by
- // relevance alone (surfaces a strong CRE match ahead of a weakly-commercial
- // one at equal rating-weight), then rating, then review count. The relevance
- // multiplier is bounded (≤~1.6) so it re-orders near-comparable results and
- // breaks near-ties toward the better commercial match, but a 0-review listing
- // still weighs rating×log(1)=0 and cannot leapfrog a genuinely reviewed office.
- const results = deduped.sort((a, b) => {
- const sa = (a.rating ?? 0) * Math.log((a.reviews ?? 0) + 1) * relevanceScore(a);
- const sb = (b.rating ?? 0) * Math.log((b.reviews ?? 0) + 1) * relevanceScore(b);
- if (sb !== sa) return sb - sa;
- const ra = relevanceScore(a);
- const rb = relevanceScore(b);
- if (rb !== ra) return rb - ra;
- if ((b.rating ?? 0) !== (a.rating ?? 0)) return (b.rating ?? 0) - (a.rating ?? 0);
- return (b.reviews ?? 0) - (a.reviews ?? 0);
- });
-
- return { location: loc, kinds, results, queries };
-}
diff --git a/govarbitrage/src/lib/rate-limit.test.ts b/govarbitrage/src/lib/rate-limit.test.ts
deleted file mode 100644
index 6f8f9bf..0000000
--- a/govarbitrage/src/lib/rate-limit.test.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { describe, expect, it, beforeEach } from "vitest";
-import { rateLimit, __resetRateLimit } from "./rate-limit";
-
-beforeEach(() => __resetRateLimit());
-
-describe("rateLimit (sliding window)", () => {
- it("allows up to the limit, then blocks", () => {
- const t0 = 1_000_000;
- for (let i = 1; i <= 5; i++) {
- expect(rateLimit("ip:a", 5, 60_000, t0).allowed).toBe(true);
- }
- const sixth = rateLimit("ip:a", 5, 60_000, t0);
- expect(sixth.allowed).toBe(false);
- expect(sixth.remaining).toBe(0);
- expect(sixth.retryAfterSec).toBeGreaterThan(0);
- });
-
- it("resets after the window elapses", () => {
- const t0 = 2_000_000;
- for (let i = 0; i < 5; i++) rateLimit("ip:b", 5, 60_000, t0);
- expect(rateLimit("ip:b", 5, 60_000, t0).allowed).toBe(false);
- // A moment past the window: fresh bucket.
- expect(rateLimit("ip:b", 5, 60_000, t0 + 60_001).allowed).toBe(true);
- });
-
- it("isolates buckets by key", () => {
- const t0 = 3_000_000;
- for (let i = 0; i < 5; i++) rateLimit("ip:c", 5, 60_000, t0);
- expect(rateLimit("ip:c", 5, 60_000, t0).allowed).toBe(false);
- expect(rateLimit("ip:d", 5, 60_000, t0).allowed).toBe(true);
- });
-});
diff --git a/govarbitrage/src/lib/rate-limit.ts b/govarbitrage/src/lib/rate-limit.ts
deleted file mode 100644
index c148844..0000000
--- a/govarbitrage/src/lib/rate-limit.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-
-// Lightweight in-memory sliding-window rate limiter. Per-process (correct for a
-// single self-hosted `next start` instance). For multi-instance deployments,
-// swap the store for Redis (INCR + PEXPIRE) — same interface. `now` is injectable
-// for deterministic tests.
-
-interface Bucket {
- count: number;
- resetAt: number;
-}
-
-const store = new Map<string, Bucket>();
-let calls = 0;
-
-function sweep(now: number) {
- for (const [k, b] of store) if (b.resetAt <= now) store.delete(k);
-}
-
-export interface RateResult {
- allowed: boolean;
- remaining: number;
- limit: number;
- retryAfterSec: number;
-}
-
-export function rateLimit(key: string, limit: number, windowMs: number, now = Date.now()): RateResult {
- // Opportunistic cleanup so the map can't grow unbounded.
- if (++calls % 500 === 0) sweep(now);
-
- let b = store.get(key);
- if (!b || b.resetAt <= now) {
- b = { count: 0, resetAt: now + windowMs };
- store.set(key, b);
- }
- b.count++;
- const allowed = b.count <= limit;
- return {
- allowed,
- remaining: Math.max(0, limit - b.count),
- limit,
- retryAfterSec: Math.ceil((b.resetAt - now) / 1000),
- };
-}
-
-/** Best-effort client IP from proxy headers (nginx sets x-forwarded-for). */
-export function clientIp(req: NextRequest): string {
- const fwd = req.headers.get("x-forwarded-for");
- if (fwd) return fwd.split(",")[0].trim();
- return req.headers.get("x-real-ip") || "unknown";
-}
-
-/**
- * Build a rate-limit bucket key that prefers the UNFORGEABLE session subject
- * over the spoofable client IP. A logged-in user is keyed on their verified
- * `sub` so they can't reset their bucket (and run up the paid Places bill) by
- * rotating X-Forwarded-For; only anonymous/last-resort callers fall back to IP.
- * Pure + exported so the security invariant is unit-testable.
- */
-export function sessionOrIpKey(prefix: string, userSub: string | null | undefined, ip: string): string {
- return userSub ? `${prefix}:u:${userSub}` : `${prefix}:ip:${ip}`;
-}
-
-/** 429 response with a Retry-After header. */
-export function tooManyRequests(r: RateResult, extraHeaders?: Record<string, string>): NextResponse {
- return NextResponse.json(
- { error: "Too many requests. Please slow down." },
- { status: 429, headers: { "Retry-After": String(r.retryAfterSec), ...extraHeaders } },
- );
-}
-
-/** Test-only: clear all buckets. */
-export function __resetRateLimit() {
- store.clear();
- calls = 0;
-}
diff --git a/govarbitrage/src/lib/reports.ts b/govarbitrage/src/lib/reports.ts
deleted file mode 100644
index 093b7b6..0000000
--- a/govarbitrage/src/lib/reports.ts
+++ /dev/null
@@ -1,139 +0,0 @@
-import { prisma } from "@/lib/db";
-
-export interface GroupPerf {
- key: string;
- count: number;
- avgRoi: number;
- totalNet: number;
-}
-
-export interface Reports {
- totalExpectedProfit: number;
- avgRoi: number;
- cashRequired: number;
- inventoryByStatus: { status: string; count: number }[];
- categoryPerformance: GroupPerf[];
- sourcePerformance: GroupPerf[];
- auctionSuccessRate: number; // won / (won + lost)
- estimatedVsActual: { title: string; estimated: number; actual: number }[];
-}
-
-const num = (d: unknown) => (d == null ? 0 : Number(d));
-
-export async function getReports(): Promise<Reports> {
- // Run all independent DB queries in parallel.
- const [
- costAgg,
- inventoryGroups,
- outcomeWonLost,
- recentOutcomes,
- ] = await Promise.all([
- // Top-line aggregates over all listings that have a costBreakdown.
- // These are intentionally all-time (not ACTIVE-scoped) so the report
- // reflects the full pipeline value, not just currently live items.
- prisma.costBreakdown.aggregate({
- _sum: { expectedNetProfit: true, recommendedMaxBid: true, roi: true },
- _avg: { roi: true },
- _count: { id: true },
- }),
-
- // inventoryByStatus must cover ALL statuses (ACTIVE/ENDED/REMOVED) —
- // scoping to ACTIVE would collapse all non-ACTIVE rows and lose the
- // breakdown that the reports page displays.
- prisma.listing.groupBy({
- by: ["researchStatus"],
- _count: { id: true },
- }),
-
- // Outcome counts for success-rate denominator (WON + LOST only).
- prisma.auctionOutcome.groupBy({
- by: ["status"],
- _count: { id: true },
- }),
-
- // estimatedVsActual: only outcomes where actualSale is set. Bounded at
- // 500 rows — the chart is not intended to render thousands of data points.
- prisma.auctionOutcome.findMany({
- where: { actualSale: { not: null } },
- include: { listing: { select: { title: true } } },
- orderBy: { createdAt: "desc" },
- take: 500,
- }),
- ]);
-
- // ---- top-line numbers ------------------------------------------------
- const totalExpectedProfit = num(costAgg._sum.expectedNetProfit);
- const cashRequired = num(costAgg._sum.recommendedMaxBid);
- const avgRoi = num(costAgg._avg.roi);
-
- // ---- inventory by research status ------------------------------------
- const inventoryByStatus = inventoryGroups.map((g) => ({
- status: g.researchStatus,
- count: g._count.id,
- }));
-
- // ---- category / source performance -----------------------------------
- // Prisma groupBy cannot traverse relations, so we cannot group CostBreakdown
- // by Listing.category/source in a single DB aggregation without a schema
- // change. Instead, fetch CostBreakdown rows with the needed Listing fields
- // (capped at 5 000) and aggregate in JS — same semantics as the original
- // but with a hard safety cap instead of an unbounded load.
- const costRows = await prisma.costBreakdown.findMany({
- select: {
- roi: true,
- expectedNetProfit: true,
- listing: { select: { category: true, source: true } },
- },
- take: 5000,
- });
- if (costRows.length === 5000) {
- // Not silent: category/source performance undercounts past the cap. Durable
- // fix is a raw-SQL GROUP BY across the Listing↔CostBreakdown relation.
- console.warn("[getReports] hit 5000-row cost cap; category/source performance may undercount");
- }
-
- const buildGroupPerf = (keyFn: (r: (typeof costRows)[number]) => string): GroupPerf[] => {
- const m = new Map<string, { count: number; roiSum: number; net: number }>();
- for (const r of costRows) {
- const k = keyFn(r) || "Uncategorized";
- const g = m.get(k) ?? { count: 0, roiSum: 0, net: 0 };
- g.count++;
- g.roiSum += num(r.roi);
- g.net += num(r.expectedNetProfit);
- m.set(k, g);
- }
- return [...m]
- .map(([key, g]) => ({ key, count: g.count, avgRoi: g.roiSum / g.count, totalNet: g.net }))
- .sort((a, b) => b.totalNet - a.totalNet);
- };
-
- const categoryPerformance = buildGroupPerf((r) => r.listing.category ?? "Uncategorized");
- const sourcePerformance = buildGroupPerf((r) => r.listing.source);
-
- // ---- auction success rate --------------------------------------------
- let won = 0;
- let lost = 0;
- for (const g of outcomeWonLost) {
- if (g.status === "WON") won = g._count.id;
- if (g.status === "LOST") lost = g._count.id;
- }
- const auctionSuccessRate = won + lost > 0 ? won / (won + lost) : 0;
-
- // ---- estimated vs actual --------------------------------------------
- const estimatedVsActual = recentOutcomes.map((o) => ({
- title: o.listing.title,
- estimated: num(o.maxBidSet),
- actual: num(o.actualSale),
- }));
-
- return {
- totalExpectedProfit,
- avgRoi,
- cashRequired,
- inventoryByStatus,
- categoryPerformance,
- sourcePerformance,
- auctionSuccessRate,
- estimatedVsActual,
- };
-}
diff --git a/govarbitrage/src/lib/selling-avenues.ts b/govarbitrage/src/lib/selling-avenues.ts
deleted file mode 100644
index f7189b2..0000000
--- a/govarbitrage/src/lib/selling-avenues.ts
+++ /dev/null
@@ -1,168 +0,0 @@
-// Structured "where to source" and "where to sell / validate demand before you
-// buy" reference, with real links. Rendered at /selling-avenues and mirrored in
-// docs/SELLING-AVENUES.md. Compliance-first: you may validate demand and take
-// CONTINGENT interest before winning, but you must never represent ownership of
-// an item you have not yet won.
-
-export interface Avenue {
- name: string;
- url: string;
- note: string;
-}
-
-export interface AvenueGroup {
- heading: string;
- blurb: string;
- avenues: Avenue[];
-}
-
-export const SOURCING: AvenueGroup[] = [
- {
- heading: "Federal surplus",
- blurb: "US government agency surplus — often no buyer's premium.",
- avenues: [
- { name: "GSA Auctions", url: "https://gsaauctions.gov", note: "Federal personal property; frequently $0 buyer premium." },
- { name: "GovDeals", url: "https://www.govdeals.com", note: "Largest gov-surplus marketplace (state/county/federal); ~10% premium." },
- { name: "GovPlanet / AllSurplus", url: "https://www.govplanet.com", note: "Heavy equipment, vehicles, military rolling stock." },
- ],
- },
- {
- heading: "State & county surplus",
- blurb: "State DGS/facilities programs and county auctions.",
- avenues: [
- { name: "Public Surplus", url: "https://www.publicsurplus.com", note: "Municipal, school-district and agency surplus nationwide." },
- { name: "California DGS Surplus", url: "https://www.dgs.ca.gov/OFAM/Surplus-Property", note: "State of California surplus personal property." },
- { name: "Texas Facilities Commission Surplus", url: "https://www.tfc.texas.gov/divisions/supportserv/prog/statesurplus/", note: "Texas state surplus program." },
- { name: "Municibid", url: "https://www.municibid.com", note: "Local government surplus — vehicles, equipment." },
- { name: "Bid4Assets", url: "https://www.bid4assets.com", note: "County tax-defaulted property + surplus." },
- ],
- },
- {
- heading: "University surplus",
- blurb: "University asset-recovery programs, strong for lab & IT gear.",
- avenues: [
- { name: "UW Surplus", url: "https://surplus.uw.edu", note: "University of Washington." },
- { name: "MSU Surplus Store", url: "https://surplus.msu.edu", note: "Michigan State University." },
- { name: "UC Davis Aggie Surplus", url: "https://aggiesurplus.ucdavis.edu", note: "UC Davis." },
- ],
- },
-];
-
-export const SELLING: AvenueGroup[] = [
- {
- heading: "Retail resale marketplaces",
- blurb: "Where the flipped item actually gets sold.",
- avenues: [
- { name: "eBay", url: "https://www.ebay.com", note: "Deepest buyer pool for used equipment; ~13% final-value fee." },
- { name: "Facebook Marketplace", url: "https://www.facebook.com/marketplace", note: "Best for local, heavy, freight-averse items." },
- { name: "Amazon Renewed", url: "https://www.amazon.com/renewed", note: "Refurb electronics at scale (approval required)." },
- { name: "DOTmed / LabX", url: "https://www.dotmed.com", note: "Medical & lab equipment verticals — higher-value buyers." },
- { name: "MachineryTrader", url: "https://www.machinerytrader.com", note: "Industrial / heavy equipment." },
- ],
- },
- {
- heading: "Wholesale & liquidation exits",
- blurb: "Faster, lower-price exits when you don't want to retail one-by-one.",
- avenues: [
- { name: "B-Stock", url: "https://www.bstock.com", note: "Bulk B2B liquidation auctions." },
- { name: "Liquidation.com", url: "https://www.liquidation.com", note: "Pallet/lot liquidation." },
- ],
- },
- {
- heading: "Demand validation (BEFORE you buy)",
- blurb:
- "Use these to prove resale price and demand before committing to a bid — this is research, not a sale.",
- avenues: [
- { name: "eBay Terapeak / Sold listings", url: "https://www.ebay.com/sh/research", note: "Free sold-price history — the single best comp source." },
- { name: "Google Shopping", url: "https://shopping.google.com", note: "New-retail anchor across sellers." },
- { name: "PriceCharting", url: "https://www.pricecharting.com", note: "For collectibles/electronics with model-level pricing." },
- ],
- },
-];
-
-// International sourcing + resale venues — government/industrial surplus auctions
-// and the dominant secondary marketplaces by region.
-export const INTERNATIONAL: AvenueGroup[] = [
- {
- heading: "Europe",
- blurb: "Pan-European industrial/surplus auctions + high-end curated marketplaces.",
- avenues: [
- { name: "Troostwijk Auctions", url: "https://www.troostwijkauctions.com/en", note: "NL-based, industrial/machine surplus across 10+ EU countries." },
- { name: "TBAuctions (BVA)", url: "https://tbauctions.com/brand-portfolio/", note: "Leading B2B auction group — BVA, Vavato, Klaravik, etc." },
- { name: "Vavato", url: "https://www.vavato.com", note: "Belgium — industrial, overstock, bankruptcy goods." },
- { name: "GovPlanet Europe", url: "https://www.govplanet.eu/", note: "Government + military surplus, EU." },
- { name: "Catawiki", url: "https://www.catawiki.com/en/", note: "Curated high-end auctions (art, design, collectibles)." },
- { name: "Ritchie Bros", url: "https://www.rbauction.com", note: "Global heavy equipment (EU yards)." },
- ],
- },
- {
- heading: "Hong Kong",
- blurb: "Government surplus + the region's top resale app.",
- avenues: [
- { name: "HK Gov Logistics Dept — Public Auction", url: "https://www.gld.gov.hk/en/our-services/supplies/auction/", note: "Government surplus/unserviceable stores + confiscated goods." },
- { name: "Carousell HK", url: "https://www.carousell.com.hk", note: "Dominant HK second-hand marketplace." },
- ],
- },
- {
- heading: "Japan",
- blurb: "The largest JP auction + resale platforms (also host government auctions).",
- avenues: [
- { name: "Yahoo! Auctions Japan", url: "https://auctions.yahoo.co.jp", note: "Dominant JP auction site; also runs 官公庁 government auctions." },
- { name: "Mercari Japan", url: "https://jp.mercari.com", note: "Largest JP C2C resale marketplace." },
- ],
- },
- {
- heading: "Australia",
- blurb: "Government, council, ex-military and salvage auctions.",
- avenues: [
- { name: "GraysOnline", url: "https://www.graysonline.com", note: "Government/council/industrial + clearance auctions." },
- { name: "Pickles", url: "https://www.pickles.com.au", note: "Vehicles, industrial, salvage, Defence surplus." },
- { name: "Manheim Australia", url: "https://www.manheim.com.au", note: "Fleet + government vehicle auctions." },
- ],
- },
- {
- heading: "China (high-end & judicial)",
- blurb: "Court-seized/judicial asset auctions + luxury/art houses in Beijing/Shanghai/Shenzhen.",
- avenues: [
- { name: "Taobao Judicial (阿里资产/司法拍卖)", url: "https://sf.taobao.com", note: "Alibaba court-seized asset auctions — property, vehicles, luxury." },
- { name: "JD Auction (京东拍卖)", url: "https://auction.jd.com", note: "JD judicial + surplus auctions." },
- { name: "Poly Auction", url: "https://www.polyauction.com", note: "High-end art/collectibles (Beijing/HK)." },
- { name: "Alibaba", url: "https://www.alibaba.com", note: "Wholesale sourcing + resale reference pricing." },
- ],
- },
-];
-
-export interface ComplianceRule {
- title: string;
- body: string;
-}
-
-export const COMPLIANCE: ComplianceRule[] = [
- {
- title: "Never represent ownership before you win",
- body:
- "You do not own an auction lot until the auction closes in your favor and you have paid. Any marketing before that must be framed as CONTINGENT interest ('I intend to acquire this; contingent on winning'), never 'for sale now'.",
- },
- {
- title: "eBay pre-sale rules",
- body:
- "eBay allows pre-sale listings only for items you have a firm commitment to supply and can ship within 40 business days (listing must state the ship date). You cannot list an auction lot you might lose. Practically: validate demand and collect contingent buyer interest off-platform, then list once you actually win and hold the item.",
- },
- {
- title: "Contingent buyer interest is fine",
- body:
- "Collecting names, emails and non-binding offers on a 'buyer interest' page is compliant as long as it is clearly contingent and non-binding until you own the item. GovArbitrage's buyer workflow enforces the contingent flag and shows a disclaimer on every interest page.",
- },
- {
- title: "Government auction terms bind you",
- body:
- "Gov surplus is sold AS-IS, often pickup-only, with removal deadlines and payment windows. Model those costs (pickup labor, freight, storage) before bidding — the cost engine does this. Missing a removal deadline can forfeit the item and your payment.",
- },
-];
-
-// The worked example Steve gave: a dental chair bought cheap vs. new retail.
-export const WORKED_EXAMPLE = {
- title: "Worked example — the dental chair",
- body:
- "An A-dec 511 dental patient chair sells new for ~$20,000. A county-clinic surplus unit in used-good condition might hammer at $500 on GovDeals. But 'buy $500, sell $20,000' is fiction. Realistic used A-dec 511 units sell for ~$6,000–9,000 (see eBay/DOTmed sold comps). Against that, subtract the 10% buyer's premium, ~$500 in freight (320 lb, pickup-only), pickup labor, testing, refurbishment, ~13% marketplace fees and payment fees. GovArbitrage runs exactly this math per listing and reports the honest expected net profit, ROI, and a recommended maximum bid — so you bid to a target return instead of a fantasy spread.",
-};
diff --git a/govarbitrage/src/lib/send-digest.ts b/govarbitrage/src/lib/send-digest.ts
deleted file mode 100644
index dbd9983..0000000
--- a/govarbitrage/src/lib/send-digest.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import { prisma } from "@/lib/db";
-import { findHotDeals, type HotDeal } from "@/lib/hot-deals";
-import { sendNewsletterEmail, newsletterSendMode } from "@/lib/newsletter";
-import { persistDigestSnapshot, currentSlot } from "@/lib/digest-snapshot";
-
-// Digest send-to-list. Renders the same honesty-gated Top-10 the paid alerts
-// use and fans it out to every CONFIRMED subscriber, each with their own
-// one-click unsubscribe link (CAN-SPAM). All sends go through
-// sendNewsletterEmail(), which is TEST-logged by default and throws on an
-// unapproved live flip — so calling this is safe until Steve approves live
-// transport. Nothing schedules this yet; the launchd/cron wiring is part of
-// the gated go-live (see pending-approval memo).
-
-const fmtUsd = (n: number) => `$${Math.round(n).toLocaleString("en-US")}`;
-
-export function renderDigestText(deals: HotDeal[], unsubscribeUrl: string): string {
- const lines: string[] = [
- "GovArbitrage — Top-10 Deals Digest",
- new Date().toLocaleString("en-US", { dateStyle: "medium", timeStyle: "short" }),
- "",
- ];
-
- deals.forEach((d, i) => {
- const where = [d.listing.locationCity, d.listing.locationState].filter(Boolean).join(", ");
- lines.push(
- `${i + 1}. ${d.listing.title}`,
- ` Current bid ${fmtUsd(d.currentBid)} · rec. max bid ${fmtUsd(d.recMax)} · ` +
- `est. resale ${fmtUsd(d.expectedSaleLow)} (${d.confidence} confidence)`,
- ` Conservative ROI ${(d.roiConservative * 100).toFixed(0)}%${d.roiCapped ? " (capped)" : ""} · ${d.disclaimer}`,
- ...(d.listing.sourceUrl ? [` ${d.listing.sourceUrl}`] : []),
- ...(where ? [` Location: ${where}`] : []),
- ""
- );
- });
-
- if (!deals.length) lines.push("No deals cleared the hot-deal gate this run.", "");
-
- lines.push(
- "—",
- "Every figure above is confidence-discounted and capped, never inflated.",
- "Estimates are heuristic — always verify comps before bidding.",
- "",
- `Unsubscribe (one click, effective immediately): ${unsubscribeUrl}`
- );
- return lines.join("\n");
-}
-
-export interface DigestSendResult {
- mode: "test" | "live";
- subscribers: number;
- sent: number;
- errors: number;
- dealCount: number;
-}
-
-export async function sendDigestToSubscribers(opts: { baseUrl?: string; limit?: number } = {}): Promise<DigestSendResult> {
- const baseUrl = opts.baseUrl || process.env.NEWSLETTER_BASE_URL;
- // Never let a live send fabricate localhost unsubscribe links — a broken
- // unsubscribe URL in a real email is a CAN-SPAM problem, not a dev nit.
- if (!baseUrl || (newsletterSendMode() === "live" && !baseUrl.startsWith("https://"))) {
- throw new Error("sendDigestToSubscribers needs a public NEWSLETTER_BASE_URL (https) — refusing to build localhost links.");
- }
- const deals = await findHotDeals({ limit: opts.limit ?? 10 });
-
- // Freeze this edition for the public /deals archive — even if every send
- // below fails, the archive records what the digest showed at send time.
- await persistDigestSnapshot(currentSlot(), deals);
-
- const subscribers = await prisma.subscriber.findMany({ where: { status: "CONFIRMED" } });
-
- let sent = 0;
- let errors = 0;
- for (const sub of subscribers) {
- const unsubscribeUrl = `${baseUrl}/api/newsletter/unsubscribe?token=${sub.unsubscribeToken}`;
- try {
- await sendNewsletterEmail({
- to: sub.email,
- subject: `Top-10 gov-surplus deals — ${new Date().toLocaleDateString("en-US", { month: "short", day: "numeric" })}`,
- text: renderDigestText(deals, unsubscribeUrl),
- });
- sent++;
- } catch {
- errors++;
- }
- }
-
- return { mode: newsletterSendMode(), subscribers: subscribers.length, sent, errors, dealCount: deals.length };
-}
diff --git a/govarbitrage/src/lib/session.ts b/govarbitrage/src/lib/session.ts
deleted file mode 100644
index 0e56207..0000000
--- a/govarbitrage/src/lib/session.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { SignJWT, jwtVerify } from "jose";
-
-// JWT session tokens (HS256) signed with AUTH_SECRET. Pure-JS (jose / Web
-// Crypto) so this module works in BOTH the Edge middleware and Node handlers.
-
-export const SESSION_COOKIE = "ga_session";
-export const SESSION_MAX_AGE = 60 * 60 * 24 * 7; // 7 days
-
-export interface SessionPayload {
- sub: string; // user id
- email: string;
- role: string; // ADMIN | ANALYST | VIEWER
-}
-
-function secret(): Uint8Array {
- const s = process.env.AUTH_SECRET;
- // The dev fallback is in the repo — a production deploy that forgot to set
- // AUTH_SECRET would mint forge-trivial sessions. Refuse to run instead.
- if (!s && process.env.NODE_ENV === "production") {
- throw new Error("AUTH_SECRET must be set in production — refusing to sign sessions with the dev fallback.");
- }
- return new TextEncoder().encode(s || "dev-only-change-me");
-}
-
-export async function createSession(payload: SessionPayload): Promise<string> {
- return new SignJWT({ email: payload.email, role: payload.role })
- .setProtectedHeader({ alg: "HS256" })
- .setSubject(payload.sub)
- .setIssuedAt()
- .setExpirationTime(`${SESSION_MAX_AGE}s`)
- .sign(secret());
-}
-
-export async function verifySession(token: string): Promise<SessionPayload | null> {
- try {
- const { payload } = await jwtVerify(token, secret());
- if (!payload.sub || !payload.email) return null;
- return { sub: payload.sub, email: payload.email as string, role: (payload.role as string) ?? "VIEWER" };
- } catch {
- return null;
- }
-}
diff --git a/govarbitrage/src/lib/site.ts b/govarbitrage/src/lib/site.ts
deleted file mode 100644
index 6062e18..0000000
--- a/govarbitrage/src/lib/site.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-// Public origin for canonical URLs, sitemap, robots, and OG tags.
-// NEWSLETTER_BASE_URL is already the env of record for public links
-// (confirm/unsubscribe emails use it) — reuse it rather than adding a twin.
-export function publicBaseUrl(): string {
- const env = process.env.NEWSLETTER_BASE_URL;
- if (env) return env.replace(/\/+$/, "");
- if (process.env.NODE_ENV === "production") return "https://auctions.agentabrams.com";
- return "http://localhost:3737";
-}
diff --git a/govarbitrage/src/lib/ssrf-guard.ts b/govarbitrage/src/lib/ssrf-guard.ts
deleted file mode 100644
index 8e76593..0000000
--- a/govarbitrage/src/lib/ssrf-guard.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import { lookup } from "node:dns/promises";
-
-// SSRF guard for the URL importer. Validates that a user-supplied URL points at
-// a publicly-routable host before Playwright is pointed at it, blocking cloud
-// metadata endpoints (169.254.169.254 / metadata.google.internal), localhost,
-// and RFC1918 / loopback / link-local / ULA ranges. Node-runtime only (uses
-// node:dns/promises) — do NOT import from Edge middleware.
-
-function ipv4ToInt(ip: string): number | null {
- const parts = ip.split(".");
- if (parts.length !== 4) return null;
- let n = 0;
- for (const p of parts) {
- if (!/^\d+$/.test(p)) return null;
- const o = Number(p);
- if (o < 0 || o > 255) return null;
- n = n * 256 + o;
- }
- return n >>> 0;
-}
-
-function isPrivateIPv4(ip: string): boolean {
- const n = ipv4ToInt(ip);
- if (n === null) return false;
- const inRange = (base: string, bits: number) => {
- const baseInt = ipv4ToInt(base)!;
- const mask = bits === 0 ? 0 : (0xffffffff << (32 - bits)) >>> 0;
- return (n & mask) === (baseInt & mask);
- };
- return (
- inRange("10.0.0.0", 8) ||
- inRange("172.16.0.0", 12) ||
- inRange("192.168.0.0", 16) ||
- inRange("127.0.0.0", 8) ||
- inRange("169.254.0.0", 16) ||
- inRange("0.0.0.0", 8)
- );
-}
-
-function isPrivateIPv6(addr: string): boolean {
- const ip = addr.toLowerCase().replace(/^\[|\]$/g, "");
- // IPv4-mapped (::ffff:a.b.c.d) — defer to the IPv4 check.
- const mapped = ip.match(/^::ffff:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/);
- if (mapped) return isPrivateIPv4(mapped[1]);
- if (ip === "::1" || ip === "::") return true; // loopback / unspecified
- const first = ip.split(":")[0];
- const hi = parseInt((first || "0").padStart(4, "0"), 16);
- if ((hi & 0xffc0) === 0xfe80) return true; // fe80::/10 link-local (fe80..febf)
- if ((hi & 0xfe00) === 0xfc00) return true; // fc00::/7 unique-local (fc00..fdff)
- return false;
-}
-
-function isBlockedAddress(addr: string): boolean {
- return addr.includes(":") ? isPrivateIPv6(addr) : isPrivateIPv4(addr);
-}
-
-/**
- * Parse and validate a user-supplied URL, throwing when it targets a
- * non-public destination. Returns the parsed URL on success.
- */
-export async function assertPublicUrl(rawUrl: string): Promise<URL> {
- let url: URL;
- try {
- url = new URL(rawUrl);
- } catch {
- throw new Error("Invalid URL");
- }
-
- if (url.protocol !== "http:" && url.protocol !== "https:") {
- throw new Error(`Blocked URL scheme: ${url.protocol}`);
- }
-
- const host = url.hostname.toLowerCase().replace(/^\[|\]$/g, "");
- if (
- host === "localhost" ||
- host.endsWith(".internal") ||
- host === "metadata.google.internal"
- ) {
- throw new Error(`Blocked hostname: ${host}`);
- }
-
- // A literal IP in the host still needs to pass the range check.
- if (isBlockedAddress(host)) {
- throw new Error(`Blocked private address: ${host}`);
- }
-
- // Resolve the hostname and reject if ANY address is private/loopback/etc.
- let addresses: { address: string }[];
- try {
- addresses = await lookup(host, { all: true });
- } catch {
- throw new Error(`Could not resolve hostname: ${host}`);
- }
- if (addresses.length === 0) {
- throw new Error(`Could not resolve hostname: ${host}`);
- }
- for (const { address } of addresses) {
- if (isBlockedAddress(address)) {
- throw new Error(`Blocked private address for ${host}: ${address}`);
- }
- }
-
- return url;
-}
diff --git a/govarbitrage/src/lib/tiers.ts b/govarbitrage/src/lib/tiers.ts
deleted file mode 100644
index 415f47e..0000000
--- a/govarbitrage/src/lib/tiers.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-// 3-tier paid-alerts SaaS config — the single source of truth for pricing,
-// features, and enforceable data limits. Prices are DRAFT (Steve sets final);
-// live charging stays gated (billing runs TEST/mock until a live key is set).
-import type { Tier } from "@prisma/client";
-
-export interface TierDef {
- key: Tier;
- label: string;
- priceUsd: number; // per month; 0 = free
- blurb: string;
- features: string[];
- limits: {
- maxListings: number; // rows the dashboard/API returns (Infinity via a big number)
- freshnessDelayHours: number; // Free sees deals aged by this many hours (not real-time)
- showMoneyMath: boolean; // recommended max bid / ROI / net profit visible?
- hotDealAlerts: boolean; // receive the 🔥 email alerts?
- realtime: boolean; // real-time vs delayed
- allSources: boolean; // all 8 feeds vs a limited subset
- };
-}
-
-// env override for prices without a code change: TIER_PRICE_STANDARD, TIER_PRICE_PREMIUM
-function price(env: string, dflt: number): number {
- const v = process.env[env];
- const n = v == null ? NaN : Number(v);
- return Number.isFinite(n) && n >= 0 ? n : dflt;
-}
-
-export const TIERS: Record<Tier, TierDef> = {
- FREE: {
- key: "FREE",
- label: "Free",
- priceUsd: 0,
- blurb: "Current listings and full money-math analysis.",
- features: [
- "Browse current auction listings",
- "Full money-math: recommended max bid, ROI, net profit, scores",
- "Up to 25 listings per page",
- "Daily newsletter available after subscription confirmation",
- ],
- limits: {
- maxListings: 25,
- freshnessDelayHours: 24,
- showMoneyMath: true,
- hotDealAlerts: false,
- realtime: false,
- allSources: false,
- },
- },
- STANDARD: {
- key: "STANDARD",
- label: "Standard",
- priceUsd: price("TIER_PRICE_STANDARD", 19),
- blurb: "Preview plan with up to 500 listings per page.",
- features: [
- "Current listings and full money-math analysis",
- "Up to 500 listings per page",
- "Available sources are accessible on every plan",
- "Daily newsletter available after subscription confirmation",
- ],
- limits: {
- maxListings: 500,
- freshnessDelayHours: 0,
- showMoneyMath: true,
- hotDealAlerts: true,
- realtime: true,
- allSources: true,
- },
- },
- PREMIUM: {
- key: "PREMIUM",
- label: "Premium",
- priceUsd: price("TIER_PRICE_PREMIUM", 49),
- blurb: "Preview plan with a higher listing page-size allowance.",
- features: [
- "Current listings and full money-math analysis",
- "Higher listing page-size allowance",
- "Results remain subject to search and sorting limits",
- "Daily newsletter available after subscription confirmation",
- ],
- limits: {
- maxListings: 1_000_000,
- freshnessDelayHours: 0,
- showMoneyMath: true,
- hotDealAlerts: true,
- realtime: true,
- allSources: true,
- },
- },
-};
-
-export const TIER_ORDER: Tier[] = ["FREE", "STANDARD", "PREMIUM"];
-
-export function tierDef(t: Tier | string | null | undefined): TierDef {
- return TIERS[(t as Tier) in TIERS ? (t as Tier) : "FREE"];
-}
-
-/** Map a Stripe price/lookup to a tier (used by the webhook). */
-export function tierFromPriceUsd(usd: number): Tier {
- if (usd >= TIERS.PREMIUM.priceUsd && TIERS.PREMIUM.priceUsd > 0) return "PREMIUM";
- if (usd >= TIERS.STANDARD.priceUsd && TIERS.STANDARD.priceUsd > 0) return "STANDARD";
- return "FREE";
-}
diff --git a/govarbitrage/src/lib/utils.ts b/govarbitrage/src/lib/utils.ts
deleted file mode 100644
index d39b59b..0000000
--- a/govarbitrage/src/lib/utils.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { clsx, type ClassValue } from "clsx";
-import { twMerge } from "tailwind-merge";
-
-/** shadcn/ui-style className combiner. */
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs));
-}
-
-/** Round to whole cents (avoids float drift; all engine money is in dollars). */
-export function round2(n: number): number {
- return Math.round((n + Number.EPSILON) * 100) / 100;
-}
-
-export function clamp(n: number, lo: number, hi: number): number {
- return Math.min(hi, Math.max(lo, n));
-}
-
-const usd = new Intl.NumberFormat("en-US", {
- style: "currency",
- currency: "USD",
- maximumFractionDigits: 0,
-});
-const usdCents = new Intl.NumberFormat("en-US", {
- style: "currency",
- currency: "USD",
-});
-
-export function formatMoney(n: number | null | undefined, cents = false): string {
- if (n === null || n === undefined || Number.isNaN(n)) return "—";
- return cents ? usdCents.format(n) : usd.format(n);
-}
-
-export function formatPercent(ratio: number | null | undefined, digits = 0): string {
- if (ratio === null || ratio === undefined || Number.isNaN(ratio)) return "—";
- return `${(ratio * 100).toFixed(digits)}%`;
-}
-
-/** Human countdown to a future date, e.g. "2d 4h" or "Closed". */
-export function countdown(to: Date | string | null | undefined, now = new Date()): string {
- if (!to) return "—";
- const target = typeof to === "string" ? new Date(to) : to;
- const ms = target.getTime() - now.getTime();
- if (ms <= 0) return "Closed";
- const d = Math.floor(ms / 86_400_000);
- const h = Math.floor((ms % 86_400_000) / 3_600_000);
- const m = Math.floor((ms % 3_600_000) / 60_000);
- if (d > 0) return `${d}d ${h}h`;
- if (h > 0) return `${h}h ${m}m`;
- return `${m}m`;
-}
diff --git a/govarbitrage/src/middleware.test.ts b/govarbitrage/src/middleware.test.ts
deleted file mode 100644
index fb63baf..0000000
--- a/govarbitrage/src/middleware.test.ts
+++ /dev/null
@@ -1,98 +0,0 @@
-import { describe, expect, it, beforeEach, vi } from "vitest";
-import { NextRequest } from "next/server";
-
-// TK-11476 — verify TK-11466 FIX 2 (presentedAdminBasicAuth) actually holds:
-// with the shared-password wall OFF (BASIC_AUTH=""), an anonymous caller on a
-// protected path must fall through to /login (pages) / 401 JSON (APIs) and
-// must NEVER be minted an ADMIN session. BASIC_AUTH is read as a top-level
-// module constant, so each case resets modules and re-imports after setting
-// the env var it needs to exercise.
-async function loadMiddleware() {
- const mod = await import("./middleware");
- return mod.middleware;
-}
-
-function req(path: string, headers: Record<string, string> = {}) {
- return new NextRequest(new Request(`https://auctions.agentabrams.com${path}`, { headers }));
-}
-
-const basicHeader = (creds: string) => "Basic " + Buffer.from(creds).toString("base64");
-
-beforeEach(() => {
- vi.resetModules();
- process.env.AUTH_SECRET = "test-secret-please-change";
- delete process.env.FLEET_SSO_SECRET;
- delete process.env.IMPORT_TOKEN;
-});
-
-describe("middleware — wall OFF (BASIC_AUTH empty)", () => {
- beforeEach(() => {
- process.env.BASIC_AUTH = "";
- });
-
- it("anon GET / redirects to /login and mints no session cookie", async () => {
- const middleware = await loadMiddleware();
- const res = await middleware(req("/"));
- expect(res.status).toBe(307);
- expect(res.headers.get("location")).toContain("/login");
- expect(res.cookies.get("ga_session")).toBeUndefined();
- });
-
- it("anon GET /api/credentials returns 401 JSON and mints no session cookie", async () => {
- const middleware = await loadMiddleware();
- const res = await middleware(req("/api/credentials"));
- expect(res.status).toBe(401);
- expect(res.cookies.get("ga_session")).toBeUndefined();
- });
-
- it("regression guard: a bogus Authorization header still does not mint ADMIN", async () => {
- const middleware = await loadMiddleware();
- const res = await middleware(req("/", { Authorization: basicHeader("anyone:anything") }));
- expect(res.status).toBe(307);
- expect(res.headers.get("location")).toContain("/login");
- expect(res.cookies.get("ga_session")).toBeUndefined();
- });
-
- it("regression guard: even the correct default creds do not mint ADMIN once the wall is off", async () => {
- // The exact TK-11466 bypass shape: basicAuthOk() would have been true
- // unconditionally with the wall off. presentedAdminBasicAuth() must stay
- // false regardless of what's presented when BASIC_AUTH itself is empty.
- const middleware = await loadMiddleware();
- const res = await middleware(req("/", { Authorization: basicHeader("admin:DW2024!") }));
- expect(res.status).toBe(307);
- expect(res.headers.get("location")).toContain("/login");
- expect(res.cookies.get("ga_session")).toBeUndefined();
- });
-
- it("public paths (e.g. /pricing) stay reachable anonymously", async () => {
- const middleware = await loadMiddleware();
- const res = await middleware(req("/pricing"));
- expect(res.status).toBe(200);
- });
-});
-
-describe("middleware — wall ON (BASIC_AUTH set, unchanged behavior)", () => {
- beforeEach(() => {
- process.env.BASIC_AUTH = "admin:DW2024!";
- });
-
- it("anon GET / (no credentials) is 401'd by the wall", async () => {
- const middleware = await loadMiddleware();
- const res = await middleware(req("/"));
- expect(res.status).toBe(401);
- expect(res.headers.get("www-authenticate")).toContain("Basic");
- });
-
- it("the real shared credential still auto-mints an ADMIN session", async () => {
- const middleware = await loadMiddleware();
- const res = await middleware(req("/", { Authorization: basicHeader("admin:DW2024!") }));
- expect(res.status).toBe(200);
- expect(res.cookies.get("ga_session")?.value).toBeTruthy();
- });
-
- it("a wrong credential is 401'd, not redirected", async () => {
- const middleware = await loadMiddleware();
- const res = await middleware(req("/", { Authorization: basicHeader("admin:wrong") }));
- expect(res.status).toBe(401);
- });
-});
diff --git a/govarbitrage/src/middleware.ts b/govarbitrage/src/middleware.ts
deleted file mode 100644
index c4271e0..0000000
--- a/govarbitrage/src/middleware.ts
+++ /dev/null
@@ -1,142 +0,0 @@
-import { NextRequest, NextResponse } from "next/server";
-import { SESSION_COOKIE, SESSION_MAX_AGE, createSession, verifySession } from "@/lib/session";
-import { FLEET_SSO_COOKIE, fleetSsoOk } from "@/lib/fleet-sso";
-
-// Public paths that never require a session:
-// - /login and the auth API
-// - /b/<slug> public contingent buyer-interest pages
-// - the public buyer-lead submission endpoint (anonymous buyers)
-const PUBLIC = [
- /^\/login(?:\/|$)/,
- /^\/api\/auth\//,
- /^\/b\//,
- // Public read-only catalog API the iOS app + any browser call anonymously.
- // Same data for every client (money-math is tier-driven, FREE includes it);
- // GET-only routes, so exposing them carries no write surface. Keeping this
- // genuinely public — no shared password, no auto-minted session — is what
- // makes the app's data-access behavior identical and demonstrable to review.
- /^\/api\/listings(?:\/|$)/,
- /^\/api\/listings\/[^/]+\/buyer-lead$/,
- /^\/pricing(?:\/|$)/, // public marketing page (upgrade CTA)
- /^\/api\/billing\/webhook$/, // Stripe calls this server-to-server, no session
- /^\/newsletter(?:\/|$)/, // public digest subscribe landing
- /^\/api\/newsletter\/(?:subscribe|confirm|unsubscribe)$/, // anonymous subscribers + email links
- /^\/deals(?:\/|$)/, // public SEO digest archive (frozen snapshots, teaser numbers only)
- /^\/selling-avenues(?:\/|$)/, // public SEO reference (where/how to resell surplus) — crawlable, in sitemap
- /^\/privacy(?:\/|$)/, // public privacy policy — REQUIRED reachable w/o login for the App Store listing URL
- /^\/sitemap\.xml$/, // crawlers (robots.txt is already excluded by the matcher)
- /^\/robots\.txt$/,
-];
-
-function isPublic(pathname: string): boolean {
- return PUBLIC.some((re) => re.test(pathname));
-}
-
-// Outer un/pw wall for the whole site (ideas/fleet-unified admin:DW2024!).
-// Override with BASIC_AUTH="user:pass"; BASIC_AUTH="" disables. Runs in Edge → use atob, not Buffer.
-const BASIC_AUTH = process.env.BASIC_AUTH ?? "admin:DW2024!";
-function basicAuthOk(req: NextRequest): boolean {
- if (!BASIC_AUTH) return true;
- const m = (req.headers.get("authorization") || "").match(/^Basic\s+(.+)$/i);
- if (!m) return false;
- try { return atob(m[1]) === BASIC_AUTH; } catch { return false; }
-}
-
-// True ONLY when a real, matching Basic-Auth credential was presented.
-// Unlike basicAuthOk(), this is FALSE when BASIC_AUTH is empty (wall disabled):
-// disabling the shared-password wall must never be treated as "logged in as admin".
-function presentedAdminBasicAuth(req: NextRequest): boolean {
- if (!BASIC_AUTH) return false;
- const m = (req.headers.get("authorization") || "").match(/^Basic\s+(.+)$/i);
- if (!m) return false;
- try { return atob(m[1]) === BASIC_AUTH; } catch { return false; }
-}
-
-export async function middleware(req: NextRequest) {
- const { pathname } = req.nextUrl;
-
- // Machine callers that cannot present a password bypass the wall:
- // Stripe's server-to-server webhook and the extension/CSV import-token clients.
- const importToken = process.env.IMPORT_TOKEN;
- const machineOk =
- pathname === "/api/billing/webhook" ||
- (!!importToken && req.headers.get("x-import-token") === importToken);
- // Public paths (login, privacy, the anonymous read API, SEO pages) must be
- // reachable without the shared admin wall — otherwise the "public" API would
- // silently require a password only insiders know, the kind of hidden gate
- // Guideline 5.6 flags. The wall still guards every non-public surface.
- if (!machineOk && !isPublic(pathname) && !basicAuthOk(req)) {
- return new NextResponse("auth required", {
- status: 401,
- headers: { "WWW-Authenticate": 'Basic realm="GovArbitrage"' },
- });
- }
-
- if (isPublic(pathname)) return NextResponse.next();
-
- // Valid session cookie?
- const token = req.cookies.get(SESSION_COOKIE)?.value;
- const session = token ? await verifySession(token) : null;
-
- // Machine clients (extension / CSV import) may present the import token.
- const hasImportToken = !!importToken && req.headers.get("x-import-token") === importToken;
-
- if (session || hasImportToken) return NextResponse.next();
-
- // Basic-auth IS the login (Steve 2026-07-27: "my basic un and pw, not the email
- // login"). Any human who cleared the outer un/pw wall (the BASIC_AUTH creds) is
- // treated as ADMIN — we mint a real ADMIN session here so the app never bounces to the
- // email /login form. basicAuthOk is already true for every non-public/non-machine
- // request that reached this line (the wall 401s otherwise); the guard just makes
- // sure a machine-token-only caller doesn't get an admin cookie.
- if (presentedAdminBasicAuth(req)) {
- const ga = await createSession({ sub: "basic-admin", email: "admin@agentabrams.com", role: "ADMIN" });
- const res = NextResponse.next();
- res.cookies.set(SESSION_COOKIE, ga, {
- httpOnly: true,
- secure: true,
- sameSite: "lax",
- path: "/",
- maxAge: SESSION_MAX_AGE,
- });
- return res;
- }
-
- // Fleet single-sign-on: a valid shared *.agentabrams.com "aafleet" cookie
- // establishes an ANALYST session here (operational — full data + imports +
- // buyer pages), so one fleet login carries into auctions with no second form.
- // The tier-0 credential surface still requires ADMIN, reached only via the
- // local username/password login. Rationale: the aafleet token carries no
- // per-user identity, audience, or role, so a leaked sibling-site cookie must
- // not unlock this app's encrypted provider credentials or Stripe/billing
- // state (DTD 2026-07-25, verdict B — scoped below ADMIN; bumped VIEWER→ANALYST
- // per Steve so the fleet view is operational, not read-only).
- // To fully sign out, log out at auth.agentabrams.com (clearing ga_session
- // alone would just be re-minted from aafleet).
- if (await fleetSsoOk(req.cookies.get(FLEET_SSO_COOKIE)?.value)) {
- const ga = await createSession({ sub: "fleet-sso", email: "fleet@agentabrams.com", role: "ANALYST" });
- const res = NextResponse.next();
- res.cookies.set(SESSION_COOKIE, ga, {
- httpOnly: true,
- secure: true,
- sameSite: "lax",
- path: "/",
- maxAge: SESSION_MAX_AGE,
- });
- return res;
- }
-
- // API → 401 JSON; page → redirect to login with a return path.
- if (pathname.startsWith("/api/")) {
- return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
- }
- const url = req.nextUrl.clone();
- url.pathname = "/login";
- url.searchParams.set("next", pathname);
- return NextResponse.redirect(url);
-}
-
-export const config = {
- // Run on everything except Next internals + static asset files.
- matcher: ["/((?!_next/static|_next/image|favicon.ico|.*\\.(?:png|jpg|jpeg|svg|gif|ico|css|js|map|txt)$).*)"],
-};
diff --git a/govarbitrage/src/pipeline/research.ts b/govarbitrage/src/pipeline/research.ts
deleted file mode 100644
index b541452..0000000
--- a/govarbitrage/src/pipeline/research.ts
+++ /dev/null
@@ -1,257 +0,0 @@
-import { prisma } from "@/lib/db";
-import { identifyProduct } from "@/lib/ai";
-import { estimateDemand } from "@/engines/demand";
-import { computeValuation } from "@/engines/valuation";
-import { computeCosts } from "@/engines/costs";
-import { computeScores } from "@/engines/scoring";
-import { estimateFreight } from "@/engines/freight";
-import { clamp } from "@/lib/utils";
-import type { ConditionKey, SourceKey } from "@/engines/types";
-
-export interface ResearchOptions {
- /** Run the local AI identifier (Ollama). Off by default for deterministic seeds. */
- useAI?: boolean;
- /** Deterministic overrides (used by the seeder to inject realistic anchors). */
- anchor?: { newRetail?: number; demandScore?: number };
- comparables?: {
- kind: "SOLD" | "ACTIVE" | "RETAIL";
- title: string;
- price: number;
- url?: string;
- source?: string;
- soldAt?: Date;
- }[];
- /** Persist AI-identified manufacturer/model back onto the listing. */
- writeIdentity?: boolean;
-}
-
-/** Infer local-pickup requirement from weight + auction terms. */
-function inferLocalPickup(weightLbs: number, terms?: string | null): boolean {
- const t = (terms || "").toLowerCase();
- if (t.includes("pickup only") || t.includes("pick up only") || t.includes("no shipping")) return true;
- if (t.includes("shipping available") || t.includes("will ship")) return false;
- return weightLbs > 300; // heavy lots are usually pickup-only at gov auctions
-}
-
-/**
- * Full research run for one listing: identify → value → cost → score → persist.
- * Idempotent (upserts), safe to re-run. Returns a compact summary.
- */
-export async function runResearch(listingId: string, opts: ResearchOptions = {}) {
- const listing = await prisma.listing.findUnique({ where: { id: listingId } });
- if (!listing) throw new Error(`Listing ${listingId} not found`);
-
- await prisma.listing.update({
- where: { id: listingId },
- data: { researchStatus: "IN_PROGRESS" },
- });
-
- const text = [listing.title, listing.category, listing.description]
- .filter(Boolean)
- .join("\n");
- const heuristic = estimateDemand(text);
-
- // Identity + anchor resolution: overrides > AI > heuristic.
- let manufacturer = listing.manufacturer;
- let model = listing.model;
- let category = listing.category;
- let newRetail = opts.anchor?.newRetail ?? heuristic.retailFloor;
- let demandScore = opts.anchor?.demandScore ?? heuristic.demandScore;
- let identificationConfidence = 0.45; // heuristic baseline
- let identifiedBy = "heuristic";
- let identifyRaw: unknown = { heuristic };
-
- if (opts.useAI) {
- const { result, model: aiModel } = await identifyProduct({
- title: listing.title,
- description: listing.description,
- category: listing.category,
- });
- if (result) {
- manufacturer = result.manufacturer || manufacturer;
- model = result.model || model;
- category = result.category || category;
- if (typeof result.estimatedNewRetail === "number" && result.estimatedNewRetail > 0) {
- // Blend AI estimate with the heuristic floor to avoid wild outliers.
- newRetail = Math.max(result.estimatedNewRetail, heuristic.retailFloor * 0.5);
- }
- if (typeof result.demandScore === "number") demandScore = clamp(result.demandScore, 0, 100);
- identificationConfidence = clamp(result.confidence ?? 0.6, 0, 1);
- identifiedBy = aiModel;
- identifyRaw = result;
- }
- }
-
- const condition = listing.condition as ConditionKey;
- const comps = opts.comparables ?? [];
-
- // --- Valuation ---
- const valuation = computeValuation({
- newRetail,
- condition,
- quantity: listing.quantity,
- demandScore,
- identificationConfidence,
- comparableCount: comps.length,
- });
-
- // --- Costs (winning bid modeled as the current bid) ---
- const weightLbs = listing.weightLbs ?? 0;
- const localPickup = inferLocalPickup(weightLbs, listing.auctionTerms);
- const fr = estimateFreight(weightLbs);
- const costs = computeCosts({
- source: listing.source as SourceKey,
- winningBid: Number(listing.currentBid),
- quantity: listing.quantity,
- weightLbs,
- condition,
- expectedSalePrice: valuation.expectedSalePrice,
- daysUntilSold: valuation.daysUntilSold,
- localPickup,
- });
-
- // --- Scores ---
- const scores = computeScores({
- roi: costs.roi,
- expectedNetProfit: costs.expectedNetProfit,
- demandScore,
- daysUntilSold: valuation.daysUntilSold,
- weightLbs,
- condition,
- bidCount: listing.bidCount,
- localPickup,
- hasBuyerLeads: false,
- confidenceScore: valuation.confidenceScore,
- probabilityOfSale: valuation.probabilityOfSale,
- isFreight: fr.isFreight,
- });
-
- // --- Persist ---
- await prisma.$transaction(async (tx) => {
- await tx.research.upsert({
- where: { listingId },
- create: {
- listingId,
- ...valuationToDb(valuation),
- sources: comps.map((c) => ({ name: c.source ?? "comp", url: c.url, kind: c.kind, price: c.price })),
- summary: buildSummary(listing.title, valuation, costs, demandScore),
- model: identifiedBy,
- },
- update: {
- ...valuationToDb(valuation),
- summary: buildSummary(listing.title, valuation, costs, demandScore),
- model: identifiedBy,
- },
- });
-
- await tx.costBreakdown.upsert({
- where: { listingId },
- create: { listingId, ...costsToDb(costs) },
- update: { ...costsToDb(costs) },
- });
-
- // Replace comparables.
- await tx.comparable.deleteMany({ where: { listingId } });
- if (comps.length) {
- await tx.comparable.createMany({
- data: comps.map((c) => ({
- listingId,
- kind: c.kind,
- title: c.title,
- price: c.price,
- url: c.url,
- source: c.source,
- soldAt: c.soldAt,
- })),
- });
- }
-
- await tx.score.deleteMany({ where: { listingId } });
- await tx.score.createMany({
- data: scores.map((s) => ({
- listingId,
- profile: s.profile,
- value: s.value,
- arbitrage: s.components.arbitrage,
- demand: s.components.demand,
- velocity: s.components.velocity,
- logistics: s.components.logistics,
- condition: s.components.condition,
- competition: s.components.competition,
- buyer: s.components.buyer,
- risk: s.risk,
- dropShip: s.dropShip,
- explanation: s.explanation,
- factors: s.factors,
- })),
- });
-
- await tx.listing.update({
- where: { id: listingId },
- data: {
- researchStatus: "COMPLETE",
- identifiedBy,
- identifyRaw: identifyRaw as object,
- ...(opts.writeIdentity ? { manufacturer, model, category } : {}),
- },
- });
-
- await tx.listingEvent.create({
- data: {
- listingId,
- type: "RESEARCH_COMPLETED",
- message: `Research complete via ${identifiedBy}: est. net ${costs.expectedNetProfit.toFixed(0)}, ROI ${(costs.roi * 100).toFixed(0)}%`,
- meta: { model: identifiedBy },
- },
- });
- });
-
- return {
- listingId,
- expectedNetProfit: costs.expectedNetProfit,
- roi: costs.roi,
- overallScore: scores.find((s) => s.profile === "OVERALL_OPPORTUNITY")?.value ?? 0,
- identifiedBy,
- };
-}
-
-function valuationToDb(v: ReturnType<typeof computeValuation>) {
- return {
- newRetail: v.newRetail,
- newReplacement: v.newReplacement,
- avgRetail: v.avgRetail,
- usedSoldPrice: v.usedSoldPrice,
- usedAskingPrice: v.usedAskingPrice,
- usedLow: v.usedLow,
- usedHigh: v.usedHigh,
- wholesaleValue: v.wholesaleValue,
- liquidationValue: v.liquidationValue,
- sellTodayValue: v.sellTodayValue,
- value7Day: v.value7Day,
- value30Day: v.value30Day,
- value90Day: v.value90Day,
- expectedSalePrice: v.expectedSalePrice,
- probabilityOfSale: v.probabilityOfSale,
- daysUntilSold: v.daysUntilSold,
- confidenceScore: v.confidenceScore,
- };
-}
-
-function costsToDb(c: ReturnType<typeof computeCosts>) {
- const { assumptions, ...rest } = c;
- return { ...rest, assumptions: assumptions as object };
-}
-
-function buildSummary(
- title: string,
- v: ReturnType<typeof computeValuation>,
- c: ReturnType<typeof computeCosts>,
- demand: number,
-): string {
- return (
- `${title}: est. resale ${v.expectedSalePrice.toFixed(0)} vs new retail ${v.newRetail.toFixed(0)}. ` +
- `At the current bid, total-in ${c.totalInvestment.toFixed(0)} → net ${c.expectedNetProfit.toFixed(0)} ` +
- `(${(c.roi * 100).toFixed(0)}% ROI). Demand ${demand.toFixed(0)}/100, ~${v.daysUntilSold} days to sell, ` +
- `confidence ${v.confidenceScore.toFixed(0)}/100. Recommended max bid ${c.recommendedMaxBid.toFixed(0)}.`
- );
-}
diff --git a/govarbitrage/src/worker/index.ts b/govarbitrage/src/worker/index.ts
deleted file mode 100644
index 5162357..0000000
--- a/govarbitrage/src/worker/index.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import { prisma } from "@/lib/db";
-import { runResearch } from "@/pipeline/research";
-import { ollamaReachable } from "@/lib/ai";
-
-// Research worker. Two modes:
-// • REDIS_URL set → BullMQ worker consuming a "research" queue.
-// • REDIS_URL unset → direct poll loop over PENDING listings (fine at this scale).
-
-const QUEUE = "research";
-
-async function processListing(listingId: string) {
- await prisma.listing.update({ where: { id: listingId }, data: { researchStatus: "QUEUED" } });
- try {
- const r = await runResearch(listingId, { useAI: true, writeIdentity: true });
- console.log(`✓ researched ${listingId} — net ${r.expectedNetProfit.toFixed(0)}, ROI ${(r.roi * 100).toFixed(0)}%`);
- } catch (e) {
- await prisma.listing.update({ where: { id: listingId }, data: { researchStatus: "FAILED" } });
- await prisma.listingEvent.create({
- data: { listingId, type: "RESEARCH_FAILED", message: (e as Error).message },
- });
- console.error(`✗ ${listingId}: ${(e as Error).message}`);
- }
-}
-
-async function pendingIds(): Promise<string[]> {
- const rows = await prisma.listing.findMany({
- where: { researchStatus: { in: ["PENDING", "QUEUED"] } },
- select: { id: true },
- take: 25,
- });
- return rows.map((r) => r.id);
-}
-
-async function main() {
- const local = await ollamaReachable();
- console.log(`GovArbitrage worker starting. Local AI (Ollama) reachable: ${local}`);
-
- if (process.env.REDIS_URL) {
- // BullMQ mode (optional dependency).
- const { Worker, Queue } = await import("bullmq");
- const connection = { url: process.env.REDIS_URL };
- const queue = new Queue(QUEUE, { connection });
- // Enqueue any currently-pending listings.
- for (const id of await pendingIds()) await queue.add("research", { listingId: id });
- const worker = new Worker(
- QUEUE,
- async (job) => processListing(job.data.listingId as string),
- { connection, concurrency: 2 },
- );
- worker.on("completed", (job) => console.log(`job ${job.id} done`));
- console.log("BullMQ worker online.");
- } else {
- // Direct poll loop.
- console.log("No REDIS_URL — running direct poll loop (Ctrl-C to stop).");
- for (;;) {
- const ids = await pendingIds();
- for (const id of ids) await processListing(id);
- await new Promise((r) => setTimeout(r, 5000));
- }
- }
-}
-
-main().catch((e) => {
- console.error(e);
- process.exit(1);
-});
diff --git a/govarbitrage/store-assets/app-store-listing.md b/govarbitrage/store-assets/app-store-listing.md
deleted file mode 100644
index cda16a6..0000000
--- a/govarbitrage/store-assets/app-store-listing.md
+++ /dev/null
@@ -1,153 +0,0 @@
-# GovArbitrage — App Store Connect listing (paste-ready)
-
-App record: **6799165231** · bundle `com.abrams.govarbitrage` · build #5 (v1.0.0)
-Drafted 2026-08-07. Everything below is copy-paste into ASC → App Information / 1.0 Prepare for Submission.
-
----
-
-## Name (≤30)
-GovArbitrage
-
-## Subtitle (≤30)
-Gov surplus auction arbitrage
-
-## Promotional Text (≤170, editable anytime)
-Turn government surplus auctions into ranked flip opportunities — all-in cost, resale value, ROI, and your max bid computed for every lot. Stop guessing. Bid on math.
-
-## Keywords (≤100, comma-separated, no spaces)
-surplus,auction,arbitrage,resale,flip,govdeals,gsa,reseller,liquidation,valuation,roi,bid,wholesale
-
-## Description (≤4000)
-GovArbitrage turns messy government-surplus auctions into clear, ranked flip opportunities. Point it at a lot and it answers the only question that matters: if you win at the current bid, what is your all-in cost, what can you resell it for, how fast, and how much do you actually make?
-
-WHAT IT DOES
-• Aggregates listings from major government auction sources — GovDeals, GSA Auctions, Public Surplus, Municibid, Bid4Assets, and county / state / university surplus.
-• Identifies what each lot actually is from its title and photos, then anchors it to a real new-retail price.
-• Builds a full valuation ladder — replacement, average, and used-market resale across sell-today, 7-, 30-, and 90-day horizons, with an expected sale price, probability of sale, and days-to-sold.
-• Breaks down 20+ real costs — buyer's premium, sales tax, shipping, freight, packing, pickup labor, testing, repairs, marketplace and payment fees, storage — into total investment, net profit, ROI, and annualized return.
-• Back-solves your recommended max bid from a target ROI, so you know your ceiling before you bid.
-• Ranks every lot across nine opportunity profiles — Best Arbitrage, Quick Flip, Collector, Local Pickup, Easy Freight, Parts Only, High Confidence, High Profit, and Overall Opportunity — each with plain-English reasoning.
-
-WHY IT IS DIFFERENT
-The numbers come from deterministic, explainable engines — not a black box. Every value and every cost is transparent and traceable, so you can trust the recommended bid instead of eyeballing it.
-
-PRIVACY-FIRST
-No tracking. No ads. No analytics or advertising SDKs. The app works fully without an account; optional Sign in with Apple is used only to authenticate you.
-
-GovArbitrage is built for resellers, flippers, and surplus buyers who want to stop guessing and start bidding on math.
-
-## URLs
-- Privacy Policy URL: https://auctions.agentabrams.com/privacy ← (goes live after the redeploy below)
-- Support URL: https://auctions.agentabrams.com
-- Marketing URL: https://auctions.agentabrams.com
-
-## Category
-Primary: Business · Secondary: Finance
-
-## Age rating
-Answer the questionnaire "None" across the board → expected 4+.
-
----
-
-## ⚠️ Before you hit "Submit for Review" — two things I can't do for you
-
-1. **Redeploy the web app to auctions.agentabrams.com** so `/privacy` is live publicly.
- The privacy page + the public-exemption fix are committed (612c4d6), but the CURRENT
- deploy on auctions.agentabrams.com is older (it 404s on /privacy). Apple WILL reject a
- privacy URL that 404s. Deploy the current `main`, then verify:
- `curl -s -o /dev/null -w "%{http_code}\n" https://auctions.agentabrams.com/privacy` → must be `200`.
-
-2. **App Review access — RESOLVED (low risk).** Verified against the live API 2026-08-07:
- the app ships preconfigured to https://auctions.agentabrams.com and `/api/listings` returns
- real data with NO auth, so a reviewer sees live listings on launch — no empty-app rejection.
- Sensitive endpoints (/api/credentials) correctly stay 401-gated. Paste the note below into
- ASC → App Review Information, and set "Sign-In required" = NO.
-
-### App Review Information → Notes (copy-paste)
-GovArbitrage is a read-only analyst client for PUBLIC U.S. government-surplus auction listings. No account or sign-in is required to review the app.
-
-HOW TO TEST
-1) Launch the app and open the "Listings" tab. It loads live government-surplus auction opportunities immediately — the app ships preconfigured to our public API server (https://auctions.agentabrams.com), so there is no setup or login step.
-2) Tap any listing to see the full analysis: all-in cost breakdown, resale value across 7/30/90-day horizons, expected net profit, ROI, recommended max bid, and nine opportunity scores.
-3) The "Settings" tab shows the server URL plus an OPTIONAL username/password, used only by people who self-host their own GovArbitrage server. These are NOT required for review — leave the defaults and data loads. To exercise the credential field anyway, use Username: admin Password: DW2024!
-
-PRIVACY: No tracking, no ads, no analytics SDKs. The app works without an account; the optional "Sign in with Apple" stores only your Apple ID and (if shared) name/email to authenticate you. Full policy: https://auctions.agentabrams.com/privacy
-
-### App Review Information → other fields
-- Sign-In required: **No** (toggle off)
-- Contact: your name / email / phone (Apple only contacts you here if there's a question)
-
----
-
-## App Privacy questionnaire (ASC → App Privacy → Get Started)
-
-⚠️ NOT "Data Not Collected" — the app has optional **Sign in with Apple** (lib/auth.ts requests
-FULL_NAME + EMAIL scopes; /api/auth/apple stores appleSub + email + name). Declaring "collects
-nothing" would contradict the app and risk a pull. Below is the accurate, still-clean label.
-The privacy page was updated to match (src/app/privacy/page.tsx — publishes on next deploy).
-
-**Q: "Do you or your third-party partners collect data from this app?" → YES**
-
-Then check EXACTLY these three data types (all collected ONLY via optional Sign in with Apple):
-
-| Data type (grid) | Category | Linked to identity? | Used for tracking? | Purpose |
-|---|---|---|---|---|
-| **Email Address** | Contact Info | Yes | No | App Functionality |
-| **Name** | Contact Info | Yes | No | App Functionality |
-| **User ID** | Identifiers | Yes | No | App Functionality |
-
-For each of the three, on the next screens select:
-- Purpose → **App Functionality** (only)
-- "Is this data linked to the user's identity?" → **Yes**
-- "Do you use this data for tracking?" → **No**
-
-**Leave everything else UNCHECKED** — no Usage Data, no Diagnostics/Crash, no Location, no
-Financial Info, no Purchases, no Contacts, no Search/Browsing History, no Device IDs, no
-Advertising Data. (The app links no analytics/crash/ads SDKs — verified in package.json.)
-
-**Tracking question:** the app does **NOT** track — no data is used to track across other
-companies' apps/websites, so no App Tracking Transparency (ATT) prompt is required.
-
-Notes:
-- If a user picks Apple's "Hide My Email," you still store an email-format address → still
- declare **Email Address** (correct either way).
-- This label is consistent with the updated privacy policy's "What the iOS app collects"
- section (default = nothing; optional Apple sign-in = Apple ID + name/email for auth only).
-
-## Screenshots (required, you provide)
-6.7" and 6.5" iPhone at minimum. Capture the dense analyst dashboard + a listing detail
-(the valuation ladder + cost breakdown + the nine-profile scores) — those are the money shots.
-
----
-
-## Age Rating questionnaire (ASC → Age Rating → Set Up / Edit)
-
-GovArbitrage is a business/finance data tool — no objectionable content. Answer every
-content-frequency question **None**, and the capability questions **No**. Result → **4+**.
-
-Content categories — all **None**:
-- Cartoon or Fantasy Violence — None
-- Realistic Violence — None
-- Prolonged Graphic or Sadistic Realistic Violence — None
-- Sexual Content or Nudity / Graphic Sexual Content and Nudity — None
-- Profanity or Crude Humor — None
-- Mature / Suggestive Themes — None
-- Horror / Fear Themes — None
-- Alcohol, Tobacco, or Drug Use or References — None
-- Simulated Gambling — None
-- Medical / Treatment Information — None
-
-Capabilities / other:
-- **Unrestricted Web Access → No.** The app opens external government-auction source links
- in the system browser; it has no in-app open-ended web browser.
-- **Gambling (real) & Contests → No.** Bidding analysis for government-surplus auctions is
- commerce, not gambling — no wagering, no games of chance in the app.
-- **Made for Kids → No.**
-- **Age Assurance / parental controls → not applicable.**
-
-Expected result: **4+**.
-
-Note on the two questions people second-guess:
-- "Simulated Gambling" = slot-machine / casino simulations. Auction bidding is NOT gambling → None.
-- "Unrestricted Web Access" = an in-app browser that can reach any site. Opening a source URL
- in Safari is NOT that → No.
diff --git a/govarbitrage/tests/e2e/smoke.spec.ts b/govarbitrage/tests/e2e/smoke.spec.ts
deleted file mode 100644
index ce56f01..0000000
--- a/govarbitrage/tests/e2e/smoke.spec.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { test, expect } from "@playwright/test";
-
-test("dashboard renders with cards and the listings table", async ({ page }) => {
- await page.goto("/");
- await expect(page.getByRole("heading", { name: /GovArbitrage/i })).toBeVisible();
- await expect(page.getByText("Active Auctions")).toBeVisible();
- await expect(page.getByText("Expected Profit")).toBeVisible();
- // The table loads listings from the API.
- await expect(page.getByText(/listings$/)).toBeVisible();
-});
-
-test("listings API returns computed rows", async ({ request }) => {
- const res = await request.get("/api/listings?pageSize=5");
- expect(res.ok()).toBeTruthy();
- const data = await res.json();
- expect(data.total).toBeGreaterThan(0);
- expect(data.rows[0]).toHaveProperty("netProfit");
- expect(data.rows[0]).toHaveProperty("opportunityScore");
-});
-
-test("scoring profile switch changes ordering", async ({ request }) => {
- const overall = await (await request.get("/api/listings?profile=OVERALL_OPPORTUNITY&pageSize=1&sort=opportunityScore&dir=desc")).json();
- const highProfit = await (await request.get("/api/listings?profile=HIGH_PROFIT&pageSize=1&sort=opportunityScore&dir=desc")).json();
- expect(overall.rows[0]).toBeTruthy();
- expect(highProfit.rows[0]).toBeTruthy();
-});
-
-test("selling-avenues page lists real sourcing links", async ({ page }) => {
- await page.goto("/selling-avenues");
- await expect(page.getByRole("heading", { name: /Sourcing & Selling Avenues/i })).toBeVisible();
- await expect(page.getByRole("link", { name: /GovDeals/i }).first()).toBeVisible();
-});
-
-test("reports page renders performance tables", async ({ page }) => {
- await page.goto("/reports");
- await expect(page.getByRole("heading", { name: "Reports" })).toBeVisible();
- await expect(page.getByText("Category Performance")).toBeVisible();
-});
diff --git a/govarbitrage/tsconfig.json b/govarbitrage/tsconfig.json
deleted file mode 100644
index 362394b..0000000
--- a/govarbitrage/tsconfig.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "compilerOptions": {
- "target": "ES2022",
- "lib": [
- "dom",
- "dom.iterable",
- "ES2022"
- ],
- "allowJs": true,
- "skipLibCheck": true,
- "strict": true,
- "noEmit": true,
- "esModuleInterop": true,
- "module": "esnext",
- "moduleResolution": "bundler",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "jsx": "react-jsx",
- "incremental": true,
- "verbatimModuleSyntax": false,
- "plugins": [
- {
- "name": "next"
- }
- ],
- "paths": {
- "@/*": [
- "./src/*"
- ]
- }
- },
- "include": [
- "next-env.d.ts",
- "**/*.ts",
- "**/*.tsx",
- ".next/types/**/*.ts",
- ".next/dev/types/**/*.ts"
- ],
- "exclude": [
- "node_modules",
- "apps",
- "extension"
- ]
-}
diff --git a/govarbitrage/tsconfig.tsbuildinfo b/govarbitrage/tsconfig.tsbuildinfo
deleted file mode 100644
index d1bf00c..0000000
--- a/govarbitrage/tsconfig.tsbuildinfo
+++ /dev/null
@@ -1 +0,0 @@
-{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/lib/fallback.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/entry-constants.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/lib/bundler.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/request/search-params.d.ts","./node_modules/next/dist/shared/lib/segment-cache/vary-params-decoding.d.ts","./node_modules/next/dist/server/app-render/vary-params.d.ts","./node_modules/next/dist/server/request/params.d.ts","./node_modules/next/dist/server/route-kind.d.ts","./node_modules/next/dist/server/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/lib/cache-control.d.ts","./node_modules/next/dist/shared/lib/app-router-types.d.ts","./node_modules/next/dist/server/lib/cache-handlers/types.d.ts","./node_modules/next/dist/server/use-cache/use-cache-wrapper.d.ts","./node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","./node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","./node_modules/next/dist/lib/constants.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","./node_modules/next/dist/build/static-paths/types.d.ts","./node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","./node_modules/next/dist/build/adapter/setup-node-env.external.d.ts","./node_modules/next/dist/server/instrumentation/types.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/lib/worker.d.ts","./node_modules/next/dist/server/lib/experimental/ppr.d.ts","./node_modules/next/dist/lib/page-types.d.ts","./node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","./node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/server/node-environment-baseline.d.ts","./node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-file.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-exit.d.ts","./node_modules/next/dist/server/node-environment-extensions/console-dim.external.d.ts","./node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.d.ts","./node_modules/next/dist/server/node-environment-extensions/random.d.ts","./node_modules/next/dist/server/node-environment-extensions/date.d.ts","./node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","./node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","./node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","./node_modules/next/dist/server/lib/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/shared/lib/deep-readonly.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/next/dist/client/components/readonly-url-search-params.d.ts","./node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/next/dist/client/flight-data-helpers.d.ts","./node_modules/next/dist/client/components/segment-cache/cache-key.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/segment-cache/types.d.ts","./node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts","./node_modules/next/dist/client/components/segment-cache/scheduler.d.ts","./node_modules/next/dist/client/components/segment-cache/cache-map.d.ts","./node_modules/next/dist/client/components/segment-cache/vary-path.d.ts","./node_modules/next/dist/client/components/segment-cache/cache.d.ts","./node_modules/next/dist/client/components/router-reducer/ppr-navigations.d.ts","./node_modules/next/dist/client/components/segment-cache/navigation.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","./node_modules/next/dist/build/templates/pages.d.ts","./node_modules/next/dist/server/route-modules/pages/module.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/normalizers/normalizer.d.ts","./node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","./node_modules/next/dist/server/normalizers/request/suffix.d.ts","./node_modules/next/dist/server/normalizers/request/rsc.d.ts","./node_modules/next/dist/server/normalizers/request/next-data.d.ts","./node_modules/next/dist/server/after/builtin-request-context.d.ts","./node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","./node_modules/next/dist/server/route-modules/pages/builtin/_error.d.ts","./node_modules/next/dist/server/load-default-error-components.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/after/after.d.ts","./node_modules/next/dist/server/after/after-context.d.ts","./node_modules/next/dist/server/use-cache/cache-life.d.ts","./node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","./node_modules/next/dist/server/lib/lazy-result.d.ts","./node_modules/next/dist/server/app-render/create-error-handler.d.ts","./node_modules/next/dist/shared/lib/action-revalidation-kind.d.ts","./node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","./node_modules/next/dist/server/async-storage/work-store.d.ts","./node_modules/next/dist/server/web/http.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","./node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/next/dist/client/components/redirect-error.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/next/dist/server/app-render/cache-signal.d.ts","./node_modules/next/dist/server/app-render/instant-validation/boundary-tracking.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-validation-error.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-samples.d.ts","./node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","./node_modules/next/dist/server/lib/implicit-tags.d.ts","./node_modules/next/dist/server/app-render/staged-rendering.d.ts","./node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","./node_modules/next/dist/build/templates/app-route.d.ts","./node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","./node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.d.ts","./node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","./node_modules/next/dist/build/segment-config/app/app-segments.d.ts","./node_modules/next/dist/build/get-supported-browsers.d.ts","./node_modules/next/dist/build/utils.d.ts","./node_modules/next/dist/build/rendering-mode.d.ts","./node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","./node_modules/next/dist/server/lib/cpu-profile.d.ts","./node_modules/next/dist/build/turborepo-access-trace/types.d.ts","./node_modules/next/dist/build/turborepo-access-trace/result.d.ts","./node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","./node_modules/next/dist/build/turborepo-access-trace/index.d.ts","./node_modules/next/dist/export/routes/types.d.ts","./node_modules/next/dist/export/types.d.ts","./node_modules/next/dist/export/worker.d.ts","./node_modules/next/dist/build/worker.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/trace/types.d.ts","./node_modules/next/dist/trace/trace.d.ts","./node_modules/next/dist/trace/shared.d.ts","./node_modules/next/dist/trace/index.d.ts","./node_modules/next/dist/build/load-jsconfig.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","./node_modules/next/dist/telemetry/storage.d.ts","./node_modules/next/dist/build/build-context.d.ts","./node_modules/next/dist/build/webpack-config.d.ts","./node_modules/next/dist/build/swc/generated-native.d.ts","./node_modules/next/dist/build/define-env.d.ts","./node_modules/next/dist/build/swc/index.d.ts","./node_modules/next/dist/build/swc/types.d.ts","./node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/next/dist/next-devtools/shared/types.d.ts","./node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/cache-indicator.d.ts","./node_modules/next/dist/server/lib/parse-stack.d.ts","./node_modules/next/dist/next-devtools/server/shared.d.ts","./node_modules/next/dist/next-devtools/shared/stack-frame.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts","./node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts","./node_modules/next/dist/server/dev/debug-channel.d.ts","./node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/server/lib/async-callback-set.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/sharp/lib/index.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/server/lib/types.d.ts","./node_modules/next/dist/server/lib/lru-cache.d.ts","./node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts","./node_modules/next/dist/server/route-modules/route-module.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/server/web/adapter.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","./node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/next/dist/client/components/client-page.d.ts","./node_modules/next/dist/client/components/client-segment.d.ts","./node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/dist/lib/metadata/types/resolvers.d.ts","./node_modules/next/dist/lib/metadata/types/icons.d.ts","./node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","./node_modules/next/dist/lib/metadata/metadata.d.ts","./node_modules/next/dist/lib/framework/boundary-components.d.ts","./node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/next/dist/server/app-render/rsc/postpone.d.ts","./node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/next/dist/server/app-render/collect-segment-data.d.ts","./node_modules/next/dist/server/app-render/instant-validation/instant-validation.d.ts","./node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts","./node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/next/dist/server/route-modules/app-page/helpers/prerender-manifest-matcher.d.ts","./node_modules/@types/react/jsx-dev-runtime.d.ts","./node_modules/@types/react/compiler-runtime.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","./node_modules/@types/react-dom/client.d.ts","./node_modules/@types/react-dom/static.d.ts","./node_modules/@types/react-dom/server.d.ts","./node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","./node_modules/next/dist/server/route-modules/app-page/module.d.ts","./node_modules/next/dist/server/request/fallback-params.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/server/web/spec-extension/url-pattern.d.ts","./node_modules/next/dist/server/after/index.d.ts","./node_modules/next/dist/server/request/connection.d.ts","./node_modules/next/dist/server/web/exports/index.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/cli/next-test.d.ts","./node_modules/next/dist/shared/lib/size-limit.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/build/adapter/build-complete.d.ts","./node_modules/next/dist/types.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/next/dist/server/use-cache/cache-tag.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/dist/client/components/catch-error.d.ts","./node_modules/next/dist/api/error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/server/request/cookies.d.ts","./node_modules/next/dist/server/request/headers.d.ts","./node_modules/next/dist/server/request/draft-mode.d.ts","./node_modules/next/headers.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/dist/client/components/unrecognized-action-error.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/next/dist/client/components/forbidden.d.ts","./node_modules/next/dist/client/components/unauthorized.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","./node_modules/next/dist/client/components/unstable-rethrow.d.ts","./node_modules/next/dist/client/components/navigation.react-server.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/types/compiled.d.ts","./node_modules/next/types.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./next-env.d.ts","./next.config.ts","./node_modules/playwright-core/types/protocol.d.ts","./node_modules/playwright-core/types/structs.d.ts","./node_modules/zod/v3/helpers/typealiases.d.cts","./node_modules/zod/v3/helpers/util.d.cts","./node_modules/zod/v3/index.d.cts","./node_modules/zod/v3/zoderror.d.cts","./node_modules/zod/v3/locales/en.d.cts","./node_modules/zod/v3/errors.d.cts","./node_modules/zod/v3/helpers/parseutil.d.cts","./node_modules/zod/v3/helpers/enumutil.d.cts","./node_modules/zod/v3/helpers/errorutil.d.cts","./node_modules/zod/v3/helpers/partialutil.d.cts","./node_modules/zod/v3/standard-schema.d.cts","./node_modules/zod/v3/types.d.cts","./node_modules/zod/v3/external.d.cts","./node_modules/zod/index.d.cts","./node_modules/playwright-core/types/types.d.ts","./node_modules/playwright-core/index.d.ts","./node_modules/playwright/types/test.d.ts","./node_modules/playwright/test.d.ts","./node_modules/@playwright/test/index.d.ts","./playwright.config.ts","./node_modules/@vitest/spy/optional-types.d.ts","./node_modules/@vitest/spy/dist/index.d.ts","./node_modules/tinyrainbow/dist/index.d.ts","./node_modules/@standard-schema/spec/dist/index.d.ts","./node_modules/@vitest/pretty-format/dist/index.d.ts","./node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","./node_modules/@vitest/utils/dist/diff.d.ts","./node_modules/@vitest/utils/dist/display.d.ts","./node_modules/@types/deep-eql/index.d.ts","./node_modules/assertion-error/index.d.ts","./node_modules/@types/chai/index.d.ts","./node_modules/@vitest/expect/dist/index.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/esbuild/lib/main.d.ts","./node_modules/vite/types/internal/terseroptions.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/lightningcss/node/ast.d.ts","./node_modules/lightningcss/node/targets.d.ts","./node_modules/lightningcss/node/index.d.ts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/@vitest/utils/dist/types.d.ts","./node_modules/@vitest/utils/dist/helpers.d.ts","./node_modules/@vitest/utils/dist/timers.d.ts","./node_modules/@vitest/utils/dist/index.d.ts","./node_modules/@vitest/runner/dist/tasks.d-deyaimiu.d.ts","./node_modules/@vitest/runner/dist/index.d.ts","./node_modules/vitest/dist/chunks/traces.d.d2t_r8rx.d.ts","./node_modules/@vitest/snapshot/dist/environment.d-dojxxzv9.d.ts","./node_modules/@vitest/snapshot/dist/rawsnapshot.d-d_x3-62x.d.ts","./node_modules/@vitest/snapshot/dist/index.d.ts","./node_modules/vitest/dist/chunks/config.d.a1h_y6jt.d.ts","./node_modules/vitest/dist/chunks/environment.d.crsxczp1.d.ts","./node_modules/vitest/dist/chunks/rpc.d.b_8spu0w.d.ts","./node_modules/vitest/dist/chunks/worker.d.zphpo4yb.d.ts","./node_modules/vitest/dist/chunks/browser.d.bcoexmfg.d.ts","./node_modules/vitest/optional-types.d.ts","./node_modules/@vitest/runner/dist/utils.d.ts","./node_modules/tinybench/dist/index.d.ts","./node_modules/vitest/dist/chunks/benchmark.d.daahlpsq.d.ts","./node_modules/@vitest/mocker/dist/types.d-bji5eawu.d.ts","./node_modules/@vitest/mocker/dist/index.d-b41z0auw.d.ts","./node_modules/@vitest/mocker/dist/index.d.ts","./node_modules/@vitest/utils/dist/source-map.d.ts","./node_modules/vitest/dist/chunks/coverage.d.bztk59wp.d.ts","./node_modules/@vitest/utils/dist/serialize.d.ts","./node_modules/@vitest/utils/dist/error.d.ts","./node_modules/vitest/dist/browser.d.ts","./node_modules/vitest/browser/context.d.ts","./node_modules/@vitest/snapshot/dist/manager.d.ts","./node_modules/vitest/dist/chunks/reporters.d.dtokvv2s.d.ts","./node_modules/vitest/dist/chunks/plugin.d.dwfiij7i.d.ts","./node_modules/vitest/dist/config.d.ts","./node_modules/vitest/config.d.ts","./vitest.config.ts","./node_modules/@prisma/client/runtime/library.d.ts","./node_modules/.prisma/client/index.d.ts","./node_modules/.prisma/client/default.d.ts","./node_modules/@prisma/client/default.d.ts","./src/lib/db.ts","./src/lib/ai.ts","./node_modules/clsx/clsx.d.mts","./node_modules/tailwind-merge/dist/types.d.ts","./src/lib/utils.ts","./src/engines/demand.ts","./src/engines/types.ts","./src/engines/constants.ts","./src/engines/valuation.ts","./src/engines/freight.ts","./src/engines/costs.ts","./src/engines/scoring.ts","./src/pipeline/research.ts","./src/lib/password.ts","./prisma/seed.ts","./src/lib/hot-deals.ts","./scripts/hot-deal-alert.ts","./src/importers/ingest.ts","./src/importers/apify-govdeals.ts","./scripts/import-apify-govdeals.ts","./src/importers/govdeals-free.ts","./scripts/import-govdeals-free.ts","./src/importers/govplanet-free.ts","./scripts/import-govplanet-free.ts","./src/importers/grays-free.ts","./scripts/import-grays.ts","./src/importers/gsa.ts","./scripts/import-gsa.ts","./src/importers/municibid-free.ts","./scripts/import-municibid-free.ts","./src/importers/publicsurplus-free.ts","./scripts/import-publicsurplus-free.ts","./scripts/liveness-sweep.ts","./node_modules/playwright/index.d.ts","./scripts/probe-govdeals.ts","./src/lib/digest-snapshot.ts","./scripts/seed-digest-snapshots.ts","./src/lib/listings.ts","./src/lib/digest-top.ts","./scripts/send-digest.ts","./node_modules/dotenv/config.d.ts","./src/lib/newsletter.ts","./src/lib/send-digest.ts","./scripts/send-newsletter-digest.ts","./scripts/set-admin.ts","./node_modules/vitest/dist/chunks/global.d.dvssrdq5.d.ts","./node_modules/vitest/optional-runtime-types.d.ts","./node_modules/vitest/dist/chunks/suite.d.udjtyagw.d.ts","./node_modules/vitest/dist/chunks/evaluatedmodules.d.bxj5omdx.d.ts","./node_modules/vitest/dist/runners.d.ts","./node_modules/expect-type/dist/utils.d.ts","./node_modules/expect-type/dist/overloads.d.ts","./node_modules/expect-type/dist/branding.d.ts","./node_modules/expect-type/dist/messages.d.ts","./node_modules/expect-type/dist/index.d.ts","./node_modules/vitest/dist/index.d.ts","./node_modules/jose/dist/types/types.d.ts","./node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","./node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","./node_modules/jose/dist/types/jwe/general/decrypt.d.ts","./node_modules/jose/dist/types/jwe/general/encrypt.d.ts","./node_modules/jose/dist/types/jws/compact/verify.d.ts","./node_modules/jose/dist/types/jws/flattened/verify.d.ts","./node_modules/jose/dist/types/jws/general/verify.d.ts","./node_modules/jose/dist/types/jwt/verify.d.ts","./node_modules/jose/dist/types/jwt/decrypt.d.ts","./node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","./node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","./node_modules/jose/dist/types/jws/compact/sign.d.ts","./node_modules/jose/dist/types/jws/flattened/sign.d.ts","./node_modules/jose/dist/types/jws/general/sign.d.ts","./node_modules/jose/dist/types/jwt/sign.d.ts","./node_modules/jose/dist/types/jwt/encrypt.d.ts","./node_modules/jose/dist/types/jwk/thumbprint.d.ts","./node_modules/jose/dist/types/jwk/embedded.d.ts","./node_modules/jose/dist/types/jwks/local.d.ts","./node_modules/jose/dist/types/jwks/remote.d.ts","./node_modules/jose/dist/types/jwt/unsecured.d.ts","./node_modules/jose/dist/types/key/export.d.ts","./node_modules/jose/dist/types/key/import.d.ts","./node_modules/jose/dist/types/util/decode_protected_header.d.ts","./node_modules/jose/dist/types/util/decode_jwt.d.ts","./node_modules/jose/dist/types/util/errors.d.ts","./node_modules/jose/dist/types/key/generate_key_pair.d.ts","./node_modules/jose/dist/types/key/generate_secret.d.ts","./node_modules/jose/dist/types/util/base64url.d.ts","./node_modules/jose/dist/types/index.d.ts","./src/lib/session.ts","./src/lib/fleet-sso.ts","./src/middleware.ts","./src/middleware.test.ts","./src/agents/framework.ts","./src/agents/appraiser.ts","./src/agents/skeptic-rules.ts","./src/agents/skeptic.ts","./src/agents/scout.ts","./src/agents/run.ts","./src/agents/skeptic-rules.test.ts","./src/lib/site.ts","./src/app/robots.ts","./src/app/sitemap.ts","./src/lib/places.ts","./src/lib/rate-limit.ts","./src/lib/tiers.ts","./src/lib/current-user.ts","./src/app/api/agents/search/route.ts","./src/app/api/auth/apple/route.ts","./src/app/api/auth/login/route.ts","./src/app/api/auth/logout/route.ts","./src/app/api/auth/me/route.ts","./node_modules/stripe/esm/net/httpclient.d.ts","./node_modules/stripe/esm/stripecontext.d.ts","./node_modules/stripe/esm/apiversion.d.ts","./node_modules/stripe/esm/lib.d.ts","./node_modules/stripe/esm/striperesource.d.ts","./node_modules/stripe/esm/crypto/cryptoprovider.d.ts","./node_modules/stripe/esm/stripeemitter.d.ts","./node_modules/stripe/esm/platform/platformfunctions.d.ts","./node_modules/stripe/esm/decimal.d.ts","./node_modules/stripe/esm/shared.d.ts","./node_modules/stripe/esm/resources/billing/metereventsummaries.d.ts","./node_modules/stripe/esm/resources/billing/meters.d.ts","./node_modules/stripe/esm/resources/coupons.d.ts","./node_modules/stripe/esm/resources/promotioncodes.d.ts","./node_modules/stripe/esm/resources/discounts.d.ts","./node_modules/stripe/esm/resources/taxrates.d.ts","./node_modules/stripe/esm/resources/creditnotelineitems.d.ts","./node_modules/stripe/esm/resources/feerefunds.d.ts","./node_modules/stripe/esm/resources/capabilities.d.ts","./node_modules/stripe/esm/resources/bankaccounts.d.ts","./node_modules/stripe/esm/resources/cards.d.ts","./node_modules/stripe/esm/resources/externalaccounts.d.ts","./node_modules/stripe/esm/resources/loginlinks.d.ts","./node_modules/stripe/esm/multipart.d.ts","./node_modules/stripe/esm/resources/filelinks.d.ts","./node_modules/stripe/esm/resources/files.d.ts","./node_modules/stripe/esm/resources/persons.d.ts","./node_modules/stripe/esm/resources/applications.d.ts","./node_modules/stripe/esm/resources/taxids.d.ts","./node_modules/stripe/esm/resources/accounts.d.ts","./node_modules/stripe/esm/resources/paymentintentamountdetailslineitems.d.ts","./node_modules/stripe/esm/resources/mandates.d.ts","./node_modules/stripe/esm/resources/sourcetransactions.d.ts","./node_modules/stripe/esm/resources/sources.d.ts","./node_modules/stripe/esm/resources/customersources.d.ts","./node_modules/stripe/esm/resources/setupintents.d.ts","./node_modules/stripe/esm/resources/setupattempts.d.ts","./node_modules/stripe/esm/resources/paymentmethods.d.ts","./node_modules/stripe/esm/resources/reviews.d.ts","./node_modules/stripe/esm/resources/paymentintents.d.ts","./node_modules/stripe/esm/resources/transferreversals.d.ts","./node_modules/stripe/esm/resources/transfers.d.ts","./node_modules/stripe/esm/resources/charges.d.ts","./node_modules/stripe/esm/resources/applicationfees.d.ts","./node_modules/stripe/esm/resources/connectcollectiontransfers.d.ts","./node_modules/stripe/esm/resources/customercashbalancetransactions.d.ts","./node_modules/stripe/esm/resources/disputes.d.ts","./node_modules/stripe/esm/resources/payouts.d.ts","./node_modules/stripe/esm/resources/reservetransactions.d.ts","./node_modules/stripe/esm/resources/taxdeductedatsources.d.ts","./node_modules/stripe/esm/resources/topups.d.ts","./node_modules/stripe/esm/resources/issuing/cardholders.d.ts","./node_modules/stripe/esm/resources/issuing/physicalbundles.d.ts","./node_modules/stripe/esm/resources/issuing/personalizationdesigns.d.ts","./node_modules/stripe/esm/resources/issuing/cards.d.ts","./node_modules/stripe/esm/resources/issuing/tokens.d.ts","./node_modules/stripe/esm/resources/issuing/disputes.d.ts","./node_modules/stripe/esm/resources/issuing/transactions.d.ts","./node_modules/stripe/esm/resources/issuing/authorizations.d.ts","./node_modules/stripe/esm/resources/issuing/index.d.ts","./node_modules/stripe/esm/resources/balancetransactionsources.d.ts","./node_modules/stripe/esm/resources/balancetransactions.d.ts","./node_modules/stripe/esm/resources/refunds.d.ts","./node_modules/stripe/esm/resources/entitlements/features.d.ts","./node_modules/stripe/esm/resources/entitlements/activeentitlements.d.ts","./node_modules/stripe/esm/resources/entitlements/activeentitlementsummaries.d.ts","./node_modules/stripe/esm/resources/entitlements/index.d.ts","./node_modules/stripe/esm/resources/productfeatures.d.ts","./node_modules/stripe/esm/resources/prices.d.ts","./node_modules/stripe/esm/resources/taxcodes.d.ts","./node_modules/stripe/esm/resources/products.d.ts","./node_modules/stripe/esm/resources/plans.d.ts","./node_modules/stripe/esm/resources/subscriptionitems.d.ts","./node_modules/stripe/esm/resources/confirmationtokens.d.ts","./node_modules/stripe/esm/resources/testhelpers/confirmationtokens.d.ts","./node_modules/stripe/esm/resources/testhelpers/customers.d.ts","./node_modules/stripe/esm/resources/testhelpers/refunds.d.ts","./node_modules/stripe/esm/resources/testhelpers/testclocks.d.ts","./node_modules/stripe/esm/resources/testhelpers/issuing/authorizations.d.ts","./node_modules/stripe/esm/resources/testhelpers/issuing/cards.d.ts","./node_modules/stripe/esm/resources/testhelpers/issuing/personalizationdesigns.d.ts","./node_modules/stripe/esm/resources/testhelpers/issuing/transactions.d.ts","./node_modules/stripe/esm/resources/testhelpers/issuing/index.d.ts","./node_modules/stripe/esm/resources/terminal/locations.d.ts","./node_modules/stripe/esm/resources/terminal/readers.d.ts","./node_modules/stripe/esm/resources/testhelpers/terminal/readers.d.ts","./node_modules/stripe/esm/resources/testhelpers/terminal/index.d.ts","./node_modules/stripe/esm/resources/treasury/creditreversals.d.ts","./node_modules/stripe/esm/resources/treasury/debitreversals.d.ts","./node_modules/stripe/esm/resources/treasury/outboundpayments.d.ts","./node_modules/stripe/esm/resources/treasury/outboundtransfers.d.ts","./node_modules/stripe/esm/resources/treasury/receivedcredits.d.ts","./node_modules/stripe/esm/resources/treasury/receiveddebits.d.ts","./node_modules/stripe/esm/resources/treasury/transactionentries.d.ts","./node_modules/stripe/esm/resources/treasury/transactions.d.ts","./node_modules/stripe/esm/resources/treasury/inboundtransfers.d.ts","./node_modules/stripe/esm/resources/testhelpers/treasury/inboundtransfers.d.ts","./node_modules/stripe/esm/resources/testhelpers/treasury/outboundpayments.d.ts","./node_modules/stripe/esm/resources/testhelpers/treasury/outboundtransfers.d.ts","./node_modules/stripe/esm/resources/testhelpers/treasury/receivedcredits.d.ts","./node_modules/stripe/esm/resources/testhelpers/treasury/receiveddebits.d.ts","./node_modules/stripe/esm/resources/testhelpers/treasury/index.d.ts","./node_modules/stripe/esm/resources/testhelpers/index.d.ts","./node_modules/stripe/esm/resources/subscriptionschedules.d.ts","./node_modules/stripe/esm/resources/subscriptions.d.ts","./node_modules/stripe/esm/resources/invoicelineitems.d.ts","./node_modules/stripe/esm/resources/paymentrecords.d.ts","./node_modules/stripe/esm/resources/invoicepayments.d.ts","./node_modules/stripe/esm/resources/shippingrates.d.ts","./node_modules/stripe/esm/resources/invoices.d.ts","./node_modules/stripe/esm/resources/creditnotes.d.ts","./node_modules/stripe/esm/resources/lineitems.d.ts","./node_modules/stripe/esm/resources/paymentlinks.d.ts","./node_modules/stripe/esm/resources/checkout/sessions.d.ts","./node_modules/stripe/esm/resources/checkout/index.d.ts","./node_modules/stripe/esm/resources/customerbalancetransactions.d.ts","./node_modules/stripe/esm/resources/cashbalances.d.ts","./node_modules/stripe/esm/resources/fundinginstructions.d.ts","./node_modules/stripe/esm/resources/customers.d.ts","./node_modules/stripe/esm/resources/billing/alerts.d.ts","./node_modules/stripe/esm/resources/billing/creditbalancesummary.d.ts","./node_modules/stripe/esm/resources/billing/creditgrants.d.ts","./node_modules/stripe/esm/resources/billing/creditbalancetransactions.d.ts","./node_modules/stripe/esm/resources/billing/meterevents.d.ts","./node_modules/stripe/esm/resources/billing/metereventadjustments.d.ts","./node_modules/stripe/esm/resources/billing/alerttriggereds.d.ts","./node_modules/stripe/esm/resources/billing/index.d.ts","./node_modules/stripe/esm/resources/billingportal/configurations.d.ts","./node_modules/stripe/esm/resources/billingportal/sessions.d.ts","./node_modules/stripe/esm/resources/billingportal/index.d.ts","./node_modules/stripe/esm/resources/climate/suppliers.d.ts","./node_modules/stripe/esm/resources/climate/products.d.ts","./node_modules/stripe/esm/resources/climate/orders.d.ts","./node_modules/stripe/esm/resources/climate/index.d.ts","./node_modules/stripe/esm/resources/financialconnections/accountowners.d.ts","./node_modules/stripe/esm/resources/financialconnections/accountownerships.d.ts","./node_modules/stripe/esm/resources/financialconnections/accounts.d.ts","./node_modules/stripe/esm/resources/financialconnections/sessions.d.ts","./node_modules/stripe/esm/resources/financialconnections/transactions.d.ts","./node_modules/stripe/esm/resources/financialconnections/index.d.ts","./node_modules/stripe/esm/resources/identity/verificationreports.d.ts","./node_modules/stripe/esm/resources/identity/verificationsessions.d.ts","./node_modules/stripe/esm/resources/identity/index.d.ts","./node_modules/stripe/esm/resources/radar/earlyfraudwarnings.d.ts","./node_modules/stripe/esm/resources/radar/paymentevaluations.d.ts","./node_modules/stripe/esm/resources/radar/valuelistitems.d.ts","./node_modules/stripe/esm/resources/radar/valuelists.d.ts","./node_modules/stripe/esm/resources/radar/index.d.ts","./node_modules/stripe/esm/resources/reporting/reportruns.d.ts","./node_modules/stripe/esm/resources/reporting/reporttypes.d.ts","./node_modules/stripe/esm/resources/reporting/index.d.ts","./node_modules/stripe/esm/resources/reserve/plans.d.ts","./node_modules/stripe/esm/resources/reserve/holds.d.ts","./node_modules/stripe/esm/resources/reserve/releases.d.ts","./node_modules/stripe/esm/resources/reserve/index.d.ts","./node_modules/stripe/esm/resources/sigma/scheduledqueryruns.d.ts","./node_modules/stripe/esm/resources/sigma/index.d.ts","./node_modules/stripe/esm/resources/tax/associations.d.ts","./node_modules/stripe/esm/resources/tax/calculationlineitems.d.ts","./node_modules/stripe/esm/resources/tax/calculations.d.ts","./node_modules/stripe/esm/resources/tax/registrations.d.ts","./node_modules/stripe/esm/resources/tax/settings.d.ts","./node_modules/stripe/esm/resources/tax/transactionlineitems.d.ts","./node_modules/stripe/esm/resources/tax/transactions.d.ts","./node_modules/stripe/esm/resources/tax/index.d.ts","./node_modules/stripe/esm/resources/terminal/configurations.d.ts","./node_modules/stripe/esm/resources/terminal/connectiontokens.d.ts","./node_modules/stripe/esm/resources/terminal/onboardinglinks.d.ts","./node_modules/stripe/esm/resources/terminal/index.d.ts","./node_modules/stripe/esm/resources/treasury/financialaccountfeatures.d.ts","./node_modules/stripe/esm/resources/treasury/financialaccounts.d.ts","./node_modules/stripe/esm/resources/treasury/index.d.ts","./node_modules/stripe/esm/resources/balance.d.ts","./node_modules/stripe/esm/resources/balancesettings.d.ts","./node_modules/stripe/esm/resources/invoiceitems.d.ts","./node_modules/stripe/esm/resources/quotes.d.ts","./node_modules/stripe/esm/resources/sourcemandatenotifications.d.ts","./node_modules/stripe/esm/resources/events.d.ts","./node_modules/stripe/esm/webhooks.d.ts","./node_modules/stripe/esm/resources/accountlinks.d.ts","./node_modules/stripe/esm/resources/accountsessions.d.ts","./node_modules/stripe/esm/resources/applepaydomains.d.ts","./node_modules/stripe/esm/resources/countryspecs.d.ts","./node_modules/stripe/esm/resources/customersessions.d.ts","./node_modules/stripe/esm/resources/ephemeralkeys.d.ts","./node_modules/stripe/esm/resources/exchangerates.d.ts","./node_modules/stripe/esm/resources/invoicerenderingtemplates.d.ts","./node_modules/stripe/esm/resources/oauth.d.ts","./node_modules/stripe/esm/resources/paymentattemptrecords.d.ts","./node_modules/stripe/esm/resources/paymentmethodconfigurations.d.ts","./node_modules/stripe/esm/resources/paymentmethoddomains.d.ts","./node_modules/stripe/esm/resources/tokens.d.ts","./node_modules/stripe/esm/resources/webhookendpoints.d.ts","./node_modules/stripe/esm/resourcenamespace.d.ts","./node_modules/stripe/esm/resources.d.ts","./node_modules/stripe/esm/resources/apps/secrets.d.ts","./node_modules/stripe/esm/resources/apps/index.d.ts","./node_modules/stripe/esm/resources/forwarding/requests.d.ts","./node_modules/stripe/esm/resources/forwarding/index.d.ts","./node_modules/stripe/esm/resources/v2/deletedobject.d.ts","./node_modules/stripe/esm/resources/v2/billing/meterevents.d.ts","./node_modules/stripe/esm/resources/v2/billing/metereventadjustments.d.ts","./node_modules/stripe/esm/resources/v2/billing/metereventsession.d.ts","./node_modules/stripe/esm/resources/v2/billing/metereventstream.d.ts","./node_modules/stripe/esm/resources/v2/billing/index.d.ts","./node_modules/stripe/esm/resources/v2/commerce/productcatalogimports.d.ts","./node_modules/stripe/esm/resources/v2/commerce/productcatalog/imports.d.ts","./node_modules/stripe/esm/resources/v2/commerce/productcatalog/index.d.ts","./node_modules/stripe/esm/resources/v2/commerce/index.d.ts","./node_modules/stripe/esm/resources/v2/v2amounts.d.ts","./node_modules/stripe/esm/resources/v2/core/accountpersons.d.ts","./node_modules/stripe/esm/resources/v2/core/accounts/persons.d.ts","./node_modules/stripe/esm/resources/v2/core/accountpersontokens.d.ts","./node_modules/stripe/esm/resources/v2/core/accounts/persontokens.d.ts","./node_modules/stripe/esm/resources/v2/core/accounts.d.ts","./node_modules/stripe/esm/resources/v2/core/accountlinks.d.ts","./node_modules/stripe/esm/resources/v2/core/accounttokens.d.ts","./node_modules/stripe/esm/resources/v2/core/events.d.ts","./node_modules/stripe/esm/resources/v2/core/eventdestinations.d.ts","./node_modules/stripe/esm/resources/v2/core/index.d.ts","./node_modules/stripe/esm/resources/v2/index.d.ts","./node_modules/stripe/esm/stripe.core.d.ts","./node_modules/stripe/esm/types.d.ts","./node_modules/stripe/esm/requestsender.d.ts","./node_modules/stripe/esm/error.d.ts","./node_modules/stripe/esm/stripe.esm.node.d.ts","./src/lib/billing.ts","./src/app/api/billing/checkout/route.ts","./src/app/api/billing/webhook/route.ts","./src/lib/crypto.ts","./src/lib/auth.ts","./src/app/api/credentials/route.ts","./src/app/api/import/apify-govdeals/route.ts","./node_modules/csv-parse/lib/index.d.ts","./node_modules/csv-parse/lib/sync.d.ts","./src/importers/csv.ts","./src/app/api/import/csv/route.ts","./src/app/api/import/extension/route.ts","./src/app/api/import/gsa/route.ts","./src/importers/scrape.ts","./src/lib/ssrf-guard.ts","./src/app/api/import/url/route.ts","./src/app/api/listings/route.ts","./src/lib/listing-detail.ts","./src/app/api/listings/[id]/route.ts","./src/app/api/listings/[id]/buyer-lead/route.ts","./src/app/api/listings/[id]/buyer-page/route.ts","./src/app/api/newsletter/result-page.ts","./src/app/api/newsletter/confirm/route.ts","./src/app/api/newsletter/subscribe/route.ts","./src/app/api/newsletter/unsubscribe/route.ts","./src/engines/costs.test.ts","./src/engines/scoring.test.ts","./src/engines/valuation.test.ts","./src/lib/auth.test.ts","./src/lib/crypto.test.ts","./src/lib/dashboard.ts","./src/lib/listing-detail.test.ts","./src/lib/listings-sort.test.ts","./src/lib/marketplace-links.ts","./src/lib/marketplace-links.test.ts","./src/lib/money-math-visibility.test.ts","./src/lib/places.test.ts","./src/lib/rate-limit.test.ts","./src/lib/reports.ts","./src/lib/selling-avenues.ts","./node_modules/bullmq/dist/esm/classes/async-fifo-queue.d.ts","./node_modules/bullmq/dist/esm/interfaces/backoff-options.d.ts","./node_modules/bullmq/dist/esm/types/keep-jobs.d.ts","./node_modules/bullmq/dist/esm/interfaces/parent-options.d.ts","./node_modules/cron-parser/types/common.d.ts","./node_modules/cron-parser/types/index.d.ts","./node_modules/bullmq/dist/esm/interfaces/repeat-options.d.ts","./node_modules/bullmq/dist/esm/interfaces/base-job-options.d.ts","./node_modules/bullmq/dist/esm/types/deduplication-options.d.ts","./node_modules/bullmq/dist/esm/types/job-options.d.ts","./node_modules/bullmq/dist/esm/types/job-progress.d.ts","./node_modules/bullmq/dist/esm/interfaces/parent.d.ts","./node_modules/bullmq/dist/esm/interfaces/job-json.d.ts","./node_modules/bullmq/dist/esm/types/job-json-sandbox.d.ts","./node_modules/bullmq/dist/esm/interfaces/minimal-job.d.ts","./node_modules/bullmq/dist/esm/types/backoff-strategy.d.ts","./node_modules/bullmq/dist/esm/classes/backoffs.d.ts","./node_modules/bullmq/dist/esm/types/repeat-strategy.d.ts","./node_modules/bullmq/dist/esm/interfaces/advanced-options.d.ts","./node_modules/bullmq/dist/esm/enums/parent-command.d.ts","./node_modules/bullmq/dist/esm/interfaces/child-message.d.ts","./node_modules/bullmq/dist/esm/interfaces/redis-client.d.ts","./node_modules/bullmq/dist/esm/interfaces/connection.d.ts","./node_modules/bullmq/dist/esm/types/database-type.d.ts","./node_modules/bullmq/dist/esm/types/finished-status.d.ts","./node_modules/bullmq/dist/esm/types/job-scheduler-template-options.d.ts","./node_modules/bullmq/dist/esm/types/job-type.d.ts","./node_modules/bullmq/dist/esm/types/index.d.ts","./node_modules/bullmq/node_modules/ioredis/built/types.d.ts","./node_modules/bullmq/node_modules/ioredis/built/command.d.ts","./node_modules/bullmq/node_modules/ioredis/built/scanstream.d.ts","./node_modules/bullmq/node_modules/ioredis/built/utils/rediscommander.d.ts","./node_modules/bullmq/node_modules/ioredis/built/transaction.d.ts","./node_modules/bullmq/node_modules/ioredis/built/utils/commander.d.ts","./node_modules/bullmq/node_modules/ioredis/built/connectors/abstractconnector.d.ts","./node_modules/bullmq/node_modules/ioredis/built/connectors/connectorconstructor.d.ts","./node_modules/bullmq/node_modules/ioredis/built/connectors/sentinelconnector/types.d.ts","./node_modules/bullmq/node_modules/ioredis/built/connectors/sentinelconnector/sentineliterator.d.ts","./node_modules/bullmq/node_modules/ioredis/built/connectors/sentinelconnector/index.d.ts","./node_modules/bullmq/node_modules/ioredis/built/connectors/standaloneconnector.d.ts","./node_modules/bullmq/node_modules/ioredis/built/redis/redisoptions.d.ts","./node_modules/bullmq/node_modules/ioredis/built/cluster/util.d.ts","./node_modules/bullmq/node_modules/ioredis/built/cluster/clusteroptions.d.ts","./node_modules/bullmq/node_modules/ioredis/built/cluster/index.d.ts","./node_modules/denque/index.d.ts","./node_modules/bullmq/node_modules/ioredis/built/subscriptionset.d.ts","./node_modules/bullmq/node_modules/ioredis/built/datahandler.d.ts","./node_modules/bullmq/node_modules/ioredis/built/redis.d.ts","./node_modules/bullmq/node_modules/ioredis/built/pipeline.d.ts","./node_modules/bullmq/node_modules/ioredis/built/index.d.ts","./node_modules/bullmq/dist/esm/interfaces/redis-options.d.ts","./node_modules/bullmq/dist/esm/enums/child-command.d.ts","./node_modules/bullmq/dist/esm/enums/error-code.d.ts","./node_modules/bullmq/dist/esm/enums/metrics-time.d.ts","./node_modules/bullmq/dist/esm/enums/telemetry-attributes.d.ts","./node_modules/bullmq/dist/esm/enums/index.d.ts","./node_modules/bullmq/dist/esm/interfaces/telemetry.d.ts","./node_modules/bullmq/dist/esm/interfaces/queue-options.d.ts","./node_modules/bullmq/dist/esm/interfaces/flow-job.d.ts","./node_modules/bullmq/dist/esm/interfaces/ioredis-events.d.ts","./node_modules/bullmq/dist/esm/interfaces/job-scheduler-json.d.ts","./node_modules/bullmq/dist/esm/interfaces/lock-manager-worker-context.d.ts","./node_modules/bullmq/dist/esm/interfaces/metrics-options.d.ts","./node_modules/bullmq/dist/esm/interfaces/metrics.d.ts","./node_modules/bullmq/dist/esm/classes/queue-keys.d.ts","./node_modules/bullmq/dist/esm/interfaces/script-queue-context.d.ts","./node_modules/bullmq/dist/esm/interfaces/minimal-queue.d.ts","./node_modules/bullmq/dist/esm/interfaces/parent-message.d.ts","./node_modules/bullmq/dist/esm/interfaces/queue-meta.d.ts","./node_modules/bullmq/dist/esm/interfaces/rate-limiter-options.d.ts","./node_modules/bullmq/dist/esm/interfaces/redis-streams.d.ts","./node_modules/bullmq/dist/esm/interfaces/repeatable-job.d.ts","./node_modules/bullmq/dist/esm/interfaces/repeatable-options.d.ts","./node_modules/bullmq/dist/esm/interfaces/retry-options.d.ts","./node_modules/bullmq/dist/esm/interfaces/sandboxed-job.d.ts","./node_modules/bullmq/dist/esm/interfaces/sandboxed-job-processor.d.ts","./node_modules/bullmq/dist/esm/interfaces/sandboxed-options.d.ts","./node_modules/bullmq/dist/esm/interfaces/worker-options.d.ts","./node_modules/bullmq/dist/esm/interfaces/receiver.d.ts","./node_modules/bullmq/dist/esm/interfaces/index.d.ts","./node_modules/bullmq/dist/esm/classes/child.d.ts","./node_modules/bullmq/dist/esm/classes/child-pool.d.ts","./node_modules/bullmq/dist/esm/classes/child-processor.d.ts","./node_modules/bullmq/dist/esm/classes/errors/connection-closed-error.d.ts","./node_modules/bullmq/dist/esm/classes/errors/delayed-error.d.ts","./node_modules/bullmq/dist/esm/classes/errors/rate-limit-error.d.ts","./node_modules/bullmq/dist/esm/classes/errors/unrecoverable-error.d.ts","./node_modules/bullmq/dist/esm/classes/errors/waiting-children-error.d.ts","./node_modules/bullmq/dist/esm/classes/errors/waiting-error.d.ts","./node_modules/bullmq/dist/esm/classes/errors/index.d.ts","./node_modules/bullmq/dist/esm/classes/scripts.d.ts","./node_modules/bullmq/dist/esm/classes/redis-connection.d.ts","./node_modules/bullmq/dist/esm/classes/queue-base.d.ts","./node_modules/bullmq/dist/esm/classes/queue-events.d.ts","./node_modules/bullmq/dist/esm/classes/job.d.ts","./node_modules/bullmq/dist/esm/classes/flow-producer.d.ts","./node_modules/bullmq/dist/esm/classes/ioredis-client.d.ts","./node_modules/bullmq/dist/esm/classes/node-redis-client.d.ts","./node_modules/bullmq/dist/esm/classes/bun-redis-client.d.ts","./node_modules/bullmq/dist/esm/classes/job-scheduler.d.ts","./node_modules/node-abort-controller/index.d.ts","./node_modules/bullmq/dist/esm/classes/abort-controller.d.ts","./node_modules/bullmq/dist/esm/classes/lock-manager.d.ts","./node_modules/bullmq/dist/esm/classes/queue-events-producer.d.ts","./node_modules/bullmq/dist/esm/classes/queue-getters.d.ts","./node_modules/bullmq/dist/esm/classes/repeat.d.ts","./node_modules/bullmq/dist/esm/classes/queue.d.ts","./node_modules/bullmq/dist/esm/classes/sandbox.d.ts","./node_modules/bullmq/dist/esm/types/processor.d.ts","./node_modules/bullmq/dist/esm/classes/worker.d.ts","./node_modules/bullmq/dist/esm/classes/index.d.ts","./node_modules/bullmq/dist/esm/utils/index.d.ts","./node_modules/bullmq/dist/esm/utils/create-scripts.d.ts","./node_modules/bullmq/dist/esm/index.d.ts","./src/worker/index.ts","./tests/e2e/smoke.spec.ts","./src/app/layout.tsx","./src/components/ui/card.tsx","./src/components/dashboard-cards.tsx","./node_modules/@tanstack/table-core/build/lib/utils.d.ts","./node_modules/@tanstack/table-core/build/lib/core/table.d.ts","./node_modules/@tanstack/table-core/build/lib/features/columnvisibility.d.ts","./node_modules/@tanstack/table-core/build/lib/features/columnordering.d.ts","./node_modules/@tanstack/table-core/build/lib/features/columnpinning.d.ts","./node_modules/@tanstack/table-core/build/lib/features/rowpinning.d.ts","./node_modules/@tanstack/table-core/build/lib/core/headers.d.ts","./node_modules/@tanstack/table-core/build/lib/features/columnfaceting.d.ts","./node_modules/@tanstack/table-core/build/lib/features/globalfaceting.d.ts","./node_modules/@tanstack/table-core/build/lib/filterfns.d.ts","./node_modules/@tanstack/table-core/build/lib/features/columnfiltering.d.ts","./node_modules/@tanstack/table-core/build/lib/features/globalfiltering.d.ts","./node_modules/@tanstack/table-core/build/lib/sortingfns.d.ts","./node_modules/@tanstack/table-core/build/lib/features/rowsorting.d.ts","./node_modules/@tanstack/table-core/build/lib/aggregationfns.d.ts","./node_modules/@tanstack/table-core/build/lib/features/columngrouping.d.ts","./node_modules/@tanstack/table-core/build/lib/features/rowexpanding.d.ts","./node_modules/@tanstack/table-core/build/lib/features/columnsizing.d.ts","./node_modules/@tanstack/table-core/build/lib/features/rowpagination.d.ts","./node_modules/@tanstack/table-core/build/lib/features/rowselection.d.ts","./node_modules/@tanstack/table-core/build/lib/core/row.d.ts","./node_modules/@tanstack/table-core/build/lib/core/cell.d.ts","./node_modules/@tanstack/table-core/build/lib/core/column.d.ts","./node_modules/@tanstack/table-core/build/lib/types.d.ts","./node_modules/@tanstack/table-core/build/lib/columnhelper.d.ts","./node_modules/@tanstack/table-core/build/lib/utils/getcorerowmodel.d.ts","./node_modules/@tanstack/table-core/build/lib/utils/getexpandedrowmodel.d.ts","./node_modules/@tanstack/table-core/build/lib/utils/getfacetedminmaxvalues.d.ts","./node_modules/@tanstack/table-core/build/lib/utils/getfacetedrowmodel.d.ts","./node_modules/@tanstack/table-core/build/lib/utils/getfaceteduniquevalues.d.ts","./node_modules/@tanstack/table-core/build/lib/utils/getfilteredrowmodel.d.ts","./node_modules/@tanstack/table-core/build/lib/utils/getgroupedrowmodel.d.ts","./node_modules/@tanstack/table-core/build/lib/utils/getpaginationrowmodel.d.ts","./node_modules/@tanstack/table-core/build/lib/utils/getsortedrowmodel.d.ts","./node_modules/@tanstack/table-core/build/lib/index.d.ts","./node_modules/@tanstack/react-table/build/lib/index.d.ts","./node_modules/class-variance-authority/dist/types.d.ts","./node_modules/class-variance-authority/dist/index.d.ts","./src/components/ui/badge.tsx","./src/components/ui/button.tsx","./src/components/ui/input.tsx","./src/components/listings-table.tsx","./src/components/logout-button.tsx","./src/app/page.tsx","./src/app/agent-ops/page.tsx","./src/components/agent-finder.tsx","./src/app/agents/page.tsx","./src/components/offer-form.tsx","./src/app/b/[slug]/page.tsx","./src/app/billing/success/page.tsx","./src/app/deals/page.tsx","./src/app/deals/[date]/page.tsx","./src/app/listings/[id]/page.tsx","./src/app/login/page.tsx","./src/app/newsletter/subscribeform.tsx","./src/app/newsletter/page.tsx","./src/app/pricing/upgradebutton.tsx","./src/app/pricing/page.tsx","./src/app/privacy/page.tsx","./src/app/reports/page.tsx","./src/app/selling-avenues/page.tsx","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/json5/index.d.ts"],"fileIdsList":[[74,123,140,141,510,511],[74,123,140,141,166,208,510],[74,123,140,141,621],[74,123,140,141,620],[74,123,140,141,1180],[74,123,140,141],[74,123,140,141,533],[74,123,140,141,622],[62,74,123,140,141,1153],[74,123,140,141,1134],[74,123,140,141,1119,1142],[74,123,140,141,1142],[74,123,140,141,1142,1153],[74,123,140,141,1128,1142,1153],[74,123,140,141,1133,1142,1153],[74,123,140,141,1123,1142],[74,123,140,141,1131,1142,1153],[74,123,140,141,1129],[74,123,140,141,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152],[74,123,140,141,1132],[74,123,140,141,1119,1120,1121,1122,1123,1124,1125,1126,1127,1129,1130,1132,1134,1135,1136,1137,1138,1139,1140,1141],[74,123,140,141,1180,1181,1182,1183,1184],[74,123,140,141,1180,1182],[74,123,140,141,544,545],[74,120,121,123,140,141],[74,122,123,140,141],[123,140,141],[74,123,128,140,141,158],[74,123,124,129,134,140,141,143,155,166],[74,123,124,125,134,140,141,143],[69,70,71,74,123,140,141],[74,123,126,140,141,167],[74,123,127,128,135,140,141,144],[74,123,128,140,141,155,163],[74,123,129,131,134,140,141,143],[74,122,123,130,140,141],[74,123,131,132,140,141],[74,123,133,134,140,141],[74,122,123,134,140,141],[74,123,134,135,136,140,141,155,166],[74,123,134,135,136,140,141,150,155,158],[74,115,123,131,134,137,140,141,143,155,166],[74,123,134,135,137,138,140,141,143,155,163,166],[74,123,137,139,140,141,155,163,166],[72,73,74,75,76,77,78,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172],[74,123,134,140,141],[74,123,140,141,142,166],[74,123,131,134,140,141,143,155],[74,123,140,141,144],[74,123,140,141,145],[74,122,123,140,141,146],[74,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172],[74,123,140,141,148],[74,123,140,141,149],[74,123,134,140,141,150,151],[74,123,140,141,150,152,167,169],[74,123,135,140,141],[74,123,134,140,141,155,156,158],[74,123,140,141,157,158],[74,123,140,141,155,156],[74,123,140,141,158],[74,123,140,141,159],[74,120,123,140,141,155,160,166],[74,123,134,140,141,161,162],[74,123,140,141,161,162],[74,123,128,140,141,143,155,163],[74,123,140,141,164],[74,123,140,141,143,165],[74,123,137,140,141,149,166],[74,123,128,140,141,167],[74,123,140,141,155,168],[74,123,140,141,142,169],[74,123,140,141,170],[74,115,123,140,141],[74,115,123,134,136,140,141,146,155,158,166,168,169,171],[74,123,140,141,155,172],[62,66,74,123,140,141,174,175,176,178,460,505],[62,74,123,140,141],[62,66,74,123,140,141,174,175,176,177,441,460,505],[62,66,74,123,140,141,174,175,177,178,460,505],[62,74,123,140,141,178,441,442],[62,74,123,140,141,178,441],[62,66,74,123,140,141,175,176,177,178,460,505],[62,66,74,123,140,141,174,176,177,178,460,505],[60,61,74,123,140,141],[74,123,140,141,537,538,539,542,543,546],[74,123,140,141,605],[74,123,140,141,605,606],[74,123,140,141,542,589,590],[74,123,140,141,542,589],[74,123,140,141,589],[74,123,140,141,540,589,593,594],[74,123,140,141,540,589,593],[74,123,140,141,536],[74,123,140,141,540,541],[74,123,140,141,540],[74,123,140,141,540,541,586,610],[74,123,140,141,586],[74,123,140,141,540,543,586,587,588],[74,123,140,141,1100],[74,123,140,141,1001,1014,1015],[74,123,140,141,1021],[74,123,140,141,1079,1080],[74,123,140,141,1027,1079],[74,123,124,134,140,141,171,1079],[74,123,140,141,1083,1084,1085,1086,1087,1088],[74,123,134,140,141,1064,1079,1091,1094],[74,123,140,141,1000,1016,1064,1080,1081,1082,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1102,1103,1104,1105,1106,1107,1109],[74,123,140,141,1021,1049],[74,123,140,141,1027,1079,1091,1092,1094],[74,123,140,141,1027,1079,1090,1093],[74,123,140,141,1079,1101],[74,123,134,140,141,1023,1055,1064,1079,1090,1091,1094],[74,123,140,141,1079,1091,1092],[74,123,140,141,1027,1079,1091,1092],[74,123,140,141,1027,1079,1092,1094],[74,123,140,141,1027,1079,1091,1094,1099,1104,1105],[74,123,134,140,141,1021,1027,1079],[74,123,140,141,1081,1094],[74,123,140,141,166,1027,1079,1091,1092,1094,1099,1101,1102,1105,1108],[74,123,140,141,1019,1051,1052,1053,1054],[74,123,140,141,1027,1055,1079,1108,1110,1111,1112],[74,123,140,141,1015,1017],[74,123,140,141,1001,1002,1003,1006],[74,123,140,141,1019],[74,123,134,140,141,1021],[74,123,140,141,1027,1057],[74,123,140,141,1001,1003,1006,1007,1011,1012,1014,1018,1020,1021,1022,1050,1056,1057,1058,1059,1060,1061,1062,1063,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078],[74,123,140,141,1009,1010,1011],[74,123,140,141,1027],[74,123,140,141,1055,1056],[74,123,140,141,1003,1009,1010,1011,1012,1013],[74,123,140,141,1022,1054,1056,1065],[74,123,140,141,1012,1051],[74,123,140,141,1009],[74,123,140,141,1007,1018,1050,1056],[74,123,140,141,155],[74,123,140,141,1005],[74,123,140,141,1074],[74,123,140,141,1014,1027],[74,123,124,140,141,171],[74,123,140,141,1022,1023,1057,1064],[74,123,140,141,1055],[74,123,140,141,1002,1018,1056,1057,1062,1069,1076],[74,123,140,141,1014],[74,123,140,141,1002,1008,1009,1010,1013,1015,1017,1023,1024,1025,1026],[74,123,140,141,1012],[74,123,140,141,1007,1008],[74,123,140,141,1024],[74,123,140,141,1094],[74,123,140,141,1006],[74,123,140,141,1079,1090],[74,123,140,141,1027,1049,1055,1079,1101],[74,123,131,140,141,173,1033,1040,1041],[74,123,134,140,141,173,1028,1029,1030,1032,1033,1041,1042,1047],[74,123,131,140,141,173],[74,123,140,141,173,1028],[74,123,140,141,1028],[74,123,140,141,1034],[74,123,134,140,141,163,173,1028,1034,1036,1037,1042],[74,123,140,141,1036],[74,123,140,141,1040],[74,123,140,141,143,163,173,1028,1034],[74,123,134,140,141,173,1028,1044,1045],[74,123,140,141,1028,1029,1030,1031,1034,1038,1039,1040,1041,1042,1043,1047,1048],[74,123,140,141,1029,1033,1043,1047],[74,123,134,140,141,173,1028,1029,1030,1032,1033,1040,1043,1044,1046],[74,123,140,141,1033,1035,1038,1039],[74,123,140,141,155,173],[74,123,140,141,1029],[74,123,140,141,1031],[74,123,140,141,143,163,173],[74,123,140,141,1028,1029,1031],[74,123,140,141,626,1155],[74,123,140,141,626],[74,123,140,141,1004],[74,123,140,141,967],[74,123,140,141,674,675],[74,123,140,141,674,675,676,677],[74,123,140,141,674,676],[74,123,140,141,674],[74,123,140,141,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709],[74,123,140,141,680],[74,123,140,141,579,580],[74,123,140,141,463],[74,123,140,141,465,466,467,468],[74,123,140,141,411,474,475],[74,123,140,141,183,184,186,198,222,337,348,456],[74,123,140,141,186,217,218,219,221,456],[74,123,140,141,186,354,356,358,359,361,456,458],[74,123,140,141,186,220,257,456],[74,123,140,141,184,186,197,198,204,210,215,336,337,338,347,456,458],[74,123,140,141,456],[74,123,140,141,193,199,218,238,333],[74,123,140,141,186],[74,123,140,141,179,193,199],[74,123,140,141,365],[74,123,140,141,362,363,365],[74,123,140,141,362,364,456],[74,123,137,140,141,238,435,453],[74,123,137,140,141,309,312,328,333,453],[74,123,137,140,141,281,453],[74,123,140,141,341],[74,123,140,141,340,341,342],[74,123,140,141,340],[68,74,123,137,140,141,179,186,198,204,210,216,218,222,223,236,237,304,334,335,348,456,460],[74,123,140,141,183,186,220,257,354,355,360,456,508],[74,123,140,141,220,508],[74,123,140,141,183,237,406,456,508],[74,123,140,141,508],[74,123,140,141,186,220,221,508],[74,123,140,141,357,508],[74,123,140,141,223,336,339,346],[62,74,123,140,141,411],[74,123,140,141,149,193,208],[74,123,140,141,193,208],[62,74,123,140,141,278],[62,74,123,140,141,208],[62,74,123,140,141,199,208,411],[74,123,140,141,193,264,278,279,490,497],[74,123,140,141,263,491,492,493,494,496],[74,123,140,141,314],[74,123,140,141,314,315],[74,123,140,141,197,199,266,267],[74,123,140,141,199,273,274],[74,123,140,141,199,268,276],[74,123,140,141,273],[74,123,140,141,191,199,266,267,268,269,270,271,272,273,276],[74,123,140,141,199,266,273,274,275,277],[74,123,140,141,199,267,269,270],[74,123,140,141,267,269,272,274],[74,123,140,141,495],[74,123,140,141,199],[62,74,123,140,141,187,484],[62,74,123,140,141,166],[62,74,123,140,141,220,255],[62,74,123,140,141,220,348],[74,123,140,141,253,258],[62,74,123,140,141,254,462],[62,66,74,123,137,140,141,174,175,176,177,178,460,504],[74,123,137,140,141,199],[74,123,137,140,141,198,203,284,301,343,344,348,403,405,456,457],[74,123,140,141,236,345],[74,123,140,141,460],[74,123,140,141,185],[62,74,123,140,141,190,193,408,424,426],[74,123,140,141,149,193,408,423,424,425,507],[74,123,140,141,417,418,419,420,421,422],[74,123,140,141,419],[74,123,140,141,423],[74,123,140,141,208,372,373,375],[62,74,123,140,141,199,366,367,368,369,374],[74,123,140,141,372,374],[74,123,140,141,370],[74,123,140,141,371],[62,74,123,140,141,208,254,462],[62,74,123,140,141,208,461,462],[62,74,123,140,141,208,462],[74,123,140,141,301,302],[74,123,140,141,302],[74,123,137,140,141,457,462],[74,123,140,141,331],[74,122,123,140,141,330],[74,123,140,141,193,199,205,207,309,322,326,328,405,408,445,446,453,457],[74,123,140,141,199,248,270],[74,123,140,141,309,320,323,328],[62,74,123,140,141,190,193,309,312,328,331,365,412,413,414,415,416,427,428,429,430,431,432,433,434,508],[74,123,140,141,190,193,218,309,316,317,318,321,322],[74,123,140,141,155,199,218,320,327,408,409,453],[74,123,140,141,324],[74,123,137,140,141,149,187,199,203,213,245,246,249,301,304,369,403,404,445,456,457,458,460,508],[74,123,140,141,190,191,193],[74,123,140,141,309],[74,122,123,140,141,218,245,246,303,304,305,306,307,308,457],[74,123,140,141,328],[74,122,123,140,141,192,193,203,207,243,309,316,317,318,319,320,323,324,325,326,327,446],[74,123,137,140,141,243,244,316,457,458],[74,123,140,141,218,246,301,304,309,405,457],[74,123,137,140,141,456,458],[74,123,137,140,141,155,453,457,458],[74,123,137,140,141,149,179,193,198,205,207,210,213,220,240,245,246,247,248,249,284,285,287,290,292,295,296,297,298,300,348,403,405,453,456,457,458],[74,123,137,140,141,155],[74,123,140,141,186,187,188,216,453,454,455,460,462,508],[74,123,140,141,183,184,456],[74,123,140,141,377],[74,123,137,140,141,155,166,195,361,365,366,367,368,369,375,376,508],[74,123,140,141,149,166,179,193,195,207,210,246,285,290,300,301,354,381,382,383,389,392,393,403,405,453,456],[74,123,140,141,210,216,223,236,246,304,456],[74,123,137,140,141,166,187,198,207,246,387,453,456],[74,123,140,141,407],[74,123,137,140,141,377,390,391,400],[74,123,140,141,453,456],[74,123,140,141,306,446],[74,123,140,141,207,245,348,462],[74,123,137,140,141,149,185,290,350,354,383,389,392,395,453],[74,123,137,140,141,223,236,354,396],[74,123,140,141,186,247,348,398,456,458],[74,123,137,140,141,166,369,456],[74,123,137,140,141,220,247,348,349,350,359,377,397,399,456],[68,74,123,137,140,141,245,402,460,462],[74,123,140,141,299,403],[74,123,137,140,141,149,193,196,198,199,205,207,213,222,223,236,246,249,285,287,297,300,301,348,381,382,383,384,386,388,403,405,453,462],[74,123,137,140,141,155,223,389,394,400,453],[74,123,140,141,226,227,228,229,230,231,232,233,234,235],[74,123,140,141,240,291],[74,123,140,141,293],[74,123,140,141,291],[74,123,140,141,293,294],[74,123,137,140,141,197,198,199,203,204,457],[74,123,137,140,141,149,185,187,205,209,245,248,249,283,403,453,458,460,462],[74,123,137,140,141,149,166,189,196,197,207,209,246,401,446,452,457],[74,123,140,141,316],[74,123,140,141,317],[74,123,140,141,199,210,445],[74,123,140,141,318],[74,123,140,141,192],[74,123,140,141,194,206],[74,123,137,140,141,194,198,205],[74,123,140,141,201,206],[74,123,140,141,202],[74,123,140,141,194,195],[74,123,140,141,194,250],[74,123,140,141,194],[74,123,140,141,196,240,289],[74,123,140,141,288],[74,123,140,141,193,195,196],[74,123,140,141,196,286],[74,123,140,141,193,195],[74,123,140,141,245,348],[74,123,140,141,445],[74,123,137,140,141,166,205,207,211,245,348,402,405,408,409,410,436,437,440,444,446,453,457],[74,123,140,141,259,262,264,265,278,279],[62,74,123,140,141,176,178,208,438,439],[62,74,123,140,141,176,178,208,438,439,443],[74,123,140,141,332],[74,123,140,141,218,239,244,245,309,310,311,312,313,315,328,329,331,334,402,405,456,458],[74,123,140,141,278],[74,123,137,140,141,283,453],[74,123,140,141,283],[74,123,137,140,141,205,251,280,282,284,402,453,460,462],[74,123,140,141,259,260,261,262,264,265,278,279,461],[68,74,123,137,140,141,149,166,194,195,207,213,245,246,249,348,400,401,403,453,456,457,460],[74,123,140,141,190,193,200],[74,123,140,141,244,246,378,381],[74,123,140,141,244,379,447,448,449,450,451],[74,123,137,140,141,240,456],[74,123,137,140,141],[74,123,140,141,243,328],[74,123,140,141,242],[74,123,140,141,244,297],[74,123,140,141,241,243,456],[74,123,137,140,141,189,244,378,379,380,453,456,457],[62,74,123,140,141,193,199,277],[62,74,123,140,141,191],[74,123,140,141,181,182],[62,74,123,140,141,187],[62,74,123,140,141,193,263],[62,68,74,123,140,141,245,249,460,462],[74,123,140,141,187,484,485],[62,74,123,140,141,258],[62,74,123,140,141,149,166,185,252,254,256,257,462],[74,123,140,141,193,220,457],[74,123,140,141,193,385],[62,74,123,135,137,140,141,149,183,185,258,356,460,461],[62,74,123,140,141,174,175,176,177,178,460,505],[62,63,64,65,66,74,123,140,141],[74,123,128,140,141],[74,123,140,141,351,352,353],[74,123,140,141,351],[62,66,74,123,137,139,140,141,149,173,174,175,176,177,178,179,185,213,218,395,423,458,459,462,505],[74,123,140,141,470],[74,123,140,141,472],[74,123,140,141,476],[74,123,140,141,478],[74,123,140,141,480,481,482],[74,123,140,141,486],[67,74,123,140,141,464,469,471,473,477,479,483,487,489,499,500,502,506,507,508,509],[74,123,140,141,488],[74,123,140,141,498],[74,123,140,141,254],[74,123,140,141,501],[74,122,123,140,141,244,378,379,381,447,448,450,451,503,505],[74,123,140,141,173],[74,123,140,141,530],[74,123,124,135,140,141,155,514,515,518,529],[74,123,140,141,531],[74,123,140,141,532],[74,123,140,141,573],[74,123,140,141,571,573],[74,123,140,141,562,570,571,572,574,576],[74,123,140,141,560],[74,123,140,141,563,568,573,576],[74,123,140,141,559,576],[74,123,140,141,563,564,567,568,569,576],[74,123,140,141,563,564,565,567,568,576],[74,123,140,141,560,561,562,563,564,568,569,570,572,573,574,576],[74,123,140,141,576],[74,123,140,141,558,560,561,562,563,564,565,567,568,569,570,571,572,573,574,575],[74,123,140,141,558,576],[74,123,140,141,563,565,566,568,569,576],[74,123,140,141,567,576],[74,123,140,141,568,569,573,576],[74,123,140,141,561,571],[74,123,140,141,552,584,585],[74,123,140,141,551,552],[74,123,140,141,956,957],[74,123,137,140,141,173,734,735,736,956],[74,123,140,141,956],[74,123,140,141,173,956],[74,123,134,137,140,141,173,734,739,740,956],[74,123,140,141,734,737,955,956],[74,123,140,141,955,956],[74,123,140,141,746,747,749,758,759,762,763,765,767,769,770,771,772,773,775,776,777,780,781,784,795,796,802,803,804,805,806,807,837,838,840,841,842,843,844,846,852,906,907,908,909,911,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,955],[74,123,140,141,737,738],[74,123,140,141,737,738,743,752,755,756,759,760,762],[74,123,140,141,737,738,743],[74,123,140,141,737,738,743,751,761,763,776,795],[74,123,140,141,929,955],[74,123,140,141,737,738,743,794],[74,123,140,141,751,774,775,776,777,778,779,780,781,782,783,784,793,796],[74,123,140,141,743,763,852],[74,123,140,141,737,738,743,745,852],[74,123,140,141,853],[74,123,140,141,737,738,852],[74,123,140,141,737,738,743,836,843,855],[74,123,140,141,737,738,743,836,852],[74,123,140,141,744,745,853,854,855,856,857,858,859,955],[74,123,140,141,737,738,743,744],[74,123,140,141,737,738,743,761],[74,123,140,141,861,862,955],[74,123,140,141,737,738,861],[74,123,140,141,763],[74,123,140,141,737,738,743,761,763,765,768,771,772,773,775,777,795,796,852],[74,123,140,141,847,955],[74,123,140,141,737,738,743,746,747,748,749,762,763,769,773,838,842,843,845,846,852],[74,123,140,141,864,865,866,955],[74,123,140,141,737,738,743,864,865],[74,123,140,141,737,738,743,864],[74,123,140,141,737,738,743,770,776,852],[74,123,140,141,743,748,749,860],[74,123,140,141,737,738,743,748,749,750,796,842,843,849,852,860],[74,123,140,141,743,843,844,848,852],[74,123,140,141,773,795,796,852],[74,123,140,141,737,738,743,748,753,762,768,771,779,836,838,849,850,851],[74,123,140,141,753,754,763,767],[74,123,140,141,746,747,852],[74,123,140,141,737,738,743,759,773,776,795],[74,123,140,141,737,738,743,797],[74,123,140,141,737,798],[74,123,140,141,797,798,799,955],[74,123,140,141,737,738,743,746,747,748,749,751,752,755,759,760,761,762,763,765,766,767,768,769,771,772,773,775,776,777,779,780,781,784,793,796,800,802,804,805,836,837,838,841,843,844,846,848,850,852,860,863,867,873,876,881,884,888,890,898,902,905,906,907,908,909,910],[74,123,140,141,753,754],[74,123,140,141,743,777,795],[74,123,140,141,737,738,743,759],[74,123,140,141,737,738,743,757,758],[74,123,140,141,737,868],[74,123,140,141,737,738,743,852,868,869],[74,123,140,141,868,869,870,871,872,955],[74,123,140,141,737,738,852,870],[74,123,140,141,931,955],[74,123,140,141,743],[74,123,140,141,874,875,955],[74,123,140,141,737,738,743,874],[74,123,140,141,737,738,743,748,749,802,836,843,852],[74,123,140,141,743,748,802,838,860],[74,123,140,141,737,738,743,773,776,840,843],[74,123,140,141,737,738,743,748,749,761,762,763,768,769,771,773,836,838,839,841,842,852,860],[74,123,140,141,737,738,743,785,788,789,791,795],[74,123,140,141,737,738,743,785,787],[74,123,140,141,737,738,743,759,791,795],[74,123,140,141,785,786,787,788,789,790,791,792,955],[74,123,140,141,737,738,743,759,786],[74,123,140,141,737,738,743,788],[74,123,140,141,737,738,743,785,788,789,790,792,795],[74,123,140,141,743,748,749,802],[74,123,140,141,737,738,771],[74,123,140,141,737,738,956],[74,123,140,141,737,738,743,765,771],[74,123,140,141,737,738,743,761,763,764,768,769,771,772,776,852],[74,123,140,141,737,738,743,761,762,763,842,845],[74,123,140,141,737,738,743,755,777,795],[74,123,140,141,743,759],[74,123,140,141,737,738,743,804],[74,123,140,141,800],[74,123,140,141,737,738,743,801,802,803],[74,123,140,141,737,738,743,746,852],[74,123,140,141,737,738,743,748,749,761,763,836,837,838,843,845,852],[74,123,140,141,737,738,743,773,776],[74,123,140,141,877,878,879,880,955],[74,123,140,141,737,738,743,771],[74,123,140,141,737,738,743,879],[74,123,140,141,737,738,743,773,774,776,795],[74,123,140,141,882,883,955],[74,123,140,141,743,776,885],[74,123,140,141,885,886,887],[74,123,140,141,743,780,796,885,886],[74,123,140,141,737,738,743,761,763,765,768,769,771,773,852],[74,123,140,141,737,738,743,761,763,765,768,770,771,773,852],[74,123,140,141,737,738,743,803],[74,123,140,141,889,955],[74,123,140,141,767],[74,123,140,141,737,738,743,766],[74,123,140,141,737,738,743,748,749,802,805],[74,123,140,141,737,738,743,748,749,761,762,763,768,769,771,802,806,836,837,843,852],[74,123,140,141,737,738,743,746,747,748,749,761,762,763,771,802,805,836,838,852],[74,123,140,141,737,738,743,892],[74,123,140,141,891,892,893,894,895,896,897,955],[74,123,140,141,737,738,743,896],[74,123,140,141,737,738,743,761,763,852],[74,123,140,141,817,818,899,900,901,955],[74,123,140,141,737,738,743,768,769,771,773,776,796,817],[74,123,140,141,737,738,743,807],[74,123,140,141,737,738,779],[74,123,140,141,808,809,810,811,816,820,835,955],[74,123,140,141,737,738,743,792],[74,123,140,141,737,738,788],[74,123,140,141,812,813,814,815,955],[74,123,140,141,737,738,787],[74,123,140,141,737,738,743,791],[74,123,140,141,737,738,796],[74,123,140,141,819,955],[74,123,140,141,737,738,818],[74,123,140,141,737,738,829],[74,123,140,141,830,831,832,833,834,955],[74,123,140,141,737,738,823],[74,123,140,141,737,738,824],[74,123,140,141,737,738,825],[74,123,140,141,737,738,826],[74,123,140,141,737,738,743,753,754],[74,123,140,141,737,738,743,767,795],[74,123,140,141,743,775,795,796],[74,123,140,141,737,738,743,763,774,776,795],[74,123,140,141,737,738,743,828],[74,123,140,141,737,738,743,903],[74,123,140,141,737,738,743,765,828],[74,123,140,141,821,822,823,824,825,826,827,828,829,903,904,955],[74,123,140,141,737,738,743,781,821,823,824,828],[74,123,140,141,737,738,743,793,821,822,823,824,825,826,828,829],[74,123,140,141,737,738,743,793,821,822,823,824,825,826,827,829],[74,123,140,141,934,935,936,937,955],[74,123,140,141,939,941,955],[74,123,140,141,737,738,743,939],[74,123,140,141,940,955],[74,123,140,141,737,738,743,943,945,947,955],[74,123,140,141,737,738,743,933,944],[74,123,140,141,737,738,743,946],[74,123,140,141,737,738,743,943],[74,123,140,141,737,738,743,933,951],[74,123,140,141,735,737,738,743,860,942,953],[74,123,140,141,944,946,948,949,950,951,952,955],[74,123,140,141,933,938,942,953,955],[74,123,140,141,742],[74,123,140,141,734,735,736,737,738,739,741,743,746,747,748,749,750,751,752,753,754,755,756,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,793,794,795,796,800,801,802,803,804,805,806,807,836,837,838,839,840,841,842,843,844,845,846,848,849,850,851,852,860,863,867,873,876,881,884,888,890,898,902,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,928,930,932,954,956,957,958],[74,123,140,141,737,955,956],[74,123,134,140,141,173,734,735,737,955,957],[74,123,140,141,739,741,911],[74,87,91,123,140,141,166],[74,87,123,140,141,155,166],[74,82,123,140,141],[74,84,87,123,140,141,163,166],[74,123,140,141,143,163],[74,82,123,140,141,173],[74,84,87,123,140,141,143,166],[74,79,80,83,86,123,134,140,141,155,166],[74,87,94,123,140,141],[74,79,85,123,140,141],[74,87,108,109,123,140,141],[74,83,87,123,140,141,158,166,173],[74,108,123,140,141,173],[74,81,82,123,140,141,173],[74,87,123,140,141],[74,81,82,83,84,85,86,87,88,89,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,109,110,111,112,113,114,123,140,141],[74,87,102,123,140,141],[74,87,94,95,123,140,141],[74,85,87,95,96,123,140,141],[74,86,123,140,141],[74,79,82,87,123,140,141],[74,87,91,95,96,123,140,141],[74,91,123,140,141],[74,85,87,90,123,140,141,166],[74,79,84,87,94,123,140,141],[74,82,87,108,123,140,141,171,173],[74,123,140,141,548],[74,123,134,135,137,138,139,140,141,143,155,163,166,172,173,548,549,550,552,553,555,556,557,577,578,582,583,584,585],[74,123,140,141,548,549,550,554],[74,123,140,141,550],[74,123,140,141,581],[74,123,140,141,552,585],[74,123,140,141,612],[74,123,140,141,547,617,669],[74,123,140,141,537,540,542,543,587,588,589,591,592,595,596,608,609,611,669],[74,123,140,141,591,602,603,669],[74,123,140,141,591,592,599,669],[74,123,140,141,540,542,591,592,595,669],[74,123,140,141,555],[74,123,140,141,540,547,591,592,595,604,669],[74,123,140,141,585,615,617],[74,123,126,135,140,141,155,540,542,547,585,589,591,592,595,596,599,600,601,604,607,608,609,613,614,617,669],[74,123,140,141,555,591,592,595,669],[74,123,140,141,591,602,603,604,669],[74,123,140,141,555,591,596,597,598,669],[74,123,126,135,140,141,155,540,542,547,555,585,589,591,592,595,596,597,598,599,600,601,602,603,604,607,608,609,613,614,615,616,617,669],[74,123,140,141,537,540,542,547,555,589,591,592,595,596,597,598,599,600,602,603,604,607,669,670,671,672,673,678],[74,123,140,141,540,542,591,592,595,596,602,603,604,669,671],[74,123,140,141,528],[74,123,140,141,519,520],[74,123,140,141,516,517,519,521,522,527],[74,123,140,141,517,519],[74,123,140,141,527],[74,123,140,141,519],[74,123,140,141,516,517,519,522,523,524,525,526],[74,123,140,141,516,517,518],[74,123,140,141,208,534],[74,123,128,140,141,208,623,636,637],[74,123,135,140,141,145,166,208,624,628,639],[74,123,140,141,208,624,641,642],[74,123,140,141,208,624,641,644],[74,123,140,141,208,624,641,646],[74,123,140,141,208,624,641,648],[74,123,140,141,208,624,641,650],[74,123,140,141,208,624,641,652],[74,123,140,141,208,624,641,654],[74,123,135,140,141,145,166,208,624],[74,123,140,141,208,657],[74,123,135,140,141,145,166,208,623,624,659],[74,123,135,140,141,145,166,208,624,628,662],[74,123,140,141,208,664,666],[74,123,128,140,141,208,624,637],[74,123,140,141,208,624,636,715],[74,123,140,141,208,624],[74,123,135,140,141,145,166,208,624,715,716,718,719],[74,123,140,141,208,624,715],[74,123,140,141,208,679,717],[74,123,140,141,208],[74,123,140,141,208,624,662,715,717],[74,123,140,141,208,489,624,1117,1157],[74,123,140,141,208,489,728,1161,1164],[74,123,140,141,208,506,725,726,728],[74,123,128,140,141,208,506,529,624,637,710,711,726],[74,123,140,141,208,506,529,624,637,711,726],[74,123,140,141,208,506,711],[74,123,140,141,208,506,728],[74,123,140,141,208,506,623,728,960],[74,123,140,141,208,506,623,624,727,960],[74,123,140,141,208,506,529,624,963,964],[74,123,140,141,208,506,641,642,964],[74,123,140,141,208,506,641,964,969],[74,123,140,141,208,506,641,964],[74,123,140,141,208,506,641,650,964],[74,123,140,141,208,506,641,964,973,974],[74,123,140,141,208,506,529,624,726],[74,123,140,141,208,506,624,964],[74,123,140,141,208,506,977],[74,123,140,141,208,506,661,727,728],[74,123,140,141,208,506,624,981],[74,123,140,141,208,506,529,624,665,726],[74,123,140,141,208,506,624,665,981],[74,123,140,141,208,499,624,628,1117,1157,1166],[74,123,140,141,208,489,623,624,727,728],[74,123,140,141,208,489,499,510,659,722],[74,123,140,141,208,489,510,659,722],[74,123,140,141,208,507,510,722],[74,123,140,141,208,489,499,628,977,993,1117,1157],[62,74,123,140,141,208,499,1117,1158,1159],[74,123,140,141,208,489,510,1173],[74,123,140,141,208,728,990,1118,1160,1161],[74,123,140,141,208,510,727,728,1175],[74,123,140,141,208,510],[74,123,140,141,208,489,628,998,1117],[74,123,140,141,208,510,722],[74,123,140,141,208,489,510,999,1117,1157],[74,123,140,141,208,510,659,722],[62,74,123,140,141,208,1117,1157,1158,1159],[74,123,140,141,208,628,990,1117],[62,74,123,140,141,208,499,628,661,993,1154,1157,1158,1159],[74,123,140,141,208,499,1158],[62,74,123,140,141,208,1158,1159],[74,123,140,141,208,628,1156],[74,123,140,141,208,628],[74,123,140,141,208,630],[74,123,140,141,208,630,634,679],[74,123,140,141,208,628,630,631,633],[74,123,140,141,208,628,631],[74,123,140,141,208,635,679],[74,123,140,141,208,628,630],[74,123,140,141,208,632,679],[74,123,140,141,208,628,630,631],[74,123,140,141,208,641],[74,123,140,141,208,641,968],[74,123,140,141,208,623,624,636],[74,123,140,141,208,641,657],[74,123,140,141,208,637,679,711],[74,123,140,141,208,623,727,959],[74,123,140,141,208,679,963],[74,123,128,140,141,208],[74,123,140,141,208,483,623,624,711,727],[74,123,140,141,208,623],[74,123,140,141,208,623,624,639],[74,123,140,141,208,661],[74,123,140,141,208,623,679,977],[74,123,140,141,208,623,624,728],[74,123,140,141,208,623,679],[74,123,140,141,208,623,624],[74,123,140,141,208,679,993],[74,123,140,141,208,679,727,728],[74,123,128,136,140,141,145,208],[74,123,140,141,208,679,725],[74,123,140,141,208,679,726],[74,123,140,141,208,506],[74,123,140,141,208,624,639,659,665],[74,123,140,141,208,710],[74,123,132,140,141,208],[74,123,140,141,208,626,627],[74,123,140,141,208,506,679,713],[74,123,140,141,208,506,711,712],[74,123,140,141,208,624,625,628,629,630,632,633,634,635],[74,123,140,141,208,624,625,636,1113],[74,123,140,141,166,208,618]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc782ff85b2cb10075ecffc158af7bfb27ff97bf8491c917efea0c3d622d5ac4","impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"21da358700a3893281ce0c517a7a30cbd46be020d9f0c3f2834d0a8ad1f5fc75","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"2beff543f6e9a9701df88daeee3cdd70a34b4a1c11cb4c734472195a5cb2af54","impliedFormat":1},{"version":"2e07abf27aa06353d46f4448c0bbac73431f6065eef7113128a5cd804d0c384d","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1},{"version":"42bc0e1a903408137c3df2b06dfd7e402cdab5bbfa5fcfb871b22ebfdb30bd0b","impliedFormat":1},{"version":"9894dafe342b976d251aac58e616ac6df8db91fb9d98934ff9dd103e9e82578f","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"446a50749b24d14deac6f8843e057a6355dd6437d1fac4f9e5ce4a5071f34bff","impliedFormat":1},{"version":"182e9fcbe08ac7c012e0a6e2b5798b4352470be29a64fdc114d23c2bab7d5106","impliedFormat":1},{"version":"2f4e6b4d39426a1b85ecf4bdeb9dddbf4d9b3397d95d8555d46f925c9519ec7d","impliedFormat":1},{"version":"78a2869ad0cbf3f9045dda08c0d4562b7e1b2bfe07b19e0db072f5c3c56e9584","impliedFormat":1},{"version":"89d5d28d4f57e000b836ac273079be1b75710e28ce14750d081fb420d37e2ca5","impliedFormat":1},{"version":"fd4e24ccff3966390600d7f5d6aa1fed5a512e92ada735ea5fbc933d313ad3d3","impliedFormat":1},{"version":"b7cddfe1aa6b86b5fad3c9ccb30d05b3ccb165aebbf112f48d2d8a5f69dd98b1","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64","impliedFormat":1},{"version":"bd2c7ada3dee03653d3f601011d30072194bc3970cd93208f9588fbdc0c69347","impliedFormat":1},{"version":"e480da45d32313e7174b265674da504f075f59ef326852f0c5a5d863b438ae85","impliedFormat":1},{"version":"ad54850f61fcf5d014e11be80d2f46fea9265cfa7e77456da876f7833ef81769","impliedFormat":1},{"version":"6f7c9e8bd2b5b6a080b07080065f94900bd3c7e5ebbd3047bc33fcce2fab1dd8","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"da5950ee2a90721df6f3fba45f5d05308f7e4c35835392215dd2cd404505e2de","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"f42d5fed19610d485c646a0c430e768115567d078c7fc855c57b0c578b3d6cd3","impliedFormat":1},{"version":"ee8df1cb8d0faaca4013a1b442e99130769ce06f438d18d510fed95890067563","impliedFormat":1},{"version":"d5630f2ad9b4541e5ce891648121022f9412ecdca1820baa1f0104f70fd7eff7","impliedFormat":1},{"version":"4d15375ab13497104bc8fe56fdef2b5fd6853f29255737d23a33fa306ff7fd69","impliedFormat":1},{"version":"2cd3fc1d0d6a1e85baffd2d4f50f5efb192b5446eef567e97c94765402f0aad4","impliedFormat":1},{"version":"e4cbf2f1e89ecccaddd2c045e600ae41b732295953fb06247c7dcbc2d281ed30","impliedFormat":1},{"version":"6dcedaef57dff0d79a05ab0ab602cde74db803d1e765468bf91263786a383e1b","impliedFormat":1},{"version":"8c1697d90c394a6fd955b98eae01238eff628e129b987a68aea10f898a48e7da","impliedFormat":1},{"version":"7580e62139cb2b44a0270c8d01abcbfcba2819a02514a527342447fa69b34ef1","impliedFormat":1},{"version":"b838d4c72740eb0afd284bf7575b74c624b105eff2e8c7b4aeead57e7ac320ff","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"d10d63718e1646c2279e3b33831f82c60e31f622b2b7020f1196409ca4c09242","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"148679c6d0f449210a96e7d2e562d589e56fcde87f843a92808b3ff103f1a774","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"02436d7e9ead85e09a2f8e27d5f47d9464bced31738dec138ca735390815c9f0","impliedFormat":1},{"version":"f8d5ff8eafd37499f2b6a98659dd9b45a321de186b8db6b6142faed0fea3de77","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"a22dd55aa4d39906252000ab8e8a1b83b195eef7f4274eb51e457c1f11cf6580","impliedFormat":1},{"version":"540cc83ab772a2c6bc509fe1354f314825b5dba3669efdfbe4693ecd3048e34f","impliedFormat":1},{"version":"121b0696021ab885c570bbeb331be8ad82c6efe2f3b93a6e63874901bebc13e3","impliedFormat":1},{"version":"612d9da66bb046a9c1e2e8d026245ded881fc4b9f98cbfae714415d57ee0ae0b","impliedFormat":1},{"version":"32c2ad9494dad5d11b0564a619fee18f388db6c1e9e2cd3c360b3122549691eb","impliedFormat":1},{"version":"6c301d40aec56a74ec7bd7324e31a728dadf9bfba3e96def02938d3d973534ec","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"aa14cee20aa0db79f8df101fc027d929aec10feb5b8a8da3b9af3895d05b7ba2","impliedFormat":1},{"version":"493c700ac3bd317177b2eb913805c87fe60d4e8af4fb39c41f04ba81fae7e170","impliedFormat":1},{"version":"aeb554d876c6b8c818da2e118d8b11e1e559adbe6bf606cc9a611c1b6c09f670","impliedFormat":1},{"version":"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f","impliedFormat":1},{"version":"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7","impliedFormat":1},{"version":"25a5f6fd3a2243c859eddc99ab5fba11d970af2fe7a5df9c32b7668f76f97b01","impliedFormat":1},{"version":"8d207e1f9d2c30d6f77dfa693f3827c3fbf0d89240297e10bdfe1041d433df68","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"8c70ddc0c22d85e56011d49fddfaae3405eb53d47b59327b9dd589e82df672e7","impliedFormat":1},{"version":"2f9c89cbb29d362290531b48880a4024f258c6033aaeb7e59fbc62db26819650","impliedFormat":1},{"version":"a365c4d3bed3be4e4e20793c999c51f5cd7e6792322f14650949d827fbcd170f","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"273782b8454e78f6a8b30d2cfbf6860499c930595095fcc1689637115f0eddda","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fbdd025f9d4d820414417eeb4107ffa0078d454a033b506e22d3a23bc3d9c41","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"9f9bb6755a8ce32d656ffa4763a8144aa4f274d6b69b59d7c32811031467216e","impliedFormat":1},{"version":"5c32bdfbd2d65e8fffbb9fbda04d7165e9181b08dad61154961852366deb7540","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"0c05e9842ec4f8b7bfebfd3ca61604bb8c914ba8da9b5337c4f25da427a005f2","impliedFormat":1},{"version":"faed7a5153215dbd6ebe76dfdcc0af0cfe760f7362bed43284be544308b114cf","impliedFormat":1},{"version":"7029e566b8df176f703fb59fd437a38670c7a0e02c58b2d66dfb5b2e2b2defdb","impliedFormat":1},{"version":"7f2aa4d4989a82530aaac3f72b3dceca90e9c25bee0b1a327e8a08a1262435ad","impliedFormat":1},{"version":"d96b39301d0ded3f1a27b47759676a33a02f6f5049bfcbde81e533fd10f50dcb","impliedFormat":1},{"version":"e9f147ecca73d9346a4c073432843c159ccbe50bdcb678a78f6da10eae2cecf4","impliedFormat":1},{"version":"de061f7d72bd65c06fc1419f841dfdcb29a8e22fe6fa527d1e6eb20b897d4de0","impliedFormat":1},{"version":"663beafc2446079574570cba86e9b15f986f908ddb1b01274509970126fee945","impliedFormat":1},{"version":"a3102887d5058bf4cb5b37fa6964c09e9527c42053b3b5c642b89878620748de","impliedFormat":1},{"version":"0aaaa1727edd29673d85c9b26d7ca4d54e5407a48586903c51b48b7f7d196f61","impliedFormat":1},{"version":"d35bca0b261bff02635758c48e8ab99c61c420d0dfabbcf467e847171d876b7d","impliedFormat":1},{"version":"3bc12c40d90c342ff88a3d876996c555ed5cbee5fe8c3308a240b321f401ee46","impliedFormat":1},{"version":"ba130768aae855a5477e9e148e5c879548e6e7ccbcc56fd1934c8a18ea5b7569","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"d38530db0601215d6d767f280e3a3c54b2a83b709e8d9001acb6f61c67e965fc","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"b499af2054a037a162b3b72cd886f48bbf32a3502c865c6e29fac7d2ab3ce0b5","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"48773ca557b0319c2ee62ae249cf52a81709e8be139920d6479a66274de7c4ed","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"4cceef18d7f088e797a463e90b7a9dad10c6bc667724b7686e3e740ae00122be","impliedFormat":1},{"version":"7ee86fbb3754388e004de0ef9e6505485ddfb3be7640783d6d015711c03d302d","impliedFormat":1},{"version":"cc1954b539604b1e562319119ac7e888172208b32ca873f9a357a92c826bd046","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"bb8f2dbc03533abca2066ce4655c119bff353dd4514375beb93c08590c03e023","impliedFormat":1},{"version":"706dd95827e7ebaabda91d5db2b755233e0952d98570e9c032b0f066a15c1177","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b103e9abfe82d14c0ad06a55d9f91d6747154ef7cacc73cf27ecad2bfb3afcf","impliedFormat":1},{"version":"cd9304972e6d616197fb44fce00540a904f38b54306a1951b5dbeaf3c01ab5bd","impliedFormat":1},{"version":"77438e2c397a3db78407621cfc57241a305b310ddea2c185f1d555248297f587","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"a6805fcafed712aea7759f8bc731014f9d22738c1d6ef9d43b8091d1d48346d5","impliedFormat":1},{"version":"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"d88ea80a6447d7391f52352ec97e56b52ebec934a4a4af6e2464cfd8b39c3ba8","impliedFormat":1},{"version":"142617b3cdf902b69c6464c9fbd942b60ab3e733ca18c032b19e0f7e2adbefe8","impliedFormat":1},{"version":"0b603555f1881f87256ffd6344d3e3ed6d466c2e701eabf381f28be8c2125892","impliedFormat":1},{"version":"897e4f7662488e3ecc79e743bdd3b78f13bdb69a97851afa5b440c4211e32ea9","impliedFormat":1},{"version":"e2e1c6d3b2d93add5200bd7bc1a8cccb4e446836b2111ece45db8683a2c765de","impliedFormat":1},{"version":"251b03d5cd243854ce870d9a9a39f491faf69898c5d6b5eee28cc7649c57417b","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"2c4de79f406d137390608e8c0a44fba2ff8e00bacfcae7c9d1781fef10e9440d","impliedFormat":1},{"version":"07ba23a10465791be5d22deaf5ef7de7658774ddff53721e5ea17fedea1bc721","impliedFormat":1},{"version":"dca8c645c5afeb03b1ecedbf16323f33e7d0afaa6256c8e047e6e38087a97f53","impliedFormat":1},{"version":"775f181bd4a533d6f8b5e55ec1d9f1624559720ae8a70e9432258da26b38d27c","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"7715134a0cf07dd41a9da2895d708625a3a303a0385e355ecaaf0b8bfaef2550","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"622694a8522b46f6310c2a9b5d2530dde1e2854cb5829354e6d1ff8f371cf469","impliedFormat":1},{"version":"cd8ce8d68567f62dd580b3c3c37777ac3f5b81944c7417f5ea83030eab533385","impliedFormat":1},{"version":"e5c939d896565dcac0f6fbdbada11284e7728ef26a069561c09aa5aa4a788393","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"a9e6c0ff3f8186fccd05752cf75fc94e147c02645087ac6de5cc16403323d870","impliedFormat":1},{"version":"49af4b52f0d4d2304c5f2c6fe5fab3e153e0acc38830d0202821b877c097dd02","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"e68b8e5a1df7c1be2bc105141456ecba70215806e1c28bfbc5c12bfce4be6e68","impliedFormat":1},{"version":"511c8f02329808d47d00b859c532ae9115590048b17325a946c74dac48428650","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"b5f9e66625783eefcbe3d2da074b2e7ba2066d61ce3fc6ef4f22805ad946cab4","impliedFormat":1},{"version":"e37115962d284b9f7a37c2bdd2add50f88365dde41f5e0ff591ffc48a8ec7575","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"f89488602bec98a142072fae7ea5ba99431a569ff580c64b7be39896474799d8","impliedFormat":1},{"version":"bbbc47961f39a57df103cf4ca3bb8f8732b4b6678a18225a0aa76d59c466956c","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"2ffb043dc5163458e473b7010859f86e01dc4edffcae0a93d885d028b426a546","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"05c7280d72f3ed26f346cbe7cbbbb002fb7f15739197cbbee6ab3fd1a6cb9347","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"04b7b2e0832dfd3c31e81df3975e8d8fda28e7ff999b0aa2932608a8f6661d5c","impliedFormat":1},{"version":"ca2d34c6ed5cbd3070b8b6f32f42ae54adcc6499c1e4b99f0a5798b3f27cc653","impliedFormat":1},{"version":"9ec68995e66dd6b9dac834bf5ae85fde802714ea2e82151a5d1d53ef01b463ef","impliedFormat":1},{"version":"5c4d626b4902f2ef8a1cc146d761d276cef988016dc674e3b98fbad70e64bc9f","impliedFormat":1},{"version":"fdfaa0aad899524962e2955287b5b991ffe3be50f64e02eb60c933ca44644a94","impliedFormat":1},{"version":"53c972a0f9bc3a4ec70fff7314123ea8cfcf75b3703046f767d2dc1eea87b2fb","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"d130c5f73768de51402351d5dc7d1b36eaec980ca697846e53156e4ea9911476","impliedFormat":1},{"version":"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08","impliedFormat":1},{"version":"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a","impliedFormat":1},{"version":"7303b45138d2511035056a5901a1490ebdcbf055cbb1276f8629c5121cbe733e","impliedFormat":1},{"version":"27f874cd5327507eeff699a74567f60c1215b94509f4308633a7b01922471ed2","impliedFormat":1},{"version":"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5","impliedFormat":1},{"version":"2c6cf04bc525caf6546e859e8ef10bfb9573837ec0bc5ec7b53a7b1b8ca72781","impliedFormat":1},{"version":"8695dec09ad439b0ceef3776ea68a232e381135b516878f0901ed2ea114fd0fe","impliedFormat":1},{"version":"304b44b1e97dd4c94697c3313df89a578dca4930a104454c99863f1784a54357","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"87cc05fe13108f02e12da7e3efd8e360fef78d96a0c9e11408ea1b1b9fb3e03d","impliedFormat":1},{"version":"1abbf67c218d23c2ce76887caac2df6c7dab3d97ba2b65348432b876f510002a","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"c06ef3b2569b1c1ad99fcd7fe5fba8d466e2619da5375dfa940a94e0feea899b","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6","impliedFormat":1},{"version":"dad97c99382889e9c7d1a9d8275500ff71235130fae9f8916fdbf3641d56e592","impliedFormat":1},{"version":"a6dba407fc287f1e25454e75028c91bbc00675f2d1c4e8b3edcc36c08611a486","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"e91f7b1344577a02f051b9b471f33044fef8334a76dc9e1de003d17595a5219b","impliedFormat":1},{"version":"c0723195c85e19656d6b5b9fdb81d3f3403c1ae4679e722c6ea058c516b38d12","impliedFormat":1},{"version":"b55eb9f72166093b5460d34b34f5d8699c968de3bc3fc696e40f2c93f2ebf650","impliedFormat":1},{"version":"71d9eb4c4e99456b78ae182fb20a5dfc20eb1667f091dbb9335b3c017dd1c783","impliedFormat":1},{"version":"cfa846a7b7847a1d973605fbb8c91f47f3a0f0643c18ac05c47077ebc72e71c7","impliedFormat":1},{"version":"1594da19968752a22b2ac48c2d0e60575700e745c577a8a4a676b841238ad5bb","impliedFormat":1},{"version":"e0cee12109e0a10a4c3d6769fcc7644b7c1ea7f52365bea51728f5af29f8a137","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"3536968defef8a75514f547ead5e2e9c1e984820290ec9b00c5fdfb6ef786535","impliedFormat":1},{"version":"d83773870080c30a230e322ce13a9c6f3398e8dacea4ea8a83e26370f3bac23e","impliedFormat":1},{"version":"dcfeaf98d66314fec29a9076c4290e45d0b196a65827becc19138e9c7b855f37","impliedFormat":1},{"version":"6849fe9210fe4946d5f085bfed36758f33dc6ae15a751338d178dd4daa017c46","impliedFormat":1},{"version":"888cda0fa66d7f74e985a3f7b1af1f64b8ff03eb3d5e80d051c3cbdeb7f32ab7","impliedFormat":1},{"version":"60681e13f3545be5e9477acb752b741eae6eaf4cc01658a25ec05bff8b82a2ef","impliedFormat":1},{"version":"ffae4e1e06aa848a1e4bcef162cd1c48e5909b26223515981310af9c036bdfc7","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"34e16eb7c31768a11a08aebcfb3d70d7b8f0b016197e98d8419e566ceae6d6c8","impliedFormat":1},{"version":"f94ec1f7e4b709d26960306c9082a7a1b728a6e13089346aa48ba57c74cbf47e","impliedFormat":1},{"version":"9a11cb4033405e96c247cd5aa29790212aaffdd127869e8a5219103f0b389fd5","impliedFormat":1},{"version":"01479d9d5a5dda16d529b91811375187f61a06e74be294a35ecce77e0b9e8d6c","impliedFormat":1},{"version":"aff5213585cb72e94054dfe17250ff315f3569b3919d1ef1ad235f37c4ee894e","impliedFormat":1},{"version":"fb2ea35e1be6388d722d7725e2b49c697d34d9c890c3b96758faaeb86d35cef8","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"1a4dc28334a926d90ba6a2d811ba0ff6c22775fcc13679521f034c124269fd40","impliedFormat":1},{"version":"f05315ff85714f0b87cc0b54bcd3dde2716e5a6b99aedcc19cad02bf2403e08c","impliedFormat":1},{"version":"5fad3b31fc17a5bc58095118a8b160f5260964787c52e7eb51e3d4fcf5d4a6f0","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"456006a6975b26c0a1785feddae165f6d307e2d601ffde27e21fc4a790e448a4","impliedFormat":1},{"version":"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"1fe0d18b111e1145a7e7601855bccd4ca20f24e3b9a5aba6bb1fa9d1a7059170","impliedFormat":1},{"version":"5632c3c26d420c063eebe64c45b1248b9492a67bf44f1d0c57e9dc8f6cf449bb","impliedFormat":1},{"version":"0df5aa619ab12993a39ea6dae062ee46eadbb4d738916460e636ada52bced75b","impliedFormat":1},{"version":"8fca3039857709484e5893c05c1f9126ab7451fa6c29e19bb8c2411a2e937345","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"10ab7be91f87ebe8916b62cf28af2e45b5601fc7b0e311adf838f912c6b31dd8","impliedFormat":1},{"version":"bc636fbc08e0979ceb7eb0731a33000283d77a33b62e1f71ee65be50394e40ba","impliedFormat":1},{"version":"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"75bbd3be047d539988a0ff0b56384ef7a6a25f3b676ad96bee547d44c31622a7","impliedFormat":1},{"version":"42960001a776b089ade681ab5cfddc936e0afb0615133ec1841f3dee89d3e1bf","impliedFormat":1},{"version":"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f","impliedFormat":1},{"version":"da47712b394d944328245482603bc6f416d3949b67c9392279caab595076b510","affectsGlobalScope":true,"impliedFormat":1},{"version":"37d0071d8f0a06dc55c2c5e0ec3391affd4fd107c53410bf358196ec0bf3923f","impliedFormat":1},{"version":"b213dad76ca37fd552274c9499056e1c0d9c1bd38a55bb7f68b22ba6b84c3ad7","impliedFormat":1},{"version":"c30436b130b6218b7714314dc41d3f459590db4bdf099eecd51cb1bda32109a8","impliedFormat":1},{"version":"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},{"version":"19df3488557c2fc9b4d8f0bac0fd20fb59aa19dec67c81f93813951a81a867f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"b25350193e103ae90423c5418ddb0ad1168dc9c393c9295ef34980b990030617","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"5a49adaef698b7ad7e6127949fa1b0bbd3d46b7cbd11c54e392a4dcdd51f5190","impliedFormat":1},{"version":"6ee598cdfdd0fa52039dca135b3dfff7b49035dc13292143e0a93843e3861967","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"2489bf04d77dc025ba67f49f1a56eb24b9db477d5ff88123d887e163ed1776aa","impliedFormat":1},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"0b77b819b5417775fccb20c678293cf614c054a5b1a65421a5b933a9124ba998","impliedFormat":1},{"version":"eb5acb58487367e502d994b57e2c58255d8241f481ea8efa8e79af23af3f41c2","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"b1f1d57fde8247599731b24a733395c880a6561ec0c882efaaf20d7df968c5af","impliedFormat":1},{"version":"f1f4095f04343ad6e6825eba41eb50f1555685560dde164179a467e65c4a921c","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"5a3ea721d03a361ccbdd7390ccd75f6e84cbca3a3f01f4b331ecc9af31890c49","impliedFormat":1},{"version":"e7dfaee4af38d45b1cab8a1ee0b3bc1f85ddcf64545ed391d675d78ae6526274","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8daa443eaf9a27fd382cc1f8ebe30330c0f4d89511cfb469166874806751d35","impliedFormat":1},{"version":"af48e58339188d5737b608d41411a9c054685413d8ae88b8c1d0d9bfabdf6e7e","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"1de8c302fd35220d8f29dea378a4ae45199dc8ff83ca9923aca1400f2b28848a","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"332248ee37cca52903572e66c11bef755ccc6e235835e63d3c3e60ddda3e9b93","impliedFormat":1},{"version":"94e8cc88ae2ef3d920bb3bdc369f48436db123aa2dc07f683309ad8c9968a1e1","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"07ed3ddab975995eea41b22f3010506fb9f5fb301d04820b07d7a1aee5477d7c","impliedFormat":1},{"version":"969d8b0965849f4bae7cab0ba90bd1e1220e95999c2c6f01117fa7500901c017","impliedFormat":1},{"version":"6ec840ee5e2bc103f557fe38b1d585ee250540468713d7634ee066de372bf332","impliedFormat":1},{"version":"b0309e1eda99a9e76f87c18992d9c3689b0938266242835dd4611f2b69efe456","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"6ceb10ca57943be87ff9debe978f4ab73593c0c85ee802c051a93fc96aaf7a20","impliedFormat":1},{"version":"1de3ffe0cc28a9fe2ac761ece075826836b5a02f340b412510a59ba1d41a505a","impliedFormat":1},{"version":"e46d6cc08d243d8d0d83986f609d830991f00450fb234f5b2f861648c42dc0d8","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"ff863d17c6c659440f7c5c536e4db7762d8c2565547b2608f36b798a743606ca","impliedFormat":1},{"version":"5412ad0043cd60d1f1406fc12cb4fb987e9a734decbdd4db6f6acf71791e36fe","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"e297c0a524edee7677939122f90027bfbe5f2698939d9a85728e5044b39c7124","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2","impliedFormat":1},{"version":"b62381cae176db34f003cc6172ee8f3e0122014889d66391aa73698105cf4934","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"41eb514d9ce0a6e87957f08a4b7af70d93f87637f37dee706e2d92a6601c25a9","impliedFormat":1},{"version":"e7765aa8bcb74a38b3230d212b4547686eb9796621ffb4367a104451c3f9614f","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"7bd01f0f28cd3aeb2046274d85208e245965f6f2948edf4f7b2057bcf9f22ccc","impliedFormat":99},{"version":"d2f2cf2b8cc92bea913cda4a076e0f790b23a21e84f989d12f0116a7fe3906e0","impliedFormat":99},{"version":"6de125ea94866c736c6d58d68eb15272cf7d1020a5b459fea1c660027eca9a90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5b20bc288ee49989c95b20847fc93b96bf61cc0845598897a6a53a967dd7d07","affectsGlobalScope":true,"impliedFormat":1},{"version":"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"d3b315763d91265d6b0e7e7fa93cfdb8a80ce7cdd2d9f55ba0f37a22db00bdb8","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},"7b550dda9686c16f36a17bf9051d5dbf31e98555b30d114ac49fc49a1e712651",{"version":"9f0b9aa5f8c1045f98e7a6e1bd787caa48050450f1ce859c09b0cfbbc85c4c6e","signature":"435a1e418e8338be3f39614b96b81a9aa2700bc8c27bc6b98f064ff9ce17c363"},{"version":"17c6561066a9708a09115ad4b49ff23cf81a607f54278c9b9b5865964906f415","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e","impliedFormat":1},{"version":"08b2fae7b0f553ad9f79faec864b179fc58bc172e295a70943e8585dd85f600c","impliedFormat":1},{"version":"f12edf1672a94c578eca32216839604f1e1c16b40a1896198deabf99c882b340","impliedFormat":1},{"version":"e3498cf5e428e6c6b9e97bd88736f26d6cf147dedbfa5a8ad3ed8e05e059af8a","impliedFormat":1},{"version":"dba3f34531fd9b1b6e072928b6f885aa4d28dd6789cbd0e93563d43f4b62da53","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904","impliedFormat":1},{"version":"2329d90062487e1eaca87b5e06abcbbeeecf80a82f65f949fd332cfcf824b87b","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"4fdb529707247a1a917a4626bfb6a293d52cd8ee57ccf03830ec91d39d606d6d","impliedFormat":1},{"version":"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206","impliedFormat":1},{"version":"5780b706cece027f0d4444fbb4e1af62dc51e19da7c3d3719f67b22b033859b9","impliedFormat":1},{"version":"60200590d8ecf247a6e9c769c6b79bd8e688c3af14ef208072d0c6954b25f125","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"6e8044a9ca35eb66823c9ddddf826ca28bf900cd0cb3d31b3007277d094dc21e","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f00324f263189b385c3a9383b1f4dae6237697bcf0801f96aa35c340512d79c","impliedFormat":1},{"version":"ec8997c2e5cea26befc76e7bf990750e96babb16977673a9ff3b5c0575d01e48","impliedFormat":1},{"version":"633775c57ac402a6f05d12d57eccb906d8324364341281d6cdd0de774d13ae64","signature":"50f8a125795ffacae7f3107820dc660812d53c75c1d9c3ac82fd3d4ee1073958"},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"4ead13a482c539b77394b2a97e3b877b809eac596390371cea490286f53b996a","impliedFormat":99},{"version":"06db2f8ba1d1dfacf04529cb731081ab23f133f29c7608ebdfbcab356996827c","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"3a582c6e8906f5b094ccf0de6cc6f4f8a54b05a34f52517aba5c9c7f704f6b28","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"49ab4f1d153a252779958fc87b700743d32b5ffa42addd70ae23ad3f429daa5c","impliedFormat":99},{"version":"0528f6d21f7a02d4092895090d2dd86104bd5a3e79eced96d5a1a7dd90943d17","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"5c935b7fc4ddc1410ea1cd7cd4e35ed106a6e4920dd27a9480a40fd224359dc3","affectsGlobalScope":true,"impliedFormat":99},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"370bde134aa8c2abc926d0e99d3a4d5d5dba65c6ee65459137e4f02670cbf841","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"e3cf0611709328b449ec13f8c436712d62003620ce480139fae46ce001c2ee9f","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"cbb1c5ba5dbabe42c19ca31b83e48fec95895484fe1d1a8fb649b69ea224c5b8","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"72ce5b734c05da85c85a6f6dc05823b051d6aa41acaedeeb1d17c72f3b4efa72","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"53cf4076f42b29b8d411259d168d51b3a0274c42c8814e5b44dfa8803a35d4fc","impliedFormat":99},{"version":"a39461ee1f27cf3e6cfd63d21045713d26d521da55ea4d8efccb705f689e6dbb","impliedFormat":99},{"version":"61bb64660ee150f3ab618340e15cca0a81664801bede7c966ca0eca3a952fe63","impliedFormat":99},{"version":"42a12f2faa483c9b48195ed794d22698162274e755f6e07219c2351c4f08d732","impliedFormat":99},{"version":"ec0c42bb0f465e4993f2bc68a6ce9df9a2dcbc7b83e21748f82f1b69561938e3","impliedFormat":99},{"version":"f50ff37a9cbbe74475f426474d9827083c7c2c138a954d28f1690df338f69291","impliedFormat":99},{"version":"61fd6c17235d530c40f543dd7c40afab091d91c1ef890baeed30db6d82b04b28","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"091767bc841f937654ed597d49e023ed59850355e746ae1a6f20ab31076ee1fb","impliedFormat":99},{"version":"19c6d6135af59693698d384050b45a8a049493500add442f58e4bd7c8a255ab6","impliedFormat":99},{"version":"6a0dba12d55314638a8c51108b20fe2f68f1364a619d098918bda91c22dec154","impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"2b39c6cf59088713babbfc3e20ee85f1375d40e66953156fa658346b8346f24f","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"5e2ba3d18d78aebbde1f34bde356e41e9c76eeaeaeee56a37036596a9eff4211","impliedFormat":99},{"version":"8280ae8ccc0493b32d1742d585357ab9f0a508ea050af25a5a20d64010d0a5cf","impliedFormat":99},{"version":"7adfd9f9056ecd4ae6c65fde2a98654960c662714c73f048478959d04c09e144","impliedFormat":99},{"version":"437b7613a30a2fcde463f7b707c6d5567a8823fbc51de50b8641bf5b1d126fad","impliedFormat":99},{"version":"63ea959e28c110923f495576e614fb8b36c09b6828b467b2c7cd7f03b03ccf9f","impliedFormat":99},{"version":"1601a95dbb33059fc3d12638ed2a9aecff899e339c5c0f3a0b28768866d385b4","impliedFormat":99},{"version":"56fc978580577d30f4c2cdb5b1eb9217b66ed66537dd27141256f426e4b8dd68","impliedFormat":99},{"version":"2c5413050a2580becf9d82dd7e3006b95623e96f145356bf73230cd635352f70","impliedFormat":99},{"version":"860bedc71ead192ea4a0ea5ef4686e65724d14b391ebd1a6671a7044e6bd8e15","impliedFormat":99},{"version":"7c0a845bee4a084cbb8654709f48e5f13e2f6d45e5e2dde7c57cadf79fd9e3d5","impliedFormat":99},{"version":"7fa6fdc6eeeb3850e6b3166836f8c9199594c4f4bed3cee02cac0ca33d71894d","impliedFormat":99},{"version":"e53757f3e6688e8be16b36ccbeedc85637e607353fc67ff7b6665d6005aeaa12","impliedFormat":99},{"version":"88ba2660f5b024c7afd02ea700bc0c677687e17e34f0a94c3256ddb55e0f1c5d","impliedFormat":99},{"version":"7bbff6783e96c691a41a7cf12dd5486b8166a01b0c57d071dbcfca55c9525ec4","impliedFormat":99},{"version":"f35b9394ab2ab6fa8ef96f1da7121fa35c20ff6bbbc4fc3dcd3d9939f2088778","signature":"4b96dd19fd2949d28ce80e913412b0026dc421e5bf6c31d87c7b5eb11b5753b4"},{"version":"b845876de475c230a1e012150db8d2c2a62bd6835a93e8cd23ebb10f7de16266","impliedFormat":1},{"version":"814f738579780b6de88a0c2e9d45241172f0d0e5678f88055456dc025091cb88","impliedFormat":1},{"version":"d5eb5865d4cbaa9985cc3cfb920b230cdcf3363f1e70903a08dc4baab80b0ce1","impliedFormat":1},{"version":"51ebca098538b252953b1ef83c165f25b52271bfb6049cd09d197dddd4cd43c5","impliedFormat":1},{"version":"fcc2e352acaf704cdeb56c3ac4faad61fcd1980d3b30b578e1b36cb5e473d4b6","signature":"142bd2b0d072e07e87cb7f1f7a66a5beb6ee8bcf895f1488e92dc8db1f736d69"},{"version":"0e3ac895662d6f12987ecea09aa8f12d6de2a05607503322c0655a9cbea896ff","signature":"9b0c5a4886ff14e0fc3293dbdccfc9f326219a75107ba82753bcca05b48e866a"},{"version":"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d","impliedFormat":99},{"version":"26c57c9f839e6d2048d6c25e81f805ba0ca32a28fd4d824399fd5456c9b0575b","impliedFormat":1},{"version":"2dd8be064ad2e359d5f6a2afa7d0d370002803a5a52d2ba454a5de746de0f841","signature":"e0c2dd1cd4edee2cbf542c344b9fbd146a4c62d84c44fc3e06f6341a78d19533"},{"version":"13826bddff48ed1ef0094aa1f876654713cae0273ee378cc7305238563bbf95f","signature":"99244e3b5838e153ec6be3893a3a1013511a170bfc41a3593c3b2a6ca6d3af6a"},{"version":"721724ebc3d4730552e56054973e8ea2005536558044a7a445219c4a2b2ecf2f","signature":"271893659c054640a8c33a32dcb2017c9ded19c645e55f277c03429ed025e7a2"},{"version":"577f326dca745320d546c4a52a95ad3ccbb0e8e4e601a65e550201d5071e2086","signature":"af5107e040beac673491eb5664583f900380f07a355ea66f56740d7019686e87"},{"version":"914bb038739070238d31247b0664d87e9a9cb015f1046f0c06d0043c43bea18f","signature":"066a41c25d0e8fb7fbec909c7a57178c59348c3d0532b467fe0f7e69a4a53531"},{"version":"1dea6fd481abca43b854f1186b229337c8c8f6c8a8943ea3e8f84f19fb138853","signature":"01813a9e9bc387289f8d132cc83c01c968c191b8edc8c4c65c19c3441ae7e371"},{"version":"81f6ebb2fb7b9439f7c9159d3f2ea245b872c4be9261b2dbded89a5e84ba8f1f","signature":"13fd8b255e869b5fa0affe8267e8cbdf090725b3ef4217e886b60d1e31d48167"},{"version":"9554230a35fec1689830cf0d99e2af7560f2d537062627daca3f04d7a9c1b48c","signature":"32a97c54bee6be6c662499f2470ba13ae919e3ecef466647a75750b12545dceb"},{"version":"78e473a9351602aabc4fe438609772dd9b434445554dcf66ac4a5ddf0dc45f38","signature":"c60a0077296cbd78aa2f9594148baea0efadc4b96e3a6478dafc79d5867f3284"},{"version":"1f9cc2df4b0ea9bd8d4f52ebe786a8fd9354cec753e602b9716a19f6de124fd6","signature":"3fd8a8e3dd63e2a4b747baf6e9a31877e54672250d090469d6eb4d8cbede770a"},{"version":"1f2c9a068d63f3231019cb46ffbcaa7a970616b4b69116ef048b26014ee81c92","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"0649c12dc6656b855f8bad3c7a062839c8826b7d267af21998edbbf5af1c57d8","signature":"3d7946507dae129795080a02bab7a4b7bc4f6244a48adf0dc660f1e8ab5103e7"},{"version":"c52e3c4d819a8dd20dc28d4152e736a84dd2c9975db92c9c028a6bca06e3d7de","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"adc710c8f13b6a1b22ee70c9486a1ac50b06c1944def32707c5062a8a40e40f5","signature":"6168268066858f4fafb56fc41eb0b1af0de626ce9531395f19a2735566fb85c2"},{"version":"a4e112bb9e88ed09332d19f96d1a132a98373367834c2a4be65dad0bbafb0705","signature":"1a0bcf03b00e07828f5e872fdbaab220709fa2688da57ce13b50932ecb1f3293"},{"version":"08c160c9ee99f01cbab81f6cb2b58dd761268deb4ab6da3b3decfeb41a82641b","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"58b0cb42e21ec1cb34f0538410ccf3c61d9a3a04a0da52ba7b2e004b002c6f81","signature":"d35d1ff3014e736cdc9b149e8ed1cbbb18e18e445ed6474da610be28acd57a0b"},{"version":"d7f3f75c5c554302b87f6003d105bafd07bdc872e87aa944f76c0b51189a0f40","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"e1272b30f014037900795addf0939d1ce07b007011197faf38801c1610adeda3","signature":"0b6de03966b8ded6ef56c822097d233ece4783beca4e8782434e2a0927a8ee63"},{"version":"16ae8bdc1bcdc8056515e5c4d00538113e2797fd473468c3c2793a4172b18ae4","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"7cc4c2c27c160662136352203731c195623bcf35b99959d36e8f04cf3e8532f7","signature":"c9ea8ea67a409de77c0e2fce372e3771c36bff087f636609e2107be709217b07"},{"version":"f17484eb748b174e1a7d3c0c35dd1a4e0b3f7d1adcc76d8bff009f7485d05706","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"91e9e422f6ed78ee4fe3645e0b0328307a1db432fb93f7c22af91c1425afc91c","signature":"f5e4dfa32980b7fed9214685625164b5e8f788d1de807fa4a06d5b3b59aa694c"},{"version":"6e9ac8cabbd6f21f80171e11f28e5af2103c249476d8d265a7d23c78479e564f","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"b1f4b0d7b6352c729d9ade29c7f1ac55b7b44baf180fb6c14b21b24c17c20388","signature":"7557d7d75c45d107500f7dbc0112ae4c5022535cb724cb5fbdc27bee4128de1e"},{"version":"6679c8b2c0ef6f2b9427c0038d1f2bee69b6de6dab24e578ef58b51cd1d52be9","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"15259d746bd936940b342dfe479443759f11c2b9d8b41459dd02684e6c410d2a","signature":"e445c525a623a48759e0e46bd5daac5dfeb8ede67c5fd1df85fc6e326bfdd01f"},{"version":"3a4b7796803f1ec612e8937fee46be4e48d53846ce338606567d7a783892cb5f","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"0340f5162637c4aa4d42a9f492f2d02ebe34179119276e7c92f3d331d3387afa","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"b07f64ff6ec710998a62b07377fbda0ab4c313ba1f0055bfe9faa22cffedd47c","impliedFormat":1},{"version":"ddc4b1f1617c1a91983d9cecb50fbf0ad840d3079ad67c6db66c6afd0827ce4b","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"cb4e23f9522e57ef260848fbd6e4124b0ef3b2e61c76e3172e6f921f432d09b4","signature":"1a875976a051a5abd4ddcab5f650ca40c75b9280f4a5c1ba5b3b67a59ff62620"},{"version":"3a0ebef3ee6b11fd0d2a292b9e846664ad183cd36748b431e174985b367a6b7e","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"b728abb6b5a6493a49c4121f93d2db90dbda28d74ea2be77305de5cd43f4fb94","signature":"3661a28309bb6fce50e17773f139dcf1d3cbd7e9c544486f24c34f19e4b208aa"},{"version":"7b89e69ad5fb02f0c55aeb1ce68219ecc9d85db336aaa577e86662c7863097fa","signature":"8a17a975523784d8861bc406b3897ceeba2cf5cc2014b5d8e6a119c03a51e4f1"},{"version":"764aff335275defef023dda5112961e653685accaf39ccddfb8cb2d746023430","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"8426e1a7c34c1af0ee0f89a776af116e68ce5527dafe99e71070503ce1e5c75d","signature":"eb80255ca14f1330ff1a361901a02d0bbd7b48c87b0c20ab90b341206922a0b5"},{"version":"a294ed8ec9a9921f697afef1a031cb1901c0a7d459b55a98e71f95ed4943a4ba","signature":"dc58e6afeb974a2a055366dec38054cce2b00d5716aafaf329267b4e32949538"},{"version":"e16767aabcef24ff02b3c229de4e6839ce206bf9d84eee9d3b6185cf33c31ac9","signature":"4ffc694a13cfb6aa43e3926e1d8e05ded8727af2e95835063c1d98e75c5d7ad6"},{"version":"e67ccb5aa3e56a52e853e4bb2acd1ae036a7a39748e5d46469b504c609f3150c","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"4ffba3c5848b4fe62ee59b754fd5f256ad9656a0db6d37b9a2a8cb40dfc7ac21","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"32b35cf0dc3a1b1a7118b61c34ce2ad1a29695851679f9ec34e0776f2ece2a69","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"59e5e964b84fdb2378e9455e4e59405030e4ed2b4c6f891ce395f17796af3cbb","impliedFormat":99},{"version":"dd51e53752b310bd20c9b1a87bbf12b1fe2be7fe40f505b43199496481096275","impliedFormat":1},{"version":"a87be4662442b3feeffc331ecafe6b36cafd08727e2d7f2425a5099577e7fd18","impliedFormat":1},{"version":"cd4cd9220a1ba793bc935e76d8e5481c110a90d9868ae7866a182ee71cdb6abb","impliedFormat":1},{"version":"0a7fb8619b10bc05fd933ca9ac1c8b2ab2220be7a57b57565c3ac158595494ef","impliedFormat":1},{"version":"c4a5f91feb9c5a6b2a91089d959c38391b79a961db3b9cc73b8877d57ad7dcdc","impliedFormat":1},{"version":"90ba95a763101bb61b8a799731a2ed60b5016b8135c1a2d5186862d4b534d4a1","impliedFormat":99},{"version":"ef52b983c108a10854a26ee467a86c9b5f87024563d48defe3b0e8f4a1af4a51","impliedFormat":99},{"version":"a380cd0a371b5b344c2f679a932593f02445571f9de0014bdf013dddf2a77376","impliedFormat":99},{"version":"dbbcd13911daafc1554acc17dad18ab92f91b5b8f084c6c4370cb8c60520c3b6","impliedFormat":99},{"version":"9c06dd902f40b340b062fff14d3ef579b67c65007fbaba56497422a21e2e5911","impliedFormat":99},{"version":"b026daf5c00c8f2abdb49008322a7d51fbadcd7b200a99ee7a4452dbd40f0420","impliedFormat":99},{"version":"e130a73d7e1e34953b1964c17c218fd14fccd1df6f15f111352b0d53291311bb","impliedFormat":99},{"version":"4ddecad872558e2b3df434ef0b01114d245e7a18a86afa6e7b5c68e75f9b8f76","impliedFormat":99},{"version":"924e513606180beab310a21ece1fe85dc3f1cc159bd894861b01bbe46764d7ca","impliedFormat":99},{"version":"270ceb915b1304c042b6799de28ff212cfa4baf06900d3a8bc4b79f62f00c8a7","impliedFormat":99},{"version":"1b3174ea6e3b4ae157c88eb28bf8e6d67f044edc9c552daf5488628fd8e5be97","impliedFormat":99},{"version":"6564db88fa4cf3bae5c8e0de01c701c6228eaeef1118b4ad6a49a8aaf8556350","impliedFormat":99},{"version":"9c5a4a21ed5686b2ea080557488b966c3aeea641ef1aa8975a10e5fc59dd569f","impliedFormat":99},{"version":"5585ed538922e2e58655218652dcb262f08afa902f26f490cdec4967887ac31a","impliedFormat":99},{"version":"b46de7238d9d2243b27a21797e4772ba91465caae9c31f21dc43748dc9de9cd0","impliedFormat":99},{"version":"625fdbce788630c62f793cb6c80e0072ce0b8bf1d4d0a9922430671164371e0b","impliedFormat":99},{"version":"b6790300d245377671c085e76e9ef359b3cbba6821b913d6ce6b2739d00b9fb1","impliedFormat":99},{"version":"c92c9dc7415bf7969931ac5339f21c65687909b32d05ac89789b411372e52991","impliedFormat":99},{"version":"a36c717362d06d76e7332d9c1d2744c2c5e4b4a5da6218ef7b4a299a62d23a6d","impliedFormat":99},{"version":"a61f8455fd21cec75a8288cd761f5bcc72441848841eb64aa09569e9d8929ff0","impliedFormat":99},{"version":"b135437aa8444e851e10cb514b4a73141813e0adcfcc06d702df6aa0fd922587","impliedFormat":99},{"version":"cc82fa360f22d73b4cc7f446d08ad52b11f5aba66aa04b1ed8feb11a509e8aff","impliedFormat":99},{"version":"466e7296272b827c55b53a7858502de733733558966e2e3a7cc78274e930210a","impliedFormat":99},{"version":"364a5c527037fdd7d494ab0a97f510d3ceda30b8a4bc598b490c135f959ff3c6","impliedFormat":99},{"version":"f198de1cd91b94acc7f4d72cbccc11abadb1570bedc4ede174810e1f6985e06e","impliedFormat":99},{"version":"83d2dab980f2d1a2fe333f0001de8f42c831a438159d47b77c686ae405891b7f","impliedFormat":99},{"version":"ca369bcbdafc423d1a9dccd69de98044534900ff8236d2dd970b52438afb5355","impliedFormat":99},{"version":"5b90280e84e8eba347caaefc18210de3ce6ac176f5e82705a28e7f497dcc8689","impliedFormat":99},{"version":"34e2f00467aa6f46c1d7955f8d57bffb48ccc6ad2bbc847d0b1ccef1d55a9c3c","impliedFormat":99},{"version":"f09dfae4ff5f84c1341d74208e9b442659c32d039e9d27c09f79a203755e953d","impliedFormat":99},{"version":"e7878d8cd1fd0d0f1c55dcd8f5539f4c22e44993852f588dd194bd666b230727","impliedFormat":99},{"version":"0d22b18cb407b03331edf3413b93e568da71130c906fd69911090df2abf55414","impliedFormat":99},{"version":"c9c7c7a002564778f4b06ee408fdcebbd5c45b362c878ed7585d0252040f318e","signature":"190bc31e887d3b57e4ca3edd393ae4ce43f513309f8b20180acaf36ace8d81e4"},{"version":"5ebbb52830de5ecef0bf1196782f5df8352b93995fba66d326708c9c3ebe457e","signature":"9e280703beb5208a50a713b707389aa9a5dcd8b4169ff3435978e94454168ccb"},{"version":"d06a7ad2fdcc78708fcc06db94613bc2d67a712cd29fd706184ced33308bc72c","signature":"1a5909e33923f02624823f353313584b1050af3027d538fe151f15c1e42c1f7c"},{"version":"82f0f11f5e961f1bfe0668f007abcdf0a0807bff5e8989551e8a3b8b90c6bb14","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"6aba454dd2d0c94c81df6e5c0af2533fd5d45740a831371e543118b2fb8f1b2f","signature":"06ce51799ccf19481c5b39b73da2ec73def1505c566ff45ca47f4278a2cc3c10"},{"version":"40aa85154cdfa87db587e2c844df7c097e9684f58726924ba9c52848ca0e7ef3","signature":"6d68038bc09cdceb810eac785b2697f2ef4cf3208ef3b3fc463c6405c9f7345b"},{"version":"b08e11b7dcf58480156b728d8138a8091c74831d14cf6641c6adfd703ea8336f","signature":"4a9b9d1b8b3bb30310a53d633ceeeb9cb5cfde62bf1d2a472fb606f91d16af14"},{"version":"329c157e4f6e03d2ac6bb7162c045e53180b5a4e8c90c8222025e0e8522d1d43","signature":"74321132794820662d1fd69daf5b070389e94f9d7d9d336a244ea48f50130e55"},{"version":"f00b58c4fbc967b9f289beb51e81804cc4fd32814cd595e66cbeb121cc474568","signature":"4da0e3b59a6b945fc599ee7fb4b3f99fb87f4f2ba2cd3ca9c6ddc65b421aa21b"},{"version":"3daee58b19e82dff31eaa60420bc24e4640247672a58c4cf75635dd92db8b4f0","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"3f9a59292f0f47b458d6b228652c675b5c1aeb7adccb99d1ec9ed0bb2b3b328d","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c435659e451c271fc23fe39edc4d8b520b8cd74685316ea20d9fe40e406f80c1","signature":"f99709f13b0a7ca6adad14919a8adc5f4d16c786eccc5e75bc436468249f50ad"},{"version":"b0298d7990f250660f2ff2ec30c387e6088a52f949753f4b1c208eeae8d9968f","signature":"5f5303388c23daf221df682ba0e6ed13924ad3a925fae5ec71f4cdfb6adf1b79"},{"version":"3f57545676f1fe83033455f5158781bfa6e9a9a0c1839777974cae9b414ef381","signature":"a2d6b0579d4d2be4674823db4a6f1f14c44545efdac8bdba750fb33a0f53002f"},{"version":"52d4e2d57a560cdaa95111fd49d1d14d7f75f79270396b96ca4d3cf89baae35f","signature":"b870bb15e6753ecf295676777249a7dd19c271f1440e21b8d23e4bdf3917856e"},{"version":"f5cd26776cacb2b61f948d316ea9bc2ec07ba9cecaaab8f99d601b1214025946","signature":"1ba1f985850caa2082576a7c2ae2728fcce67001889cd6328c32a4ae4b2942fa"},{"version":"a20646b7df596f9f3d2614126f246574f6235a4049b0414793e7fc2297df110e","signature":"3459d2cb97efe699d09232e3541f87014cb29f53388a2256abc7d3ace9215625"},{"version":"68b248dbff87c4b674ab305bac7acd36c3d7813d5c59f9ff8edbd221bc09e086","signature":"a56cfed91ea3dbb5ca46cd7f3d8b45316f2e6a1f4132af29fdc5b9819b5406ee"},{"version":"590c2b76de73c03c5d75514961c0cf03603f2f7521b8e6ba1416382cd911eb59","signature":"dccc4e870657cace175fef718ab32cc0b190e03b86b75849e472c7363d6189c6"},{"version":"af42845e21c931b71769ac80bac96c3246d37b9eb15b3440e7e284cd6b8ed300","signature":"7e331b20786c105d557a28d787b73feff36caafe86eede29ce76552b86f07d56"},{"version":"ab100d5ba3017771f9ca889661f40ed03507021a7b7ccf30fd49e494ddba158a","signature":"7e331b20786c105d557a28d787b73feff36caafe86eede29ce76552b86f07d56"},{"version":"e20135f01c270e423a3a0ecd925ddf43a09aa9b43f988077a61917b4c37b1b2b","signature":"f9530fac67df325ddd89005afc271ba4f78634d66a3b6acc49cffcc87f450c25"},{"version":"c569e80986c2db1274bd5581fde40c556f3b8f39e76c36c6c0daf08c654d1a4f","signature":"e3342a501a3721852fa2bf8f71a1ef77691745608d3380588140d8290746c0dc"},{"version":"529e8d544daef015d9b7e08f3327f487ff5c1fdc9ae00969b90fe6d7f662c410","impliedFormat":99},{"version":"32d72e24ec52676fbd422d6109ba2e7326f8cb0ae09d62433609994d772b1218","impliedFormat":99},{"version":"e94825a54ccc0d3ee220d8194d3871735a633bc9840af4c228b90572ec8f9bca","impliedFormat":99},{"version":"ed5ac3ea851a0e455e615a7c926d3cda913d4171337486950069b9c2fb6db907","impliedFormat":99},{"version":"97c9b25718cea0d37894c5dd9f7e7fff4f8bcbc56ca3bba011c074560be291f1","impliedFormat":99},{"version":"abfdbcd2e417125d1b38209aa079bfec08b42611feedaebf29be8676e74c43cc","impliedFormat":99},{"version":"6d7a5d9f2190bd6d5086a130b3ef5231d7bc8a3d923133628544b265611a3afc","impliedFormat":99},{"version":"403e455c8e79b78dd1884e79d6c6aa77cd0eb8a500ad26a39c03ecccc96187d8","impliedFormat":99},{"version":"7debb6b27ee0e7383618739a56fd13d9332d58a97eb1001f57ec2d4c1f133536","impliedFormat":99},{"version":"828968bfd8325c1e6b427043673be3aee122dd5125ea5ff3adcdb56cb62ac202","impliedFormat":99},{"version":"29862235bb48e3e8892a5e95aa464810a6c0282ca549f4c0f65cc2329c4ed90a","impliedFormat":99},{"version":"f865992ea8a69f28d58dd1c276d5721df7fd32acb1baac46ee9f2ab1b4ac7148","impliedFormat":99},{"version":"3ec9cc0d5ff3509a3800802248b56f72d0bd4ddbbf4ced7238ced162f6792bf9","impliedFormat":99},{"version":"b09e328891c9b6c1e363a0dabc2b7e9bbab7ce95f4c1a42e3ebc1cb957aebe2e","impliedFormat":99},{"version":"9989a9063fc9c82bc1c1d1fc3363b90a2e9874f625d044dcc2f726b4ac0eff74","impliedFormat":99},{"version":"a861ffb4131dc6c01a9918b0c2d9eb907963a363019c8cf8441c195cc7271eb3","impliedFormat":99},{"version":"7dbfd2dc59802603b4d9d9cd35bfa777da1cd030ffc78f618701772d70c44d7a","impliedFormat":99},{"version":"5c62f873da6df6521abedd307fc544d6736d04604ae168233a63e4ee38ddce51","impliedFormat":99},{"version":"441d1761b0cdea56381964395929a7dc78cc8294f07550a4a7cbd7a471982d49","impliedFormat":99},{"version":"0a5ea01b61f08bb7fe4aee10e148a43bd63cd09c0e48c80c81853a31c63e81f1","impliedFormat":99},{"version":"0765436722d07c50dd64a72cb2ca2b828ae4d8b6c58cce1c7d69b16ed69b911f","impliedFormat":99},{"version":"a99b58cde0c933aafa9a6d539796dd39a2b6faa5868b9329611b7820e4813ed2","impliedFormat":99},{"version":"b70468dd5cce06b4500b9c744b46645bb0810bbb3f16d6f6d8a6ba099d3e3db3","impliedFormat":99},{"version":"fcad406a5312d678f0e3d9ce37e175fc3108075dda7507b33de434d815db8c3a","impliedFormat":99},{"version":"637470d7618d80acc44ce21720e911b1956fb8f35fcd7c29fca8b676569257fd","impliedFormat":99},{"version":"bbc35778ba8327cc2595d22a0492b38a4f5a23c156fe83a4f6c16e16d771a80d","impliedFormat":99},{"version":"1bf505b116e5c3adb7a621d3177726ec218b39b6fbb343a5ca9131bb4c4e4a2e","impliedFormat":99},{"version":"0d40d64f4e5b821a820ca61cd3338fed6feaea4734081098ab99bf8b22b7a558","impliedFormat":99},{"version":"f8f793150b733a84ba31dc32b764f914c2b9f7ba3da22392c8700729556311de","impliedFormat":99},{"version":"45a86d3d3cb4c51d3ef64d2e0f5551ed913ab36f5a522a1e683859b963b20864","impliedFormat":99},{"version":"1e5ac74ec58a751a57547db79f5d0c7f55de7103b3cd608df9b865f1c20e6ec0","impliedFormat":99},{"version":"fa31117b2f9329bcbaa72c5be895a75b74c1a4d8f2c3d2efe5483679e3e21e34","impliedFormat":99},{"version":"b784c2ceea6c1279bff4ab353e5a5c5b358fde3c734fdecf85cc1db5cb44c93d","impliedFormat":99},{"version":"c08fb9233e497eb092616e3081963b6dd70103bba3ff633c072d6d944eae134e","impliedFormat":99},{"version":"22ca8010367254aeee193d066acb7beba74fcb28c8e197bc4a4b4e4a6c3cbd54","impliedFormat":99},{"version":"36623fa5d097e9cfd56c9e12174d4d597f11946e8a1768441aada243dd2c6ad8","impliedFormat":99},{"version":"8dc7ed869ebc983e11a1efd9b696c863b51d6546d225d7b22ae86a892bfb75cb","impliedFormat":99},{"version":"44eac542e0103f7afded458f607f26a7f3c2ddaf8214fb417955e76158f843f9","impliedFormat":99},{"version":"0e5bf871c5afa81fd718a5b276f6a7670846ed459db52fa477267d6b9584e5d8","impliedFormat":99},{"version":"cb816d30908c10eac8d05be80c6f57eddc311deb8fb7e67f712d72445e36562e","impliedFormat":99},{"version":"a4965dec5a8d5a1bd151f788d8e1e2300c4314907adc4b70e205df9bf1de1846","impliedFormat":99},{"version":"757b25663615b67539b212022e464ab8738fe9584798abd2f1dfee3ae2bed28a","impliedFormat":99},{"version":"02978cce808e17ec86ca7f339aaf18665f59122fa99788c07f58f3d0242d7458","impliedFormat":99},{"version":"58e0c95210443e453ee55336f21bb03e770430bd19722041a77a2e86fc73df95","impliedFormat":99},{"version":"3217478b66cbc150f70691f22995b9f47d37706a904299a00cb293f8bed70a5b","impliedFormat":99},{"version":"aba7430768196c0d2dda6ad7660d4bd1ce5abb9394d5ec506fddf897cd055c17","impliedFormat":99},{"version":"ee866da8002c997f01f44fea43acb5289d41b63dbeafab73989ea94bc24284b8","impliedFormat":99},{"version":"bdf8e7a5231d55fb3d4e630c0b278b07a340858bef4bd92aa8688ab17aae26a2","impliedFormat":99},{"version":"4d0d48b4534a83b374888c23427400974ad8e61c7d0e20c8b6e9f1ee1bc7a264","impliedFormat":99},{"version":"c89ecda51758810cde711384913cef5a52a609b120f7ff5b1b158781e8ef4a8c","impliedFormat":99},{"version":"24c42aeeb11009fb88b3dcd9e1f3712794f470b9455f3a0c088582c77c59e1af","impliedFormat":99},{"version":"4771b79f499e7e11ea5fb73b3f0c753e3a581ab3979ff79ef11f557598648ad4","impliedFormat":99},{"version":"686a8e7fccdc6134d9cda4c086dbdbd47c39e6d61283f799fa59926df1fc9cc3","impliedFormat":99},{"version":"b7406c56308e89d5b252d086c59dd576649a90a6df3d6e902898794fb39068a2","impliedFormat":99},{"version":"085eb3daaaa37b9fc38e714066405e6d07c2daf49dd7c1675e51b35c43183b43","impliedFormat":99},{"version":"c41ebe0a43da393b746ae9ff7e614cca4f2429de76f08f5a1d722f49ad1874d4","impliedFormat":99},{"version":"d9fadd424e1e942f0bd948b93b98daf5f64db718fd51a2e63abea12a6b592179","impliedFormat":99},{"version":"485f3bc3d532f74a54b2a8ef285e4c367cbc6e97a41d76a5f2f3e25ee4c30f9c","impliedFormat":99},{"version":"54e9f026eb79d1b19176166ad9a8e087983fcb5deba42b7bde3f869093382693","impliedFormat":99},{"version":"d91e9adbac77e36164dc1ae518de21c45e6250086669a68768752029fb14f8cb","impliedFormat":99},{"version":"816caf3469d8486812807a1eecf3b2bff4fa654abbbf07a97c4f553819ec5106","impliedFormat":99},{"version":"5474a2ddb1d1509609b4d0b6ca5efc3659001a41b499952e9e80dec94b83a324","impliedFormat":99},{"version":"9cbb71f9d9c5ca7817fafee5714930de62d5bd9e935415733dcb41058ffbd95b","impliedFormat":99},{"version":"3240b3195a4a6f07397873c3d3d781d6bdac6daffef7d0e9404df25696b83821","impliedFormat":99},{"version":"8f15effea4aaabc51743128521875aba6e565e414f6d7d3311b8c2d2578e18a4","impliedFormat":99},{"version":"bd03a8a341fd6c86470267cdb4ffad025d1e31e2930c7b1b99cea0ea8ab1104c","impliedFormat":99},{"version":"dd393055b0154d9a66dc722e51fbfa4e147c86d2d0e8e289516eaabdde558057","impliedFormat":99},{"version":"f0c704f2d6e9a1c1af817d64c475e3060a6b61bdfe839b5d2080ea9305f09887","impliedFormat":99},{"version":"ba4471d25a0c25e54f245fbf35359e420fcd148594041a984ed021ac12c515c9","impliedFormat":99},{"version":"7ecccd7c8eb4c52bccfb5e30db1a681e6df544ffdb2e23c565b0e2765fa0c5bc","impliedFormat":99},{"version":"814ff646ef9d7ec28c867d20acdb6ab2ecc2e7620c4f06c8f5412c83e3518e7e","impliedFormat":99},{"version":"361753ee88631c6d574eceef6db3a2b73424517609fb289b37ee2b2f44762a3c","impliedFormat":99},{"version":"79dcfe755d32c5fb77051770d6b4d2b693dee0989d130e6dff14c7f655f97905","impliedFormat":99},{"version":"5f95099d59b083dee76d572422c8024ef6fd0d6c4dea3aaf4bd722385e113efa","impliedFormat":99},{"version":"e220fb4bed90fbfa989802ceeb8750d121f5c16ccb878959c601a54334a4cdbc","impliedFormat":99},{"version":"f673abb24aaa4a63c541eef767d22e443799ddc5ab30a2269d646682a4946394","impliedFormat":99},{"version":"0c1d42ef8bcac5f74e1113e96712f5fded4971c452911263db62d98f9f51cb82","impliedFormat":99},{"version":"b67ec1a98713742f49348d7ca2368e7ba20f5b6395bc96afdb96e99347321366","impliedFormat":99},{"version":"f0ca722c0c74e4ac885706e69e65291f8947ac5e7fae8df529cf70248bcee262","impliedFormat":99},{"version":"a90c4ed5b632a156a7682988502d5bfefc4048ff4c41d0fa505badc0c3892545","impliedFormat":99},{"version":"376eef489231c1d626a6f24d89c1029d907ad7918c0a7191419ee6be69cf90ab","impliedFormat":99},{"version":"84a68486a1e143e34a165bdc64707e74d33118a1c6adde37591223503d4e8870","impliedFormat":99},{"version":"71d6cca9ebf54d9b498f684827c00002b1cead83eb441356d49d4ce1c9759301","impliedFormat":99},{"version":"9d69a63f8f1291547b0cca886f411ee81409a4c4ed11b30f3ca0d62b2c7d011f","impliedFormat":99},{"version":"e56c9d974fc0576b8dc0828175ae02b2586a71662290ecfb7fce0b674e66ab8a","impliedFormat":99},{"version":"cc0af6c56da3ab10ddac0b3c805d652bf0521be6b04f83afb9baa4df1415b313","impliedFormat":99},{"version":"b7aeb363b1649acac16d5b469685e2a067ff4dc8b0b2125bca941dbb6d63e7c0","impliedFormat":99},{"version":"b59a03bf860b1a674b58e831293ce1e2e24ed82d99740aa72e6a11040da9f01c","impliedFormat":99},{"version":"a677ed4d34f7277672e6900be1a0f6d9a58c918ae8a27049b3371828beb8ca47","impliedFormat":99},{"version":"c700c12ca238ac0353519457fba7f7778435d63774ed7dd92877923d7096dde3","impliedFormat":99},{"version":"0192e23340ffd7728fdb1afe9467bd9ff5b9781a7f4db7e887b35ca3530f97f7","impliedFormat":99},{"version":"bc740847a63f5ec6966b84b463b6cf01a991cc12c44bfe0348ea6a81cd19b35b","impliedFormat":99},{"version":"27a2f50f54467594bb1e868224a8797388708742d44b3145fbbc3320a6c8b094","impliedFormat":99},{"version":"56e8d4cd2453b11cb2c618d1b9bbc38b8bcb70eccf7e27e3623a29928dfb1ca1","impliedFormat":99},{"version":"067917a51b18cbea081c237c1c40797c597e8aea855ed9b6916f5a9550ecc002","impliedFormat":99},{"version":"732a8272b91add5d02f8edf9b11a8b415ad2cda5ccba60117cbbe47e9058a6e8","impliedFormat":99},{"version":"5a72a1a08a5a56f38b2ef6a39dd31c59e0e9ba59c7d480dbdec8cac0c3d2c9c5","impliedFormat":99},{"version":"41dc9805e5387625abb6466f9dad47048aab6cfc4a49885a17a65e662ca6d055","impliedFormat":99},{"version":"aa39ccd035dcf30f31ae0cd380e4d9e265c24e4e0914cd2e7862a392d74314b3","impliedFormat":99},{"version":"fde1d645673ad1273c0a347e97528e7830f4877c1fc58966a4a7ff386977aaac","impliedFormat":99},{"version":"aed8029500a40d0b604a1925f0ad677e9b2319a95afbf38168689c5a771389af","impliedFormat":99},{"version":"41931e7f38f9d140b01f98af2234df54cd48e640012fc7ec781e8d49bef24ba5","impliedFormat":99},{"version":"07703ad6a4d604ff6e9c5174012622f7c50e6fe9bb5887cce185a526809f4dad","impliedFormat":99},{"version":"55a07d10fbddbe53638a77ffa085849a50af65edf8eb670a33d5be8b9ee25fd5","impliedFormat":99},{"version":"5d2bd3f265e2d9f1f7dd2d465e64a0c418d0b0bd5673f6dcf5ab5b0709946ae9","impliedFormat":99},{"version":"b9c289167bc15bfbd04b01165d9ba6794ff9c633d72d7da8b990d359ca8d7e2b","impliedFormat":99},{"version":"10259f5668f1fa9f2a97a74015d9afb5dd15cc8c66f5fe49a399fca55c5f1dad","impliedFormat":99},{"version":"feaeadcfe3c44fbf3dd427110db8adf8cefe45dffde44c5ba6a743e15b39a366","impliedFormat":99},{"version":"6944a8f65e43f69e025dd6c9c9c812d34be4544ea9bc7b7c02a5b7ba2f558d84","impliedFormat":99},{"version":"eb2e01c778bf6a3f486afd2d7dcfaf901026934f05a1f3454711689ca48424d8","impliedFormat":99},{"version":"e26d86344fd4cc53836775c5e0674700d69d5015079e8c98f13cebaa944c9315","impliedFormat":99},{"version":"402aa7b07284961beb87aa330ab30f60b3b9d378640a5a451f20555bec349ee0","impliedFormat":99},{"version":"c9725424318766a173194979413b408a807a0a5714cd69e5e51b520bde2c52b8","impliedFormat":99},{"version":"c57697d3e7e7fbb325ceeee238cb5a8876ed8e471f678d280069e164da4c5c1e","impliedFormat":99},{"version":"9764aef246ae9c1f9a5e4993df2ca338fa2c1431fccb4da88c197782e74e2b5e","impliedFormat":99},{"version":"752de46112146307379db6263890bf0a48c47f87a33335fabf53543e246e60d9","impliedFormat":99},{"version":"d9e55de2e36ed1d789753b2890ead19a590406c934bf15f5c7ea43ce6fa78ac6","impliedFormat":99},{"version":"06b7ca3e1c5036f619676330c1f754b1fcab751bbf42edce96bf1819cb6986b4","impliedFormat":99},{"version":"06829e5eed0e849a8252349f72b39b0a64ab0d74e07512c567c2ac7c3fe24bff","impliedFormat":99},{"version":"2ea629a5a83f71f726649dcf0a159a11ae1f552ad7b443b2a0b8fa3340246be2","impliedFormat":99},{"version":"f7eb2e49492915c67a813d1789fed2855319e7e13dd2d55e6efb7aae421abeb9","impliedFormat":99},{"version":"0f2039589483249286cd2e42e8c75e5ecb0bd9ee85ca8e895a157ee3238df634","impliedFormat":99},{"version":"29d02be45ca6a4a3e5ff116d005bc3c8b0349cc855ab0451cebff02858c5dc2a","impliedFormat":99},{"version":"ee1a2bbd2002638a9625fd7fba1ab1e183559bfb68146f571ed7e4f4cf72d009","impliedFormat":99},{"version":"6ec96e6005ceaa870aedd4a2f0ad6e1a9e96982ac3b50de05bf3495abf0a8869","impliedFormat":99},{"version":"c7741d898b0bbb21e03d0b8b12bf5baffe664c862b4d4425c998cc6b7a990705","impliedFormat":99},{"version":"de15f01052140852a9f9d141338c464af482c450db75a081ac78a8fb632609b6","impliedFormat":99},{"version":"c28401f7e250fd756718138e83679c06f35f105e48992e65eb0ae86e191637cb","impliedFormat":99},{"version":"f8019962e492f57c915e7715175929fd357d97e4c01568de0c1babecccee6113","impliedFormat":99},{"version":"dc0843ab204253271a7a4c2f9257a82fa9cb453060f7b60c1b788bfde473d0e0","impliedFormat":99},{"version":"6c3393492c9dd87bdc15e1be2b2120bb163f0cc4be2930f86054efec8b6d3fd3","impliedFormat":99},{"version":"54dfbe8c796abd6d65e478bd791ea7b84085bdd23ead6dd0991ebeb824e6b806","impliedFormat":99},{"version":"9eaac18db6d588dd1202bbac766dab1d7561f33253fbac9b5d503787d9ea451d","impliedFormat":99},{"version":"fbf4f337d8cee2619f24317ad5abfc2015b8006fbef668d7fac5e919033be975","impliedFormat":99},{"version":"86ebb0cdb36cc752597ae8d300148180d8eec489f6025ea5911fa2cbecece081","impliedFormat":99},{"version":"727a4bf89e28dc475c5f9316eece04b14a4b6b9ab277834364239e2f1d2cd9f7","impliedFormat":99},{"version":"4f77f53ffc88fc4afd8f89559f6ebc7c78eb96c3cb6d321b37f398a7a7c911be","impliedFormat":99},{"version":"2fb26f7701fbd742c355cc65f5bdd11a1700d0c34c72b9dc16550016a2fcc3a5","impliedFormat":99},{"version":"aa59534cf8e215f3ed236dafec9353ebd11037bb5b908837825b098f7d364a1c","impliedFormat":99},{"version":"394d1bd06ac39d580db73938e084b22a832381cbcec002715a7119a4b8d2a692","impliedFormat":99},{"version":"a2d8025ac4f51cb494dba9d65b3be176b3eb297bd174cbcb856a2a76eb0df874","impliedFormat":99},{"version":"4cc3862ec78e9b7783f567742f47dd6d6838e646708a512a11b8d27aa9c74130","impliedFormat":99},{"version":"010ba8a40f13ea3f55af47072d1937a6daedbffccc5c507b8cfb33ed45f1e815","impliedFormat":99},{"version":"116c79190f08958c32c45a4f72fdcdf58df72416b32b1d54d6947b13c850201c","impliedFormat":99},{"version":"08ded000262ff0a2ad5d3ef95a0dd90e9505e08bea7ee8e18dc8fccba1bce55a","impliedFormat":99},{"version":"c3e2dbf9a763326f9e03744ead8e07cbd118d52b40813100aa2b716f158606e4","impliedFormat":99},{"version":"51dacfdf9476eca7002cb3a75089dd4fed37c0027abbf3380214119a9aa62fe4","impliedFormat":99},{"version":"050a0677931689dcaa7cd72dec5144256a8e8662e07c313479e7b09471dd8d7a","impliedFormat":99},{"version":"b19c40d229c131754b22173023b333ac2fbaa9317b0a8348ea97dbc7ddf5da75","impliedFormat":99},{"version":"5681612b1dc37cf330b971d4f1f77fc48cbadc18c654f34e1a0416a99fa2c709","impliedFormat":99},{"version":"903c5c6df619e2b85d3bbc7dd881ce90b415b90b7bd4674d025606f1c962f54a","impliedFormat":99},{"version":"46603c02eb1cb18f3be9886a8c04f3162c5e4c1fb7912f04caf80c2109e1e89f","impliedFormat":99},{"version":"bd677fa2528eea20a8b71aaa62f64cf2610c2b3541239da69b41a92c44813111","impliedFormat":99},{"version":"25247edf0256bf357d25178d3e46d90e5199684e4fc7837886d40aba90022b64","impliedFormat":99},{"version":"3106b775494342e60566941c9dd32bcd3380179bf525edf6626da1ddcbcd3632","impliedFormat":99},{"version":"74d3d469b1cecb5dafd09afafaf2829b05bd3a219bc88f19458d3768b07a7e2b","impliedFormat":99},{"version":"e3b15eeed6240702c063be50ce8e933856ae72c1814ae4d36c62f97f288054ee","impliedFormat":99},{"version":"8fa64844cb79114ad676e59db56a5e903c5c43b84ede7e8af3622ab6014f8fe8","impliedFormat":99},{"version":"bc91699dd47e0414a62fbd5df0362f0868bbdc360b189085ca65f271123186c7","impliedFormat":99},{"version":"7283ac5c7df6620f505cf6a64d92b0fb3a6eceac0764c6b3550969b98519a705","impliedFormat":99},{"version":"fdbc4014159458cfcd72a8c3e221e6e21cc44bdc5f670e667acb7ce56bfb8da9","impliedFormat":99},{"version":"941a69d94e5e072ecce094c833ab59434256271361509f4960af1f009aa430b7","impliedFormat":99},{"version":"fc5145b9186234bd41a03b93cb9b956752453056f56e1c36f163f85a5717ae6b","impliedFormat":99},{"version":"2c85bc627145116f3df21f3ed407cc99f5655ad2fcc427bbf57e3b3a0341ea47","impliedFormat":99},{"version":"420739326941762fdf50e14dee4b21a291c06b30cbc58430665ffee9bcbb4b6d","impliedFormat":99},{"version":"90a0a34f6792df8718d8c8d6ed77cf7051d9965a85c0d12cce38f61d706691c0","impliedFormat":99},{"version":"d9cfc4635923eb5c22406f97afdaa0272115af9cfe0fa3f33cd96fa5589187e6","impliedFormat":99},{"version":"a1ade9e632507960b944757f14f836872e567c1e23927eda1c1bcd6b49dce932","impliedFormat":99},{"version":"1fc7bc7871ce771290e11568dcde444ad70fcf8533c1d4fc4ac3a96a4b9ee69e","impliedFormat":99},{"version":"d7cbf83a92ab17f946f155886d55fd14b2e3426ba21fdc6430858ff03735eddb","impliedFormat":99},{"version":"3312143e8158416f98f28b3fedb5bde6c25bc73e46a95451680159eb88868d58","impliedFormat":99},{"version":"3a50148ffaa42c4e23e88522b47c4defd902657ee9eec365979f70625b2e43ac","impliedFormat":99},{"version":"82ab37de5dad558cf74f37a6a033f189480181f8ddf2ea096a60ac28925e1869","impliedFormat":99},{"version":"be055428284687d327cab5cd348976b8ddc588c0ce7de4355437c569ee17556d","impliedFormat":99},{"version":"69f233a54425829456296ec42ab6e23c9a473570d8b084ad52f2421d70ed17e8","impliedFormat":99},{"version":"61f7544cc8d1fad9fa7936304584ce314d3918a31f43d7738f187b9cd1799283","impliedFormat":99},{"version":"0fe6c53bfea404986540d104103db46224830f6912963c90d20f4c195c7000aa","impliedFormat":99},{"version":"bbaa79ab6b210412f9c5befa186d257c181557b819b765f81349c2c593663084","impliedFormat":99},{"version":"e1f6de16c583124f18d59c672f96272fa1662a05f834075c7ca899c1095ab29e","impliedFormat":99},{"version":"66c5847742803134b02bf07c53997c8dab3e4bb4ff428ef861a2450bf7744f61","impliedFormat":99},{"version":"3e80ac50e17c60be70575505005c9c28fd69150273ced8d50d73eed68cfdbf16","impliedFormat":99},{"version":"67022bb9c3b2174baf06917f426d832e447b2e6865be713b9fc18082ea437a51","impliedFormat":99},{"version":"1f3a97a978eaaf934f1f92682bf05bcfc11b8b4a00821d6e4d8c7d6bcff0fc79","impliedFormat":99},{"version":"a771f93d971c945eacad088d558d2015aca8ac0bc533ada8e317f3883f105f32","impliedFormat":99},{"version":"d5d9ba4cdb84bb2cb3207bb01e4ba70ac6ba3432cf6963b028c06388b0cd8656","impliedFormat":99},{"version":"cdb6410d699f7e0833b9e30c344c541c7ee94abe6959a4b714eb98dcda4bfa29","impliedFormat":99},{"version":"9fc6a5e9bb59cf074c5f26e636291aca55429165b98a5ecff9aa4830518f6588","impliedFormat":99},{"version":"1d96a4321e615ed3f7f49351803f592bbabed2edbef1bda6b3ca000b2d684964","impliedFormat":99},{"version":"1067134f9a5c26d079705b4c39112060809b57e481dc6ff954709eeddffe7b46","impliedFormat":99},{"version":"a67a88f62e9948f5cbe6dfc3be4ddb620308f230604e790b5c36a8892b0a5f41","impliedFormat":99},{"version":"0e6ef2d24419cca5b5f020f5f926c24a8a50fb77062feb87f0d759b4455c31b3","impliedFormat":99},{"version":"5b67e62aa4c0817a18ed22992e3a328f2b6402bd2ee4f9ae2dd66a3c3486529a","impliedFormat":99},{"version":"07d6c4bd82310842450b13c63ed0df3ef083ba72a714da9034b815aba390964a","impliedFormat":99},{"version":"74d927443bacd8d7d92a6a377a728e74b1a3ced3c5d96bc04634abb234ed3a8e","impliedFormat":99},{"version":"94c3242169324a0b2212dc12395d17aab5a96b23267f03e0e4142e2cc134c7ec","impliedFormat":99},{"version":"809497b80815e115f27c9b890800931546635a66248b0872332ed47271b6b5a1","impliedFormat":99},{"version":"066f08fd6c8dfe113a509eeb436cdd387747ba544522118c4b6ab6de03e9bfdb","impliedFormat":99},{"version":"abbffa103d638428f06bb6c7bd66b4df1a263846a109881fd9cd6f9402eef25a","impliedFormat":99},{"version":"b85c0b46394017e55622fa7006777655604ebbc87a3b8d1cacf91fb643626f42","impliedFormat":99},{"version":"50596833b2659cbe98f138d233ab3da041734f73a82e96873ccb5056a94f3389","impliedFormat":99},{"version":"75dd74b7c8bde65a3fe491d088b671b75c60ea6a5795c651d8f929dec7bfd0d8","impliedFormat":99},{"version":"7c0a712adc8b64053a0cabf69da09e852f2c64c6a69a662a8648e76de10fdebb","impliedFormat":99},{"version":"7a4369be79b072e7aaa9db48893ab0ef903713cadab764b876b0322ccb213986","impliedFormat":99},{"version":"cbbf88f53c2d00ec848ea9781ff435afbd6776f9dae08ba685e6f64a33711984","impliedFormat":99},{"version":"678d5374d492b91f6d50e6b2f1d4316a131dd6369a1db694e6dcb3569e2aa280","impliedFormat":99},{"version":"3adb720c0fb748257083b6e533d094cb87e7ea330b5d5808588366a181e3432b","impliedFormat":99},{"version":"c9b878138e7dc0f9147ab1ed01cf08533635e50b44d4dbc30345b83ba1237a73","impliedFormat":99},{"version":"da116c018987e5391a646bf242f63305c1afed4dbdc477783f56aca76ed108b7","impliedFormat":99},{"version":"5e96285ab528ff0ddf3393a5d04d8c68b3e881e1fe7ae0fee92966a98112d327","impliedFormat":99},{"version":"8615e46872d20ffe0a8ff44b9ce593f64f79a8d309ac4859e8b59906f9aa8762","impliedFormat":99},{"version":"59d97bc6e943ee2771965639aa795a7ae38b4be58fa26b392720d982786e25a6","impliedFormat":99},{"version":"57ecafef6c1584972a47dc439ddbf5d4cf7ca8891c38847a50562b288c806bb9","impliedFormat":99},{"version":"25a333b9b2020a43a5c4a75c277741c7ede6c01461105b5d0768aaa461de6938","impliedFormat":99},{"version":"964c9bbcfc4a0ca4bc58e1e68341497d8f9bd8ae85c92b33c8b9ab2f0b561775","impliedFormat":99},{"version":"7a32ba7e3b2a4b4e2c71ff2e054c39b73b1e75f1bce260488c2a375797a12e3f","impliedFormat":99},{"version":"7eb276f1e044aeac0873eebcfa0b526bae347809cfa5894dfaf565bb8c2da530","impliedFormat":99},{"version":"1432cbf6c940718ca09b6b458243a9b9cb26bc21c4fed5bbfa199aedf7494e9b","impliedFormat":99},{"version":"9e2ec128354b9c4d3791a82f8ec753739c1716eb73f6ad9d4d6626e733dc7280","impliedFormat":99},{"version":"ab5dcdc2177280000506e0fb519c5fe5c886c9b19c4736886e697d3fb9d59f40","impliedFormat":99},{"version":"0ff58c9fd971479765373fe7f9a5050aea113369701300402698e1b046eda2ab","impliedFormat":99},{"version":"8f5dfad393e0abcdeec04e6a2537e2b385933e7492ced75b2f856b6e36e9e2c2","impliedFormat":99},{"version":"03c25c1f785b19bd04f05c2a65aa3f05eb4bbfe1e51dbf9b9dea54cbf951aa11","impliedFormat":99},{"version":"aa6c68ae030bc57e2cf901448a1ab94f340bab7dfe544b45f8469ecc8fb11e54","impliedFormat":99},{"version":"a5b30514ffe27bad364000d64fe92e9ea518dace05333e2dafc396c9c96058a7","impliedFormat":99},{"version":"f6c181d754f301199d23bd69d50733b29864682b7b5f714edab4841e50b0fd3c","impliedFormat":99},{"version":"d3774ffc91b1ea70a5c2d23487c23dc19cef4b28f41485d21b65498f41d8f9fe","impliedFormat":99},{"version":"ad2763c49963087aaf8a8201ddc9033beed1f6bb3a7b452f9f1514ccb07472c4","signature":"5090530eb8d97f97cfd5f6398bb2d43fea5012296ef585170df7cdf8512f8493"},{"version":"3aeeceff12a7cd32712710fd408d4430eb76e51d544fd727f5f20679a599e9f7","signature":"e92f46aaca3e689acaf3a9805403b1d67fb2c0310000eb5f57efe7a206c713cf"},{"version":"cb9513a65cf977946a89a3cd86c81edd96d3763ed5380f2adf548eec557a4be6","signature":"62fb16ae6458343a2a17134b73a02dc67661dad08df3cca4236bec43dc50778d"},{"version":"679aae45e5d25c52930481492ba734c8d9f8365afa387eb32eed802bbb6390a3","signature":"7e274c66c252be79fb9ed9b80c637b227720761a2101d7ad7669e4d2da2aac4b"},{"version":"95757567c3eae684463764b755bf63f8b06c4c4fe431a3572f53bcee6a478e2e","signature":"e0bbb2d0a6349aad3f5325677bfea8aa309227286adcb9e87ba5111519ad2a4d"},{"version":"ce5f56d6bff967d7e1ea50da3040befeec3cdc7bc4987b78477bad21949b565a","signature":"a646c8dc342691ab6d2e39b0456237ab23658c47d6018f11ad2d6ebc0de3fcc5"},{"version":"cc5a72fa52efeb8250acddb23082df9c9964c92245e5bae3e40d9413fe67d594","signature":"16673b87a673f233605dee2a50db52c6818dbf85723eaab65737c47586c454d2"},{"version":"54495480ae5dde36bef1a11d1e3bd30ea5f12371265ebe6602b873574b747949","impliedFormat":99},{"version":"b00c9417e14c16bab467bf36adc1fa1bf559a2380d981be15dc03cf775ac1338","impliedFormat":99},{"version":"0eb38ef97f42012ee06ccde92cc366dc957214a6f13260a02bb058069b3bd918","signature":"dd991c771650ac815b6620828040056e608122c87e4547c303f1034152d2a267"},{"version":"8e2f1ff84912df23045bed6be053b0cd66a4e888e35a52e5462c031099188303","signature":"132b198468e76399b2ece12a0e98aa8c22317602d3686065676e61e6f816122d"},{"version":"b2a5c7ed8112d3f441be388d4506dec86ad22bcd4e99ef9041d323b0c8ded3b0","signature":"d4a4a27dc0bba7fa14e0ace2c01beae9c27bf1272c90fb793365792ae1bce806"},{"version":"631af761180cd9e0b57342aaeb7f51ac81069c42fbb1057cd11cb0359cb8399f","signature":"0ee60d7775f4f4b81dba16e0c655d3299cf3203983beb0d8100af284c173ef98"},{"version":"17c6bceaf89a7808c63a6314557fe16b5be83ab8038e55d8db3a434b151a6f9a","signature":"beb312fe57b0535b7db8d466a1b8218ee1413918db95c58c32d2db1db7d7ed90"},{"version":"8825b6b7db155ecd14da55e446ef07b5ae51c23fa68622b445029770fb4497aa","signature":"9a109f54567851a3444f9a4cbbbb62852d9d739cb634015a9c885ace34f52ee5"},{"version":"e08bedafb6e58855f22eefc04e67ec625a67f49502fa43ad9b17f20e9bab2849","signature":"1cf361776919b62ae14c529e810ce9db75852f82a071ed16e55e12fc5eff64f3"},{"version":"42680aac00cb11d3ee4e8b1a8d8323ee42ddd49538ea58f8ed9b3058bc4a6c0c","signature":"f0552fb4a3d0ca7e1e6614ac405acf43f48d16509ae31536ce5d648d0a84a500"},{"version":"fcecf7d4f11e26a5c98fb10cba848623d6b464923148448dd6dffa46c5b81a8e","signature":"e4136232914cd6dbf142da504178a7cc82d2c02a7eab88aad8f0c1304a1b2ee0"},{"version":"86ca2659445316b84d17fe9816680439eeb99c4eea34297c54e6160984ad432d","signature":"9ddbc742122ead28bf20558e5521be3abbd11ea5db5ddfb6069ff4a73ea4abd8"},{"version":"14dea0fe4e028c70c6953836fac906646772b58e1e449430713699ab7287a552","signature":"1fb2c41e5d2595cd6d1a8b4d90a31ed91f8ab6a58f629545a6311812fb7e13c5"},{"version":"45664206e1336e3cc277478e6a602f984bb95dd7a43b7e90372c0e852440b453","signature":"1fb2c41e5d2595cd6d1a8b4d90a31ed91f8ab6a58f629545a6311812fb7e13c5"},{"version":"665d0201791fabff9968966557e699e8e7252ea96dbdd8fc3a18c65993939026","signature":"d4979ab62166ee0ba223bb33865b11779d6580f81af5b83ec3af05e11bfa9153"},{"version":"f044ce33f6ec952e69a0a1c0968109e18b3f6cb9e14b1bcee9dd18ad15d02a52","signature":"fab46f81c25c96bf557c46d1c5eb7ff030b6d75db69061b8a08ca111e165e69a"},{"version":"942ed24cced033028b208654b7383b951341d3219d77d89742f38a96890c6ead","signature":"7e331b20786c105d557a28d787b73feff36caafe86eede29ce76552b86f07d56"},{"version":"ea947066afec2242017a535e7637491240f2618d6c9ea934e0585627a1d137d2","signature":"fab46f81c25c96bf557c46d1c5eb7ff030b6d75db69061b8a08ca111e165e69a"},{"version":"abc6bdd956558f9d288ad12e09186d227b3daf259088885ab3ce720b4d1b2d75","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"29a7f5cc3b6877b83b8eab680cee12d38aedab3eace2e1958e9364c8cecabde6","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"4cb5242c21fa3fd85dcc7a5543b524144f32cfe77502b184844b7cced5605425","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"3750bfecb24a7c32b5e08d9395f04178d38df6d9b6b16179c239d63493285621","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"dbac363ba86444493b659c2812002f87331265ebd9a9fb11939b854657f2f103","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"09691065fbea0e79c90c89c90e80da674a7a5533df56ae38e67f097e208c15aa","signature":"86c04c35d0f00e20bb7c3354a5510a5460c48b547f8b278c00fdfbfce326c3c2"},{"version":"bbfeab549e13ab39a9d8eedc74f4789b3984dc28611e5abfdedb9fa0e6be7934","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"4dede768416452e7e04068ea8d71580a67c6dfec3b7ff086414b8675deb2c064","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c949718e7fd2f0dc6f295e104bb2bea704ab25422e80d67f5aa084e237533225","signature":"b03c6625add8e4f0247904cbf92ea9409ddd5a1246192e8d8093791c4b5140ec"},{"version":"afa4ea8fa730d96d65438d81fcf3e676508a23af50aa46e2662269119472aa8c","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"ced3c1c3acf41cde6acee128d23238b74b7fb7818ea1ca5a3165ea79a0d22691","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"d9302c1fd89fac7e1a49e66564d1ee1243999372e15b0fe5ba1d0871b53dc7c2","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"aa04259cef694de6b7d0d2e81c0d438177273ee65e7b09467b5d89f5b8a39f9d","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"ce3fc7a8b68a8b318e7a63a4ff59350baf3f8033f024c02b5b9af4b089e9b1b0","signature":"8e0a6785300064d2eb4c86a054a89710ae6025e4798d145a45aa99e2434ea93b"},{"version":"48aef202edb1d9730a41d5b477dd04a384d0dd88c6dacc587819480e7df039d1","signature":"74f8b1d0ba6b1baf1a0b49d707543b60f032b1e7acd67b39ff80f3dd27dc9593"},{"version":"663266b8782a8b327a5196efa1b3627805e3e4fc712d6a4380f5e6571e45a813","impliedFormat":1},{"version":"5aa42b32993e161aaf93d992300494377d38c8883e15fde44d5c7949313058af","impliedFormat":1},{"version":"b75dd83280bdfd4880c04cadd7f5edf6b23305850e436b1e5b92c3847090d031","impliedFormat":1},{"version":"eae784573a5c4c55c65b86accb356b21b5f597c3484c1bd344e647bc92ebe572","impliedFormat":1},{"version":"827eb54656695635a6e25543f711f0fe86d1083e5e1c0e84f394ffc122bd3ad7","impliedFormat":1},{"version":"2309cee540edc190aa607149b673b437cb8807f4e8d921bf7f5a50e6aa8d609c","impliedFormat":1},{"version":"901de16fbacf42f8cbe7fb2e3dc7d33cd91548a54459438fdface0b30a6a29cd","impliedFormat":1},{"version":"c4a8a08d13b2aba4fb5e798f7d2d5691192d4383cf7c0686845d80a167fc5f42","impliedFormat":1},{"version":"243248596db650ce6f8907cbb3a8076a5ab6888a39c37debc11a81c2f9f9d247","impliedFormat":1},{"version":"1460f16c4b7fc66d2dde3ce1a4ab97d480c27fb84a4e429355a21e76cd471e19","impliedFormat":1},{"version":"c5d73bf762b7b0e75fcdf691e21e31c9db9913931b200b9990f07f49ab2edff3","impliedFormat":1},{"version":"de38157a9f1be75a02ea8358be48a4d50ba31785fedd6a4f9ce7387d77ac9a22","impliedFormat":1},{"version":"76a5f88a99d386a1ea9209a9f8f33a3f2c2f17bc445a4078950a49c0624bae3d","impliedFormat":1},{"version":"65357b3849688962f59c625718650ad31ff59e6c23f244b4086f0d96558405d6","impliedFormat":1},{"version":"3f2fed2d0130ee5356cc1cb8782d7c974d37eccce4f1de871f7744ce61463eb4","impliedFormat":1},{"version":"471486ab7c5c95c3df63c0fbebe6871b9535eedff8b582557dfd66fcbf946d5b","impliedFormat":1},{"version":"45e82f28a80d855bab2355d5e46cc8edd7f2679fc5bfb0905dcf01ce59a5c347","impliedFormat":1},{"version":"48f7cd72c6f8ec5b2f70f50a8d4e6f47494e0d228015efb50c36fc6eab33c7ff","impliedFormat":1},{"version":"a8aa7a344599265ef9c2aba0433a805227b2c9b0e743106fab4d6f0c6966f536","impliedFormat":1},{"version":"806bed2ed4bf1c6ebb74a391531e98d361a0e23a31601fddb33dd90e31436b6d","impliedFormat":1},{"version":"9b92a4d989efc3eeefdca5f95f10267504abc7748ecff400b533cdf54dcdbd68","impliedFormat":1},{"version":"16e6feb2ea29757a0cdd16c8fe2bdf059a612a5474ea30019ae60d9fe309442a","impliedFormat":1},{"version":"2f45dc6e152333f5d28bb660e4543bfd41412b5af16b9a6331b7fd0b4982885e","impliedFormat":1},{"version":"ea4eadfe3d8b0447ecea1cbbf7aad70423cca9350bc9103a1d80cebc37e6bdb3","impliedFormat":1},{"version":"b88645280562793af76ab59052d87e4846ac5ef19af054c729fbb87c73481a59","impliedFormat":1},{"version":"a1f43b06dd37b1f6c5c7821881960dfe55038b468eafb324ad90ce5e9b448d2a","impliedFormat":1},{"version":"15b142d522e96e1962bd54c75560f6994cc8fe9a1640a36de2268fdb95e58fb5","impliedFormat":1},{"version":"de79263f32ea34b3f9282b19251626eeb3a3aef8d96491b731a3c0fb5cca2e77","impliedFormat":1},{"version":"332680a9475bd631519399f9796c59502aa499aa6f6771734eec82fa40c6d654","impliedFormat":1},{"version":"191bee6605de2b5210f29f22df04f5b5e6bdcc1f6e21fb07091d40eeeb75fd72","impliedFormat":1},{"version":"d83f3c0362467589b3a65d3a83088c068099c665a39061bf9b477f16708fa0f9","impliedFormat":1},{"version":"180e527dbc1f5ae2bbb79d0a3db1ada49258783d7e6299559e0f2ed663b4afec","impliedFormat":1},{"version":"29994a97447d10d003957bcc0c9355c272d8cf0f97143eb1ade331676e860945","impliedFormat":1},{"version":"f4260022f7af38e533d364ea62eb7ae01b0a32050033d7f6772073e1dc908025","impliedFormat":1},{"version":"9cddf06f2bc6753a8628670a737754b5c7e93e2cfe982a300a0b43cf98a7d032","impliedFormat":1},{"version":"3f8e68bd94e82fe4362553aa03030fcf94c381716ce3599d242535b0d9953e49","impliedFormat":1},{"version":"63e628515ec7017458620e1624c594c9bd76382f606890c8eebf2532bcab3b7c","impliedFormat":1},{"version":"355d5e2ba58012bc059e347a70aa8b72d18d82f0c3491e9660adaf852648f032","impliedFormat":1},{"version":"311cc121259b3e0c3c08304fc25b525aa02ba0f9bf55b3e7c60b0dbb7422014e","impliedFormat":1},{"version":"74c269b43d39e5ece20b2cca49c14e64c05b01e46407200d7558301d0fcaabf4","impliedFormat":1},{"version":"ec09bd95866efe38cd00ebb79dfa7a26563d600fa4a30db0f7c6d68f8f6d2b06","impliedFormat":1},{"version":"482d0ac70d56aa79941be30da6df28e926a007f835eed70cf7b5f3135368d1f6","impliedFormat":1},{"version":"7dd19397d5a090c9f8cd762bae67bd0ad6f782abe422594fb71168fb578673b0","impliedFormat":1},{"version":"84cbf6204ada0ee2f80493e55e45befa079954788718efd6dcc103183104e3c0","impliedFormat":1},{"version":"ed849d616865076f44a41c87f27698f7cdf230290c44bafc71d7c2bc6919b202","impliedFormat":1},{"version":"9a0a0af04065ddfecc29d2b090659fce57f46f64c7a04a9ba63835ef2b2d0efa","impliedFormat":1},{"version":"10297d22a9209a718b9883a384db19249b206a0897e95f2b9afeed3144601cb0","impliedFormat":1},{"version":"034b8b5912823744c986986f24432bf3fa7bfa671e69316b672f3f2db5166ce4","impliedFormat":1},{"version":"34d206f6ba993e601dade2791944bdf742ab0f7a8caccc661106c87438f4f904","impliedFormat":1},{"version":"05ca49cc7ba9111f6c816ecfadb9305fffeb579840961ee8286cc89749f06ebd","impliedFormat":1},{"version":"14bad5bea17b4e0f2495b5dac89a936e139338e2c87716bffd3c281ae7a9fec6","impliedFormat":1},{"version":"b8a122e51c2ee902b44d86ff806011d216af54be75844a4d3c366d80776a4d33","impliedFormat":1},{"version":"0850c98ca2cccae6ce2aad363f6eb370c401fbc279a64607fff90c0f87973a91","impliedFormat":1},{"version":"d0f62192ec787f1592a5b86760a44350d1c925883a573eadc12d60862890dffe","impliedFormat":1},{"version":"4ef34562ac49a16a1681d51d6e8ece677657782cf1a464e010224cbbe0bb071f","impliedFormat":1},{"version":"a66ad696f2785dd00374b8dee6fab5c58c049c0efe24b3c214fbe6aec3f53d6e","impliedFormat":1},{"version":"f226f29f5594bd479f27648f42423ffa1a1460cafc7b1ba04bd013b28cba710f","impliedFormat":1},{"version":"63f859a315e9711f383d06b7a2b940804e51078d85e896980816f46f1b6021a8","impliedFormat":1},{"version":"f8da2a3bec435c09f9a10d9f150949bf0ebb0c3508f074887dbb2d3e33ce302b","impliedFormat":1},{"version":"397b46c6a95826d26714b5481addc606de72d8229b092e236f0d78a9e7226d29","impliedFormat":1},{"version":"5f47fb5b000c03fdcae71e6e017261898a37f0892532cb713ce95c8950462d80","impliedFormat":1},{"version":"8142d5eaa44b4dbb68dbe87b5f05b148c5a74a6fa7abd3cb3aa80a7ed4a05150","impliedFormat":1},{"version":"6c66369276512eac5b53eaca735d7472b5ffca417977c3976a66b84059f2af2b","impliedFormat":1},{"version":"225deff02f4d1c91e2d6c71dec9f18feae510aa729a9774024f30278f4c6b8fe","impliedFormat":1},{"version":"6c24f6dcbb3bf8235bf8da995a7290ffbd9d557a760cf2deb380ce91a989b765","impliedFormat":1},{"version":"e48415a5a97a5e6c22cc4fdcb3172805ce68a1d41d0a056d71bff9ced2186d43","impliedFormat":1},{"version":"adec507ee458a691b72254991a7903a10c052019d8cdc7ffe359d9f373e7401f","impliedFormat":1},{"version":"9b74326515d17f03809cfbea6de789772ff7d0c759a08a59bfa5242bda98d35b","impliedFormat":1},{"version":"09788d0d992a6d2471f35019ab68b39105c44ebf17f2051cf3e228a39e91885a","impliedFormat":1},{"version":"0ea47413eaffe144782a44058205c31130b382dee0e2f66b62b5188eac57039e","impliedFormat":1},{"version":"c0591738dbfe11a36959f16ab40bc98b2a430c4565770ef6257574546079d791","impliedFormat":1},{"version":"3cf3dc0f53d71795cd7c461346e9aa3c713f8a5138015776aa6d4b8ff9e0cb26","impliedFormat":1},{"version":"ca73451ec7771379b6b1271dcda0d0b2146da80b329136a09ad692529a073965","impliedFormat":1},{"version":"fad74233657c4e0346822942ac3716a20b16fb053ca00c1260a08a81cc76df89","impliedFormat":1},{"version":"43f0a7dead8b25e1c101a060ea31d6df548a9303c58aa7498d0285fd4ecaac1c","impliedFormat":1},{"version":"fced7c59acecb0ac631505fcbc5a1ce0c6420e2494a256321e9359093efb7a1f","impliedFormat":1},{"version":"8c42fbcae55a41f9c48f644ff9743fab827a9d38f5a6bd486f17c6460f8a099b","impliedFormat":1},{"version":"793c2b5a225ca7569320b2f9f3a43cc20a08e83fbd6587f5c24c7a05feaee6d0","impliedFormat":1},{"version":"cf841c4bfb05b4b1d3826773ff77a47bb0dc17c665a4dbff7d6c4a6d9042d50c","impliedFormat":1},{"version":"597b9bd9363840016d7e8c6839cccd22f85079484bae7e444e80cf24645529af","impliedFormat":1},{"version":"bd15222c3f016a97d7062a0018f7fe0d130be508ca276b43dcafa8c9032a3ea4","impliedFormat":1},{"version":"4f5f11b73282262904f4c1bc5ffb76631b40ac8b54ae01bde274cb9242d6cb2f","impliedFormat":1},{"version":"9e6dcb736749cc84304b38c5a1101b299659dbc3871bab5d1544ee8f8dc73e5b","impliedFormat":1},{"version":"3f8f36996bff2e0d4f6bb2b11e1a684489b511032473180f44d0b23f38a53800","impliedFormat":1},{"version":"4e4559e8e4ea7d87f914014074559e515de78308bacc733a7ea76f795de178a3","impliedFormat":1},{"version":"13ecb31795209aa56b1837b9d46cc5494da392f594132bc5b3a56c067e12ea1c","impliedFormat":1},{"version":"e34a28e978cf430e062c91d03987f2b42360b33e6207738b40494acd4a97004b","impliedFormat":1},{"version":"5cc10d0295e594c961bd020cc76845097928f550fa3d58468114e5225054f76c","impliedFormat":1},{"version":"99c4cd704c85c3b9a215977d1d10ad34f1c6bbc5784e0ddaaf6fe8090030eaf3","impliedFormat":1},{"version":"7dc695c4ab01309d1d1b43201700560054feadddf8d0bbfc79d981bff03c1db0","impliedFormat":1},{"version":"ab0db8d8a821582e3f49739e5267466d964b64f4aeea5ba379ac7759c7adc531","impliedFormat":1},{"version":"f6e9e0411de308207892802c52be06bf25df281ace623cbf7870583e28b3f12b","impliedFormat":1},{"version":"307067699cff7c3c8a77d9e69aef5291f0141cfbbbeb0954804589e6701238cc","impliedFormat":1},{"version":"11741962da8818dfe175a7e01a483149d085b569dc5e021c83a94203d686996a","impliedFormat":1},{"version":"e58ec6f129b33de21aa444c87a6e538effe82b5f2a7d07c101fc258e2e66f73d","impliedFormat":1},{"version":"e3e78772154f790f8b0a6eaeaba5b4c816567d9d30f9c8655ed29cb9438e5455","impliedFormat":1},{"version":"e17369650fdfac36437e8559b86b2d6172d090594696976082903ba856a2a979","impliedFormat":1},{"version":"69cab7f70e702f3a517d6e47428b4d2d76b56bc355e6f85e305d1b6f6d700f7b","impliedFormat":1},{"version":"8a95a499afe7cd2aa6161b68aa3f7599e9ae7d12697171384f540e268d846746","impliedFormat":1},{"version":"2967840927e96b345f7b8250ad35e7436aae73c77d9767a2b43f2606ab107cf3","impliedFormat":1},{"version":"0e6387b87925a10ba52cd0de685a4f7e2d9dd402dbac560dce8934e8e34007d0","impliedFormat":1},{"version":"77515d8e0ceb4f4bae7d0c9aafe9fd764a5f25601569ecbac3240cacfe136f14","impliedFormat":1},{"version":"b07d72a408bfcf125c24cfba3db38207687711b800b98ab417e5ada59438c554","impliedFormat":1},{"version":"ef5aa9871f3b8dac96d4ef93e22eec539527d739c6a7e0c7fa7101fa343bfd77","impliedFormat":1},{"version":"47507ff33fbe83627bdf11136400594a249e8012508425bb2846b7268f966f00","impliedFormat":1},{"version":"4a1a0f21b3c4fc0d217392d82445a34fcc8c9ed6f79fdc4d14b8353e3c74eaf3","impliedFormat":1},{"version":"e041d566f765b48ddf66ffd085fb120951cf28e92d129751351e72f8c96d99fa","impliedFormat":1},{"version":"5a59c1315ed5ca8f899fc6527f23a15dc9a38107175a5fffd473db25bcd1fd4a","impliedFormat":1},{"version":"20a5515b81a828fc10b066aa5f88a5eb68323d23b8a10d8e9dc7edb6ebdd2bd7","impliedFormat":1},{"version":"f2c24a1e4bc555e203dab5b749b718b1cdf73ecf57d8a8872ff163cbc03b1a68","impliedFormat":1},{"version":"0dcea4e3a40e7408ec9a6aeacb721ce8289fc99d5f2be600146a472d6d1590b8","impliedFormat":1},{"version":"2093f341c5cba3058c29f9344e59ecfa22dc6559c7eb9f00497a108e09301a55","impliedFormat":1},{"version":"15aba6a4199ce9e4f3c1ec397a468f6aaaeba973649ca4f1c016225b46a5feaf","impliedFormat":1},{"version":"a1ca7f7788853a2ff3670bf1112a92fa503686b10d58339318fec5862bd209a6","impliedFormat":1},{"version":"3ca43707542a62c1a27809fe092854d524c988ff60333a82ed3405054eebdb32","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"294e6718a831e43541c3fe229cab5821c34a336e6e541f305b289f5e4da9b81d","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"793a8172e30a8f15e6aeef14ffecfeff6d5b741747c7910dd73bd08a3e5171a3","signature":"d50234446709c93924529c0508fb514f3a19916424febb911dd43644b268c3ce"},{"version":"e19e34a298a58faec541fb58680948639a2c78f3008e9845dd8d186c696f754f","signature":"9fb36d3de78d11c8e077d12edba6792689e2edcd790656e69cb51928fe7a5f9a"},{"version":"32a06e6fca5898586ad83f1b37d401ad950afd0bba1a08f39d73e589393428af","signature":"7aefa32d37658c047fa5003114c9d88d7a028b7134aa3e4618a57342ab06583c"},{"version":"e7c2f40dc99121500ad108a4f86541d29cac105ed018f994c7c5a2836e77b257","impliedFormat":1},{"version":"90e930283286ab117ab89f00589cf89ab5e9992bc57e79f303b36ee14649bdd9","impliedFormat":1},{"version":"6d48a6c907c668a6d6eda66acec4242e367c983e073100e35c1e234c424ad1a4","impliedFormat":1},{"version":"68a0e898d6c39160f1326ef922508914498c7a2d0b5a0d9222b7928d343214eb","impliedFormat":1},{"version":"69d96a8522b301a9e923ac4e42dd37fc942763740b183dffa3d51aca87f978d5","impliedFormat":1},{"version":"ff2fadad64868f1542a69edeadf5c5519e9c89e33bec267605298f8d172417c7","impliedFormat":1},{"version":"2866ae69517d6605a28d0c8d5dff4f15a0b876eeb8e5a1cbc51631d9c6793d3f","impliedFormat":1},{"version":"f8c4434aa8cbd4ede2a75cbc5532b6a12c9cac67c3095ed907e54f3f89d2e628","impliedFormat":1},{"version":"0b8adc0ae60a47acf65575952eee568b3d497f9975e3162f408052a99e65f488","impliedFormat":1},{"version":"ede9879d22f7ce68a8c99e455acab32fc45091c6eed9625549742b03e1f1ac1a","impliedFormat":1},{"version":"0e8c007c6e404da951c3d98a489ac0a3e9b6567648b997c03445ac69d7938c1c","impliedFormat":1},{"version":"f2a4866bed198a7c804b58ee39efe74c66ecdcf2dfebef0b9895d534a50790c4","impliedFormat":1},{"version":"ad72538d0c5e417ee6621e1b54691c274bcacaa1807c9895c5fa6d40b45fb631","impliedFormat":1},{"version":"4f851c59f3112702f6178e76204f839e3156daa98b5b7d7e3fc407a6c5764118","impliedFormat":1},{"version":"57511f723968d2f41dd2d55b9fbc5d0f3107af4e4227db0fb357c904bd34e690","impliedFormat":1},{"version":"9585df69c074d82dda33eadd6e5dccd164659f59b09bd5a0d25874770cf6042d","impliedFormat":1},{"version":"f6f6ce3e3718c2e7592e09d91c43b44318d47bca8ee353426252c694127f2dcb","impliedFormat":1},{"version":"4f70076586b8e194ef3d1b9679d626a9a61d449ba7e91dfc73cbe3904b538aa0","impliedFormat":1},{"version":"6d5838c172ff503ef37765b86019b80e3abe370105b2e1c4510d6098b0e84414","impliedFormat":1},{"version":"1876dac2baa902e2b7ebed5e03b95f338192dc03a6e4b0731733d675ba4048f3","impliedFormat":1},{"version":"8086407dd2a53ce700125037abf419bddcce43c14b3cf5ea3ac1ebded5cad011","impliedFormat":1},{"version":"c2501eb4c4e05c2d4de551a4bace9c28d06a0d89b228443f69eb3d7f9049fbd6","impliedFormat":1},{"version":"1829f790849d54ea3d736c61fdefd3237bede9c5784f4c15dfdafb7e0a9b8f63","impliedFormat":1},{"version":"5392feeda1bf0a1cc755f7339ea486b7a4d0d019774da8057ddc85347359ed63","impliedFormat":1},{"version":"c998117afca3af8432598c7e8d530d8376d0ca4871a34137db8caa1e94d94818","impliedFormat":1},{"version":"4e465f7e9a161a5a5248a18af79dbfbf06e8e1255bfdc8f63ab15475a2ba48bd","impliedFormat":1},{"version":"e0353c5070349846fe9835d782a8ce338d6d4172c603d14a6b364d6354957a4e","impliedFormat":1},{"version":"323133630008263f857a6d8350e36fb7f6e8d221ec0a425b075c20290570c020","impliedFormat":1},{"version":"c04e691d64b97e264ca4d000c287a53f2a75527556962cdbe3e8e2b301dac906","impliedFormat":1},{"version":"3733dba5107de9152f98da9bcb21bf6c91ac385f3b22f30ed08d0dc5e74c966f","impliedFormat":1},{"version":"d3ec922ddd9677696ee0552f10e95c4e59f85bb8c93fd76cd41b2dd93988ff39","impliedFormat":1},{"version":"0492c0d35e05c0fdd638980e02f3a7cdec18b311959fc730d85ed7e1d4ff38a7","impliedFormat":1},{"version":"c7122ba860d3497fa04a112d424ee88b50c482360042972bcf0917c5b82f4484","impliedFormat":1},{"version":"838f52090a0d39dce3c42e0ccb0db8db250c712c1fa2cd36799910c8f8a7f7bf","impliedFormat":1},{"version":"116ec624095373939de9edb03619916226f5e5b6e93cd761c4bda4efecb104fc","impliedFormat":1},{"version":"8e6b8259bfd8c8c3d6ed79349b7f2f69476d255aede2cd6c0acb0869ad8c6fdd","impliedFormat":1},{"version":"2fbe402f0ee5aa8ab55367f88030f79d46211c0a0f342becaa9f648bf8534e9d","impliedFormat":1},{"version":"b94258ef37e67474ac5522e9c519489a55dcb3d4a8f645e335fc68ea2215fe88","impliedFormat":1},{"version":"4f54baaec251aa9f828a39a85a03e1d99aab20ac513d209c7e079205d36339fa","signature":"da00e8eb1c3f4c129bf490df86b9af683a94716799a0a16897352ee3d1bfbc9e"},{"version":"90761be39efe97af5bf38f549b00bf32dde1e158be0b66f5e1585f67b159591b","signature":"607dbe079354917d98dd1875a145739cb49e74b3d94dd869e1a2f85583baaa57"},{"version":"3da2168c6db272a11e951831f6f1263c7ccdad2b121ed943d55e4ca7fe24ec90","signature":"06bb08dc08e8e56403d40f72bc9955837a6515b963bd1c981f6eb56fc84a0479"},{"version":"e32177e390adceb749a9a0e0fcca122bbe579bdb2be26c2e3c4374ecb5bd52fb","signature":"22b84675bb14912a716ac79a0050b9a56e27123dcc67fbc5278a7974ebf7e172"},{"version":"2c101f7e227a2d7a22a877768446416a8a48a6905141bb27750cd1c637d7c91a","signature":"fe061a0f2b9c05a869507b7b1c062fdb49352c28937e8300ef1dc076c247c941"},{"version":"7d05cd84768a97a8cfdcb327aaa04bedb0d8c4c9de196f57bb7412f88664965e","signature":"20b8d283b7eaafbf9f4ff48683607754ddd7e8d3eb1e443ae81a2237693580a3"},{"version":"e3c5eae71bd1030d8a3803f08c464ca36c8fb6461968ec635a116f281503d27b","signature":"e9fd1ef20d74d868f2bc859f59456d2e78f00e07aac5ea5c9bdf2e3517e8ed25"},{"version":"9b874b13e2a6171e5eb30879624bbdc327cb67d09889275a16619555f709ad7b","signature":"072640ecf57572cb0ca6a352bccf20ed1c412d4f8d9b8c40da8ef4296aef60c4"},{"version":"0e4c6e06a165e5f8d18405d3a75b9fa6d77b20229a9992cf8265471066119607","signature":"6619969800f098c670d9779fe509538dd11173cdc7cc5a55013960105bf4122b"},{"version":"4898334867a74fc12b8b600f8b082bee887e5a645efdbfbfdaba20e9369c50ca","signature":"42c724e1d4be365a85b955fa9fe997cec71ff8e891f9739ee2ba4c609bc0733c"},{"version":"1507561a9f374ce0d54b9389fd66c1564938313e58d1a6e50fd83e968e2d5948","signature":"59445f8f04918983bfa7d55ac4e41e8121e6dd0ba59c035c81be896d48d20327"},{"version":"f903da0cb5899a64e71f2061df2a3d66cc235450fe42fa62e8226e8a1ca92194","signature":"64e80122802b645ce278661b2e33078d583a1570dd5c6e94f83c796d78a47635"},{"version":"01190da768f64390b2cccd2ade441c5a4898ae87eec393371d1b53a73b99745d","signature":"bfae61e91d0f24327c0c5b1285af04c61531f29c4eb5c5fb1db3b275ab54c8ef"},{"version":"180f2160e984c19a727d330f407a7f692227543a70c6d305ed7d2db5b52a14aa","signature":"cb3063f6af64db0f221d2bcdf994be187014e2a7522fc66f51335aa509b225bf"},{"version":"5b3e21bac8c57868f01824bdb59eb69ebd0e3458b3a797096f0c4d62bf86f4cf","signature":"17d040b3bb80172d0cd8be8193f2b100aee94d67e90fcedc208cd3604c17304c"},{"version":"4f579255f8a91edb718dc7cf682a424f2784668be6953679aff7b7f57845bd32","signature":"45b373ad2e114de335dd3eaf62f9658266d71c2f34537489f88f3b4815fa72f8"},{"version":"caddb53940855ed5c7e162cf32d0b3938587de758e720ab554e8b9a0142e9143","signature":"9b391761b31f4e33f0d8a69472e750dd500b9899734a0464089621abbc5db2e4"},{"version":"896836ffb1129447b42857fc9bba287ea298d8228bbc15abfdaa8c0afec6698b","signature":"dd46478187e065db0e493394aabd50f1d1935cf0a668981b4bb9b6d3ad2e5a24"},{"version":"fb0ef8b51cbee9a36cfa782b18c1205b8cbe9a2809613d8e5c22e1a7cbd6c09c","signature":"65ec2a92e4365c17d2541a4543492fdd66b0485f62055134ec91e09d7742087e"},{"version":"bd57ebab2fb0479efd2663a90f7ab7a30d62daf843de80bc72912ff6d489597d","signature":"901153cca971c1ba43a56722523cebfc9471632ef8a502d922fbb2ce91db9ddd"},{"version":"784af067fe7a69bb0b885453ae6d3a9b362adf4219af873e0d1cb19e3dc53cb7","signature":"9bb1690168450b066c372d43ce9ba80b96ae30744d602e1a50b285a5b10b38d6"},{"version":"75670048da96a4c0ea30aaea9e357914c2627949de8e4302eb77c98c93d4cfde","signature":"f60d744c24fdfb18724c6eb0304f2503d872c2d8596c13910dabdea5e20f097c"},{"version":"5e29095fa940c4bc7f796e0915bdc080b1e822a6d7a5c8c1c456d1f24ee30298","signature":"92fed5e72a46791c863b5c3d58c3ab87637193ec029ff226cdff52578d8aa195"},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1}],"root":[512,513,535,619,624,625,[628,656],[658,663],[665,668],[711,733],[960,966],[969,999],[1114,1118],[1157,1179]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":4,"module":99,"skipLibCheck":true,"strict":true,"target":9,"verbatimModuleSyntax":false},"referencedMap":[[512,1],[513,2],[622,3],[621,4],[1182,5],[1180,6],[356,6],[534,7],[623,8],[620,6],[539,6],[1154,9],[1133,10],[1143,11],[1140,11],[1141,12],[1125,12],[1139,12],[1120,11],[1126,13],[1129,14],[1134,15],[1122,13],[1123,12],[1136,16],[1121,13],[1127,13],[1130,13],[1135,13],[1137,12],[1124,12],[1138,12],[1132,17],[1128,18],[1153,19],[1131,20],[1142,21],[1119,12],[1144,12],[1145,12],[1146,12],[1147,12],[1148,12],[1149,12],[1150,12],[1151,12],[1152,12],[1185,22],[1181,5],[1183,23],[1184,5],[546,24],[544,6],[551,6],[1186,6],[1187,6],[120,25],[121,25],[122,26],[74,27],[123,28],[124,29],[125,30],[69,6],[72,31],[70,6],[71,6],[126,32],[127,33],[128,34],[129,35],[130,36],[131,37],[132,37],[133,38],[134,39],[135,40],[136,41],[75,6],[73,6],[137,42],[138,43],[139,44],[173,45],[140,46],[141,6],[142,47],[143,48],[144,49],[145,50],[146,51],[147,52],[148,53],[149,54],[150,55],[151,55],[152,56],[153,6],[154,57],[155,58],[157,59],[156,60],[158,61],[159,62],[160,63],[161,64],[162,65],[163,66],[164,67],[165,68],[166,69],[167,70],[168,71],[169,72],[170,73],[76,6],[77,6],[78,6],[116,74],[117,6],[118,6],[119,61],[171,75],[172,76],[177,77],[441,78],[178,79],[176,80],[443,81],[442,82],[174,83],[439,6],[175,84],[60,6],[62,85],[438,78],[208,78],[547,86],[606,87],[607,88],[605,6],[540,6],[591,89],[590,90],[602,89],[593,91],[595,92],[614,92],[594,93],[537,94],[536,6],[542,95],[543,96],[611,97],[587,98],[589,99],[610,6],[608,98],[588,6],[541,96],[586,6],[545,6],[1101,100],[1000,6],[1016,101],[1098,102],[1081,103],[1082,104],[1080,105],[1083,6],[1084,6],[1089,106],[1085,6],[1086,6],[1087,6],[1088,6],[1095,107],[1110,108],[1096,109],[1099,110],[1094,111],[1102,112],[1097,102],[1092,113],[1103,114],[1093,115],[1104,116],[1064,6],[1106,117],[1091,118],[1105,110],[1107,119],[1090,104],[1109,120],[1051,6],[1052,6],[1055,121],[1053,6],[1019,6],[1054,6],[1113,122],[1018,123],[1001,6],[1007,124],[1020,125],[1022,126],[1058,127],[1079,128],[1059,6],[1012,129],[1060,130],[1061,131],[1062,6],[1063,6],[1014,132],[1066,133],[1067,134],[1003,6],[1011,135],[1068,6],[1057,136],[1069,6],[1078,6],[1021,137],[1050,109],[1070,6],[1006,138],[1071,6],[1072,6],[1073,6],[1075,139],[1074,140],[1076,141],[1065,142],[1056,143],[1077,144],[1015,145],[1023,6],[1008,6],[1024,6],[1027,146],[1013,147],[1009,148],[1010,6],[1025,135],[1026,149],[1002,6],[1108,150],[1017,151],[1112,152],[1111,153],[1042,154],[1043,155],[1041,156],[1029,157],[1034,158],[1035,159],[1038,160],[1037,161],[1036,162],[1039,163],[1046,164],[1049,165],[1048,166],[1047,167],[1040,168],[1030,169],[1045,170],[1032,171],[1028,172],[1033,173],[1031,157],[1156,174],[1155,175],[626,6],[1004,6],[1005,176],[61,6],[967,169],[968,177],[1044,6],[664,6],[556,6],[676,178],[678,179],[677,180],[675,181],[674,6],[710,182],[681,183],[690,183],[682,183],[691,183],[683,183],[684,183],[698,183],[697,183],[699,183],[700,183],[692,183],[685,183],[693,183],[686,183],[694,183],[687,183],[689,183],[696,183],[695,183],[701,183],[688,183],[702,183],[707,183],[708,183],[703,183],[680,6],[709,6],[705,183],[704,183],[706,183],[579,6],[581,184],[580,6],[464,185],[469,186],[476,187],[459,188],[212,6],[220,189],[360,190],[363,191],[335,6],[348,192],[355,193],[237,6],[337,6],[218,6],[334,194],[380,195],[219,6],[210,196],[362,197],[364,198],[365,199],[436,200],[329,201],[282,202],[342,203],[343,204],[341,205],[340,6],[336,206],[361,207],[221,208],[406,6],[407,209],[248,210],[222,211],[249,210],[285,210],[188,210],[358,212],[357,6],[347,213],[454,6],[197,6],[475,214],[414,215],[415,216],[411,217],[493,6],[312,6],[416,218],[412,219],[498,220],[497,221],[492,6],[263,6],[315,222],[314,6],[491,223],[413,78],[268,224],[275,225],[277,226],[267,6],[272,227],[274,228],[276,229],[271,230],[269,6],[273,231],[494,6],[490,6],[496,232],[495,6],[266,233],[485,234],[488,235],[256,236],[255,237],[254,238],[501,78],[253,239],[242,6],[503,6],[504,78],[505,240],[180,6],[344,241],[345,242],[346,243],[184,6],[349,6],[204,244],[179,6],[428,78],[186,245],[427,246],[426,247],[417,6],[418,6],[425,6],[420,6],[423,248],[419,6],[421,249],[424,250],[422,249],[217,6],[214,6],[215,210],[369,6],[374,251],[375,252],[373,253],[371,254],[372,255],[367,6],[434,218],[209,218],[463,256],[470,257],[474,258],[303,259],[302,6],[297,6],[450,260],[458,261],[330,262],[331,263],[409,264],[319,6],[432,265],[307,78],[324,266],[435,267],[320,6],[323,268],[321,6],[433,269],[430,270],[429,6],[431,6],[327,6],[405,271],[192,272],[305,273],[309,274],[325,275],[328,276],[317,277],[310,278],[457,279],[383,280],[301,281],[189,282],[456,283],[185,284],[376,285],[368,6],[377,286],[394,287],[366,6],[393,288],[68,6],[388,289],[213,6],[408,290],[384,6],[198,6],[200,6],[339,6],[392,291],[216,6],[240,292],[326,293],[246,294],[306,6],[391,6],[370,6],[396,295],[397,296],[338,6],[399,297],[401,298],[400,299],[350,6],[390,282],[403,300],[300,301],[389,302],[395,303],[225,6],[229,6],[228,6],[227,6],[232,6],[226,6],[235,6],[234,6],[231,6],[230,6],[233,6],[236,304],[224,6],[292,305],[291,6],[296,306],[293,307],[295,308],[298,306],[294,307],[205,309],[284,310],[453,311],[451,6],[480,312],[482,313],[446,314],[481,315],[193,316],[190,316],[223,6],[207,317],[206,318],[202,319],[203,320],[211,321],[239,321],[250,321],[286,322],[251,322],[195,323],[194,6],[290,324],[289,325],[288,326],[287,327],[196,328],[437,329],[238,330],[445,331],[410,332],[440,333],[444,334],[333,335],[332,336],[313,337],[299,338],[281,339],[283,340],[280,341],[402,342],[304,6],[468,6],[201,343],[404,344],[452,345],[311,6],[241,346],[318,347],[316,348],[243,349],[378,350],[447,6],[244,351],[379,351],[466,6],[465,6],[467,6],[449,6],[448,6],[381,352],[308,6],[278,353],[199,354],[257,6],[183,355],[245,6],[472,78],[182,6],[484,356],[265,78],[478,218],[264,357],[461,358],[262,356],[187,6],[486,359],[260,78],[261,78],[252,6],[181,6],[259,360],[258,361],[247,362],[322,54],[382,54],[398,6],[386,363],[385,6],[270,233],[191,6],[279,78],[455,244],[462,364],[63,78],[66,365],[67,366],[64,78],[65,6],[359,367],[354,368],[353,6],[352,369],[351,6],[460,370],[471,371],[473,372],[477,373],[479,374],[483,375],[511,376],[487,376],[510,377],[489,378],[499,379],[500,380],[502,381],[506,382],[509,244],[508,6],[507,383],[1100,6],[531,384],[514,6],[515,384],[530,385],[657,386],[533,387],[532,386],[574,388],[572,389],[573,390],[561,391],[562,389],[569,392],[560,393],[565,394],[575,6],[566,395],[571,396],[577,397],[576,398],[559,399],[567,400],[568,401],[563,402],[570,388],[564,403],[553,404],[552,405],[387,169],[558,6],[736,6],[739,6],[742,6],[958,406],[737,407],[757,408],[734,409],[741,410],[957,411],[927,412],[928,413],[913,414],[763,415],[914,414],[915,416],[777,417],[761,6],[930,418],[929,416],[906,414],[907,416],[795,419],[794,420],[753,421],[853,422],[859,423],[854,424],[856,425],[855,426],[860,427],[858,414],[857,414],[744,6],[745,428],[861,429],[863,430],[862,431],[752,432],[754,421],[850,6],[776,433],[848,434],[847,435],[867,436],[866,437],[865,438],[864,416],[807,439],[778,432],[916,416],[746,416],[750,440],[844,441],[849,442],[779,443],[852,444],[917,424],[768,445],[748,446],[780,447],[798,448],[799,449],[797,416],[800,450],[918,414],[911,451],[919,416],[755,452],[751,453],[758,454],[759,455],[868,6],[869,456],[870,457],[873,458],[871,459],[872,416],[932,460],[931,416],[851,461],[876,462],[874,416],[875,463],[908,464],[839,465],[841,466],[920,416],[843,467],[792,468],[785,454],[788,469],[790,470],[793,471],[787,472],[786,416],[789,473],[791,474],[845,475],[756,6],[765,476],[921,477],[922,478],[764,6],[773,479],[846,480],[923,416],[924,416],[771,439],[840,478],[781,481],[760,482],[805,483],[802,483],[801,484],[804,485],[747,486],[909,487],[877,488],[881,489],[878,490],[879,416],[880,491],[796,492],[884,493],[882,454],[883,414],[886,494],[888,495],[885,461],[887,496],[782,6],[772,488],[770,497],[769,498],[842,499],[890,500],[889,454],[910,501],[767,502],[766,6],[806,503],[838,504],[837,505],[891,414],[892,461],[893,506],[898,507],[894,416],[895,416],[896,461],[897,508],[803,416],[783,6],[762,509],[749,416],[899,454],[900,414],[902,510],[817,416],[901,414],[818,511],[808,512],[809,513],[836,514],[812,515],[813,516],[816,517],[814,518],[815,519],[810,520],[820,521],[819,522],[811,416],[830,523],[835,524],[831,525],[832,526],[833,527],[834,528],[925,529],[784,530],[774,531],[775,532],[821,533],[822,533],[903,6],[904,534],[829,535],[905,536],[823,535],[824,535],[825,537],[826,533],[827,538],[828,539],[938,540],[935,414],[934,414],[936,414],[937,414],[942,541],[940,542],[941,543],[939,461],[949,414],[944,461],[946,6],[948,544],[945,545],[947,546],[950,547],[952,548],[951,549],[953,550],[933,6],[954,551],[943,6],[926,416],[743,552],[955,553],[959,553],[735,6],[740,408],[738,554],[956,555],[912,556],[627,6],[603,6],[538,6],[58,6],[59,6],[10,6],[11,6],[13,6],[12,6],[2,6],[14,6],[15,6],[16,6],[17,6],[18,6],[19,6],[20,6],[21,6],[3,6],[22,6],[23,6],[4,6],[24,6],[28,6],[25,6],[26,6],[27,6],[29,6],[30,6],[31,6],[5,6],[32,6],[33,6],[34,6],[35,6],[6,6],[39,6],[36,6],[37,6],[38,6],[40,6],[7,6],[41,6],[46,6],[47,6],[42,6],[43,6],[44,6],[45,6],[8,6],[51,6],[48,6],[49,6],[50,6],[52,6],[9,6],[53,6],[54,6],[55,6],[57,6],[56,6],[1,6],[94,557],[104,558],[93,557],[114,559],[85,560],[84,561],[113,383],[107,562],[112,563],[87,564],[101,565],[86,566],[110,567],[82,568],[81,383],[111,569],[83,570],[88,571],[89,6],[92,571],[79,6],[115,572],[105,573],[96,574],[97,575],[99,576],[95,577],[98,578],[108,383],[90,579],[91,580],[100,581],[80,137],[103,573],[102,571],[106,6],[109,582],[549,583],[585,584],[555,585],[550,583],[548,6],[554,586],[583,6],[578,6],[582,587],[557,6],[584,588],[613,589],[618,590],[612,591],[604,592],[600,593],[596,594],[609,6],[597,91],[672,595],[669,596],[616,597],[615,598],[598,599],[671,600],[592,6],[599,601],[617,602],[679,603],[673,604],[670,6],[601,6],[529,605],[521,606],[528,607],[523,6],[524,6],[522,608],[525,609],[516,6],[517,6],[518,605],[520,610],[526,6],[527,611],[519,612],[535,613],[638,614],[640,615],[643,616],[645,617],[647,618],[649,619],[651,620],[653,621],[655,622],[656,623],[658,624],[660,625],[663,626],[667,627],[668,628],[716,629],[715,630],[720,631],[719,632],[721,633],[717,634],[718,635],[1163,636],[1165,637],[729,638],[730,639],[731,640],[732,641],[733,642],[961,643],[962,644],[965,645],[966,646],[970,647],[971,648],[972,649],[975,650],[979,651],[980,652],[978,653],[976,654],[982,655],[981,634],[983,656],[984,657],[1167,658],[1168,659],[1170,660],[1169,661],[1116,662],[1171,663],[1172,664],[1174,665],[1173,218],[1162,666],[1176,667],[1175,218],[1177,668],[1178,669],[723,670],[1179,671],[724,672],[1164,673],[1118,674],[1160,675],[1161,676],[1166,677],[1157,678],[1158,678],[1117,679],[1159,679],[631,680],[985,681],[634,682],[629,679],[633,683],[986,684],[635,685],[630,634],[987,686],[632,687],[642,688],[969,689],[644,688],[646,688],[648,688],[650,688],[641,690],[652,688],[654,688],[973,691],[625,634],[988,692],[964,641],[960,693],[989,694],[963,695],[728,696],[990,630],[624,697],[659,698],[662,699],[712,634],[639,630],[991,700],[977,701],[992,702],[661,703],[994,704],[993,634],[995,705],[665,706],[637,695],[996,707],[725,634],[997,708],[726,709],[998,630],[999,634],[666,710],[711,711],[722,634],[974,712],[727,697],[628,713],[714,714],[713,715],[636,716],[1114,717],[1115,613],[619,718]],"affectedFilesPendingEmit":[513,535,638,640,643,645,647,649,651,653,655,656,658,660,663,667,668,716,715,720,719,721,717,718,1163,1165,729,730,731,732,733,961,962,965,966,970,971,972,975,979,980,978,976,982,981,983,984,1167,1168,1170,1169,1116,1171,1172,1174,1173,1162,1176,1175,1177,1178,723,1179,724,1164,1118,1160,1161,1166,1157,1158,1117,1159,631,985,634,629,633,986,635,630,987,632,642,969,644,646,648,650,641,652,654,973,625,988,964,960,989,963,728,990,624,659,662,712,639,991,977,992,661,994,993,995,665,637,996,725,997,726,998,999,666,711,722,974,727,628,714,713,636,1114,1115,619],"version":"5.9.3"}
\ No newline at end of file
diff --git a/govarbitrage/vitest.config.ts b/govarbitrage/vitest.config.ts
deleted file mode 100644
index 3dbf34f..0000000
--- a/govarbitrage/vitest.config.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { defineConfig } from "vitest/config";
-import { fileURLToPath } from "node:url";
-
-export default defineConfig({
- resolve: {
- alias: {
- "@": fileURLToPath(new URL("./src", import.meta.url)),
- },
- },
- test: {
- environment: "node",
- include: ["src/**/*.test.ts", "tests/unit/**/*.test.ts"],
- globals: true,
- },
-});
← 4f461fb security: strip hardcoded secret -> env-first/passwordless.
·
back to Japan Enrich
·
auto-data-snapshot: 2026-09-13T00:21:19 (21 data files) — Ab 22df4f0 →