From 1a7a837fb3e13c5227ca1f4e45346f8344f10a21 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Wed, 25 Mar 2026 22:32:14 -0700 Subject: [PATCH 01/40] fix: restore images on Firebase hosting builds - Disable Netlify image CDN when building outside Netlify (imageCDN: !!process.env.NETLIFY) so images use direct /_astro/ paths on Firebase instead of /.netlify/images URLs - Fix LocalImageUsedWrongly build error in _mcp-auth-claude-code.mdx by importing skill-activation.png as a module instead of passing a string filepath to Co-Authored-By: Claude Sonnet 4.6 --- astro.config.mjs | 2 +- .../templates/coding-agents/_mcp-auth-claude-code.mdx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/astro.config.mjs b/astro.config.mjs index af7726cad..3e74004f2 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -353,5 +353,5 @@ export default defineConfig({ }, }, }, - adapter: netlify(), + adapter: netlify({ imageCDN: !!process.env.NETLIFY }), }) diff --git a/src/components/templates/coding-agents/_mcp-auth-claude-code.mdx b/src/components/templates/coding-agents/_mcp-auth-claude-code.mdx index d759a6d85..80109fbde 100644 --- a/src/components/templates/coding-agents/_mcp-auth-claude-code.mdx +++ b/src/components/templates/coding-agents/_mcp-auth-claude-code.mdx @@ -1,6 +1,7 @@ import { Steps, Aside, Tabs, TabItem } from '@astrojs/starlight/components' import { Image } from 'astro:assets' import enableClaudePluginGif from '@/assets/docs/ai-assisted-mcp-quickstart/2.gif' +import skillActivationImg from '@/assets/docs/ai-assisted-mcp-quickstart/skill-activation.png' @@ -79,7 +80,7 @@ import enableClaudePluginGif from '@/assets/docs/ai-assisted-mcp-quickstart/2.gi When you submit this prompt, Claude Code loads the MCP authentication skill from the marketplace -> analyzes your existing MCP server structure -> generates authentication middleware with token validation -> creates the OAuth discovery endpoint -> configures environment variable handling. Claude Code activating MCP authentication skill From f3b30f6ef1c36f9c6431c31ebadb9258c0ae5335 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Wed, 25 Mar 2026 22:34:18 -0700 Subject: [PATCH 02/40] chore: add Firebase hosting config Co-Authored-By: Claude Sonnet 4.6 --- .firebaserc | 5 +++++ .gitignore | 1 + firebase.json | 6 ++++++ 3 files changed, 12 insertions(+) create mode 100644 .firebaserc create mode 100644 firebase.json diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 000000000..40dd1ca77 --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "docs-scalekit-com" + } +} diff --git a/.gitignore b/.gitignore index 4cddc814b..912eb0c80 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,4 @@ skills-lock.json .windsurf/ .tmp/ +.firebase/ diff --git a/firebase.json b/firebase.json new file mode 100644 index 000000000..5a89d68a5 --- /dev/null +++ b/firebase.json @@ -0,0 +1,6 @@ +{ + "hosting": { + "public": "dist", + "ignore": ["firebase.json", "**/.*", "**/node_modules/**"] + } +} From 7556da557eb026a4256ca6347650932ae69dd9b2 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Wed, 25 Mar 2026 23:03:38 -0700 Subject: [PATCH 03/40] chore: add Firebase GitHub Actions workflow for PR preview deploys --- .../firebase-hosting-pull-request.yml | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/firebase-hosting-pull-request.yml diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml new file mode 100644 index 000000000..0ae2e2615 --- /dev/null +++ b/.github/workflows/firebase-hosting-pull-request.yml @@ -0,0 +1,26 @@ +# This file was auto-generated by the Firebase CLI +# https://github.com/firebase/firebase-tools + +name: Deploy to Firebase Hosting on PR +on: pull_request +permissions: + checks: write + contents: read + pull-requests: write +jobs: + build_and_preview: + if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - run: npm install -g pnpm + - run: pnpm install + - run: pnpm build + - uses: FirebaseExtended/action-hosting-deploy@v0 + with: + repoToken: ${{ secrets.GITHUB_TOKEN }} + firebaseServiceAccount: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_DOCS_SCALEKIT_COM }} + projectId: docs-scalekit-com From 34d49215637b34f8f9067b96ea6082bb06750c3c Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Wed, 25 Mar 2026 23:08:20 -0700 Subject: [PATCH 04/40] chore: optimize Firebase PR preview workflow --- .../workflows/firebase-hosting-pull-request.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml index 0ae2e2615..f5f7d7b70 100644 --- a/.github/workflows/firebase-hosting-pull-request.yml +++ b/.github/workflows/firebase-hosting-pull-request.yml @@ -2,14 +2,19 @@ # https://github.com/firebase/firebase-tools name: Deploy to Firebase Hosting on PR -on: pull_request +on: + pull_request: + types: [opened, synchronize, reopened, labeled] permissions: checks: write contents: read pull-requests: write jobs: build_and_preview: - if: ${{ github.event.pull_request.head.repo.full_name == github.repository }} + if: | + github.event.pull_request.head.repo.full_name == github.repository && + github.event.pull_request.draft == false && + contains(github.event.pull_request.labels.*.name, 'firebase-preview') runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -17,6 +22,11 @@ jobs: with: node-version: '22' - run: npm install -g pnpm + - uses: actions/cache@v4 + with: + path: ~/.local/share/pnpm/store + key: ${{ runner.os }}-pnpm-${{ hashFiles('pnpm-lock.yaml') }} + restore-keys: ${{ runner.os }}-pnpm- - run: pnpm install - run: pnpm build - uses: FirebaseExtended/action-hosting-deploy@v0 From 403ba828365785ce30e8bd8cf943d4c9f4fdb52e Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Wed, 25 Mar 2026 23:15:40 -0700 Subject: [PATCH 05/40] fix: skip D2 generation on GitHub Actions builds --- astro.config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astro.config.mjs b/astro.config.mjs index 3e74004f2..6a182f328 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -299,7 +299,7 @@ export default defineConfig({ }, }), d2({ - skipGeneration: !!process.env['NETLIFY'], + skipGeneration: !!process.env['NETLIFY'] || !!process.env['GITHUB_ACTIONS'], theme: { default: '1', // Light theme (Neutral default) dark: '1', From eb3c75d86d592611edf4cf5cfcde8b7d1418ddc5 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Thu, 26 Mar 2026 18:15:25 -0700 Subject: [PATCH 06/40] docs: add website redesign design spec Captures the two-product-line restructure concept (Auth for Agents / Auth for Apps), domain strategy, homepage layout, docs experience, and agent-readable docs.scalekit.com surface. Prepared for internal leadership alignment. --- .../2026-03-26-website-redesign-design.md | 319 ++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 docs/superpowers/specs/2026-03-26-website-redesign-design.md diff --git a/docs/superpowers/specs/2026-03-26-website-redesign-design.md b/docs/superpowers/specs/2026-03-26-website-redesign-design.md new file mode 100644 index 000000000..8442df9a1 --- /dev/null +++ b/docs/superpowers/specs/2026-03-26-website-redesign-design.md @@ -0,0 +1,319 @@ +# Website redesign — design spec + +**Date:** 2026-03-26 +**Status:** Draft — pending leadership alignment + +--- + +## The core idea + +Scalekit solves two fundamentally different authentication problems. Most auth tools treat them as one. The redesign makes this distinction the organizing principle of the entire web presence. + +> "Auth used to be one problem. AI made it two." + +**Inbound auth** — users, agents, and M2M clients authenticate _into_ your app, MCP server, or API. +**Outbound auth** — your AI agents authenticate _out_ to external services like Gmail, Slack, and Salesforce. + +These require different products, different pricing models, and different documentation. The site reflects that. + +--- + +## Domain strategy + +| Domain | Audience | Purpose | +| ------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| `scalekit.com` | Human developers | Replaces current docs.scalekit.com. Developer-first homepage + full documentation. No marketing fluff. | +| `docs.scalekit.com` | AI coding agents | Machine-readable layer over the same content. Designed for Cursor, Claude Code, Copilot, and any agent building with Scalekit. | + +`scalekit.com` is the primary destination. `docs.scalekit.com` is a programmatic API over the docs — not a parallel site. + +--- + +## Two product lines + +### Auth for Agents (primary) + +**Positioning:** Outbound authentication for AI workflows. + +Your AI agents connect to external services — Gmail, Slack, Salesforce, Notion, and 100+ more — without managing OAuth flows, storing tokens, or handling refresh logic. + +**Products:** Agent Auth +**Pricing metric:** Connected accounts + tool calls +**Primary color:** Purple (`#6366f1`) +**Target developer:** Building AI agents, autonomous workflows, or agentic B2B SaaS + +### Auth for Apps (secondary) + +**Positioning:** Inbound authentication for B2B applications. + +Everything users and agents need to authenticate into your app — login, organizations, SSO, SCIM, MCP server security, and API auth. + +**Products:** Full Stack Auth, Modular SSO, Modular SCIM, MCP Auth, API/M2M Auth +**Pricing metric:** MAUs, MAOs, SSO connections +**Primary color:** Green (`#10b981`) +**Target developer:** Building B2B SaaS apps, MCP servers, or APIs + +**Why agents-primary?** The agent auth market is the growth vector. Most competing auth tools don't solve outbound agent auth at all. Making it primary is a clear positioning statement. + +--- + +## Information hierarchy + +### scalekit.com + +``` +/ Homepage (two-door entry, agents-primary) +/for-agents/ Auth for Agents documentation root + quickstart 10-minute Gmail agent walkthrough + overview What Agent Auth is and how it works + connected-accounts Let users connect their accounts + token-vault How token storage and refresh works + tool-calling Using tokens in agent tool calls + frameworks/ LangChain, OpenAI, Anthropic, Vercel AI, Google ADK, Mastra + providers/ 100+ OAuth provider integration guides +/for-apps/ Auth for Apps documentation root + quickstart Full stack auth in minutes + overview Products and when to use each + full-stack-auth/ Login, session, orgs, RBAC + modular-sso/ SAML/OIDC with enterprise IdPs + modular-scim/ User provisioning from Okta, Azure AD + mcp-auth/ Securing your MCP server + api-auth/ M2M tokens and API keys +/sdks/ Shared across both product lines + node / python / go / java / expo +/apis/ REST API reference (Scalar-powered) +/pricing/ Tabbed pricing — Agent Auth | App Auth +/changelog/ Engineering blog-style release notes +``` + +### docs.scalekit.com + +``` +/llms.txt Product overview optimized for LLM consumption +/llms-full.txt Full context dump — all docs in one file +/sitemap.xml Machine-readable URL index +/openapi/spec.json OpenAPI spec for programmatic access +/mcp MCP server (SSE endpoint) + Tools: + search(query) Semantic search across all docs + get_page(path) Fetch any doc page as clean markdown + list_products() List all products with descriptions + get_code_example(p, lang) Get a code example by product + language +/context/ Structured context files per topic + for-agents.md Full agent auth context for LLM consumption + for-apps.md Full app auth context for LLM consumption + sdks.md SDK reference and naming conventions + errors.md Error codes and troubleshooting +/search REST search API — GET /search?q= +/pages/ Clean markdown mirror of scalekit.com + for-agents/** No sidebars, no JS, no images — pure content + for-apps/** + sdks/** +``` + +The `llms.txt` encodes SDK variable naming conventions (critical for correct code generation): + +- Node.js: `scalekit` +- Python: `scalekit_client` +- Go: `scalekitClient` +- Java: `scalekitClient` + +--- + +## Homepage design + +### Navigation + +``` +⬡ Scalekit | For Agents ↓ | For Apps ↓ | SDKs & APIs | Pricing | Changelog | Sign in | [Start free →] +``` + +- "For Agents" appears first — primary product line +- "For Apps" is secondary but always present +- No "Enterprise" in nav — enterprise is a pricing tier, not a product +- Maximum 6 nav items excluding auth CTAs + +### Hero section + +**Eyebrow:** `Authentication infrastructure for AI-era applications` + +**Headline:** + +``` +Auth used to be one problem. +AI made it two. +``` + +**Body copy:** + +> Your app needs to authenticate the people and agents connecting to it. Your AI agents need to authenticate to the external services they connect to. These are fundamentally different problems. Scalekit solves both. + +**Diagram:** The Inbound/Outbound architecture diagram sits directly below the copy — it explains the entire product in 10 seconds without words. + +### Two doors (below diagram) + +**Door 1 — Agent Auth (full-width primary card, purple border)** + +- Label: `Outbound · Primary product` +- Headline: "Connect your agents to anything" +- Body: Token vault, delegated OAuth, auto-refresh. 100+ providers. Works with every major AI framework. +- Framework tags: LangChain · OpenAI · Anthropic · Vercel AI · Google ADK · Mastra +- Code snippet (Node.js): `scalekit.getToken({ provider: 'google', userId, scopes: ['gmail.send'] })` +- Primary CTA: "Quickstart: Agent Auth →" +- Secondary CTA: "View 100+ providers" + +**Door 2 — App Auth (slim secondary card, green border)** + +- Label: `Inbound · For your app` +- Headline: "Authenticate your app" +- Body: Full-stack login, organizations, RBAC, SSO, SCIM, MCP server security. +- CTA: "Quickstart: For Apps →" (right-aligned) + +### Below-fold sections (in scroll order) + +1. **Pricing** — tabbed (Agent Auth | App Auth), transparent numbers +2. **Security & Compliance** — four cards: certifications, data residency, reliability, token security +3. **Enterprise** — feature checklist (SSO, SCIM, admin portal, custom domain, audit logs, SLA, dedicated support) +4. **Developer Resources** — SDKs, REST API, AI coding assistant MCP callout with copy-paste config snippet +5. **Footer** — product / developer / company columns + compliance badge strip + +--- + +## Docs experience + +### Shared doc shell + +Both `/for-agents/` and `/for-apps/` use the same layout: + +- **Left sidebar:** Product switcher at top (toggles between For Agents ↔ For Apps), then product-specific nav tree +- **Main content:** Breadcrumb, H1, intro paragraph, content +- **Right column:** Table of contents + persistent "For AI assistants → docs.scalekit.com" widget with MCP config snippet + +### For Agents sidebar structure + +``` +Get started + Overview · Quickstart · How it works +Core concepts + Connected accounts · Token vault · Delegated OAuth · Token refresh +Frameworks + LangChain · OpenAI Agents SDK · Anthropic · Vercel AI · Google ADK · Mastra +Providers + Google (Gmail, Drive, Calendar) · Slack · Salesforce · HubSpot · Notion · +95 more +───────────────────────────── +Also using Scalekit for: → Authenticate your app +``` + +### For Apps sidebar structure + +``` +Get started + Overview · Quickstart +Full Stack Auth + Login & session · Organizations · RBAC & permissions · Social login · Magic links +Modular add-ons + SSO (SAML / OIDC) · SCIM provisioning · MCP Auth · API & M2M Auth +───────────────────────────── +Also building agents? → Connect your agents +``` + +### Cross-sell bridge + +Every sidebar has a persistent cross-sell prompt at the bottom pointing developers to the other product line. Developers building AI-powered B2B SaaS need both — this is the bridge. + +### Code examples + +All SDK code examples use the 4-language tab pattern: + +- Node.js (default) · Python · Go · Java +- Variable names follow CLAUDE.md NON-NEGOTIABLE conventions + +--- + +## Pricing design + +Single pricing section on the homepage with a tab toggle: + +**Tab 1 — Agent Auth** (purple) +| Tier | Price | Includes | +|------|-------|---------| +| Starter | $0 | 10 connected accounts · 5k tool calls/mo · 5 providers | +| Growth | Custom | 500 connected accounts · 100k tool calls/mo · 100+ providers · then per-unit | +| Enterprise | Custom | Unlimited · dedicated vault · custom residency · SLA | + +Overages: per connected account + per tool call + +**Tab 2 — App Auth** (green) +| Tier | Price | Includes | +|------|-------|---------| +| Starter | $0 | 1k MAUs · 3 MAOs · 0 SSO connections | +| Growth | Custom | 10k MAUs · 50 MAOs · 3 SSO connections · then per-unit | +| Enterprise | Custom | Unlimited MAUs/MAOs/SSO · custom domain · audit logs · SLA | + +Overages: per MAU + per MAO + per SSO connection + +**Metric definitions** appear below each table — these terms are not industry-standard and must be explained clearly. + +--- + +## docs.scalekit.com — agent-readable surface + +This is not a website. It is a programmatic API layer over the same content that powers `scalekit.com`. + +**Who uses it:** Cursor, Claude Code, GitHub Copilot, and any AI coding agent a developer uses to build with Scalekit. Humans never need to visit it directly. + +**Key surfaces:** + +`llms.txt` — the entry point. Product overview, SDK naming conventions, MCP server URL, and a page index. This is what LLMs read when they need context on Scalekit. + +`/mcp` — MCP server with four tools: `search`, `get_page`, `list_products`, `get_code_example`. Developers add this to their coding agent config with a single JSON snippet: + +```json +{ + "mcpServers": { + "scalekit-docs": { + "url": "https://docs.scalekit.com/mcp", + "type": "sse" + } + } +} +``` + +`/context/for-agents.md` and `/context/for-apps.md` — full product context in clean markdown. Designed to be dropped into an LLM context window directly. + +`/pages/**` — clean markdown mirror of all doc pages. No sidebars, no JavaScript, no images. Pure content for agent consumption. + +--- + +## Visual language + +| Element | Value | +| ----------------- | ----------------------------------------- | +| Background | `#0a0a0f` (near black) | +| Surface | `#0d0d14` / `#080810` | +| Border | `#1e293b` | +| Text primary | `#f1f5f9` | +| Text secondary | `#64748b` | +| Agent Auth accent | `#6366f1` (purple) | +| App Auth accent | `#10b981` (green) | +| Font | System UI / monospace for code and labels | +| Theme | Dark by default — signals developer-first | + +--- + +## What this is not + +- Not a marketing site with a blog, case studies, or testimonials +- Not a "request a demo" funnel — self-serve is primary +- Not a unified pricing model — each product line has its own unit economics +- Not a rebrand — this is a restructure of what already exists + +--- + +## Open questions for leadership alignment + +1. **Pricing numbers** — direction approved, specific tier pricing TBD +2. **Domain migration** — timeline for deprecating scalekit.com as marketing site +3. **docs.scalekit.com build** — MCP server and llms.txt are new infrastructure; who owns this? +4. **"For Agents" vs "For Apps" naming** — these are working titles; does leadership want to finalize these as the canonical product line names? +5. **Self-serve vs sales-led** — design assumes self-serve is primary CTA; confirm this holds for enterprise tier From 33ef6e4717f9522367ca215d04f74c6ddd5f2cba Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Thu, 26 Mar 2026 19:36:14 -0700 Subject: [PATCH 07/40] feat: add /redesign reference page for internal team review --- public/redesign/inbound-outbound.png | Bin 0 -> 299126 bytes src/pages/redesign.astro | 1749 ++++++++++++++++++++++++++ 2 files changed, 1749 insertions(+) create mode 100644 public/redesign/inbound-outbound.png create mode 100644 src/pages/redesign.astro diff --git a/public/redesign/inbound-outbound.png b/public/redesign/inbound-outbound.png new file mode 100644 index 0000000000000000000000000000000000000000..cc81952a37a274e06507670c8fc26e84f28fad72 GIT binary patch literal 299126 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¹LUh`W|kYiV%?lP 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%0DYl_XEs^>3z4mdfm6e6 zH}hlue{7q#N(h3wyDSSQ*36kU{kBgkJEWO!EKlM#ap2ObnXyd?ySOt`@BvR_**yuZ z+*+b~79XA1#cx{lwW{}^O^NN`%OBsvF>?ut$uYZne38jsXfl<#sThz{K05Y{{CF@>Oin~aHWq|OAjUC3MwFTU zR7G&vhw_0d{lzw4VMcz2W4%XI^dPqXT~iMf{vh<`0#+iMiF7)u#PuSBt99->CH)1~ z<=KZJ$Ns77Vt=r612-Xw6HX|tqbD<@MGJrcL*ripY7J?=dDQe@IEbVOog~uL0BE6{ ztL1uvqkEE?lx+2($yI{x)Z4h|?}0OV{3Gq#pfYZFXxFr4^aP3SF%7Rz&h^%5ix8WT zz8;53bNd6~O-UPEFf}&Br9(e~bTJNH1Za=1wYh!kwL6D~-5h#HveFN(HEOwr-xiG- zYv7gb_AM=3pP5j-u8}f2c<&Fl0?m7514$5*zy>hqL^(%+OSh$}1dbp?~4Y1%8e9$Og1<#FZ{)6Axs?(@`{msBD!gDbYS(fxfkE67`@v z8QV6X*1mTb29mKE7N+SI0Wn*E1uUopA9t9X@(UMQmgUSIetD2yG6{}Zs%@e@@8rKl z?0sLX>mEKJ8*D->6zXIlbg=55W0*;i9Roy!oVN=gpkcZ1%jEov5Q?Ks@xYm?zB$89 zq422lwXq>~qI3>-e46WV9kZDDysbeoTnem@%()&Ok!YGT^Pt;4?Y0jO1aQ@*vw2q0 z0=!svwhK$8ZZttg4Q3C#ue~NsiR40>4trtFDpCYDUq3w2(`U-&hO$IKe zC4aO*Q8(wnUSPPZ{t9yfKnfLN#$oNh4fbyIJ+dheg4hq7qc9~=)xNsOaI>t05QE_+ zxj5IbrxNI9pKB@Dfx*{1p|z{nnJ4qz9O?79oMaE5@`7h37Xx6ON42$rBB<>btv4tc zIeWb?T*-ksWK_7Z#UJ5~P{XB(NiY?aMfN2EX7i%lmWn2OX|AmDdO^&;z1o?qb}AFj ze!Ho%Q27im^!t8SQK_j+%U}%D|1(XMDD(-kKFWPm)CQT|4%*yO!@5y^=NVMG8@cqe zLJI=uGdDS-QGmX42akHo(h4$9$*zj?_#Qs?Ux~>t{#w;J|1?(VjaXnn6vIZ-kW%&H zQS*AtVlzT~h;6|?QUR&>K}Wf1BVKvgK6mV!xQd_OF+dV9 ziL#ak30`r50-YHY)Y@r!7M`955po&JX$DtUN1|lt*Rew_RbKn1k|XI9_%2N+)&R0n z2qS1h$&7}Rv{28Tfvr#UnR20PYg0#KCLz_8(_WLtTL6N-mzpg@q-C z-*t%=fIr=`2u@q^MJ$Qte!Vj=v~LN%MZXkcm{r+c9LS>*?BCAT0?A81s>1LT1Oj7` zImXG5KM>|$kiu`EY=#X<*moBRkzG|&l3DvMJ0oeQDE%x8yXqze`zX_PI(&5@SHi?s z6wQsF&CE$hUmFVq75cg2ah~<@@E5V@)0C07c#I_rp|s95lWIe}D{t`lz61lO-a z!Kzo?TrER_^0E6%OZd_AbUvyFA{g0p;SH0fj_R+^-d?`c)ckrBPDrxr|2976Fi>`u zor01w{IHGl7!%FQPxBytgfJ_mrxCAG%+GRJ=$n{o$Yeyx%!dyj90BaD#tSyO>+jR# z3(W-WrkapW0WQ`?V9wRa3nDlvxYeoP{Iq)>G!K&+Gv$x0Qxa#NGy(rgB3{eC^j7I& z&INg$9Qo&;osN@(`qCwT>A$I4@sQxC25XmqQLhYM#>Pmx=GGr=&5t5!0razB);m|4 zoGO#~C$IVUL?({_qg!h4tm8pt?4ShX&9Zt^bEk|hQ00GjEn^;(_iCZq18N`YXW(lR z=LxSYEfQke=P;1LpxF3cNVxGN)c?6d|_ld)Xk6n@N?bDeUlft!qTxEbgeS zxdE}2U-P>ONJ;HonyyO%Q3VQbR`c#jO(HxSdM}Pl+p@E>bwD`P6yr93X_FEyBja>l zhL>08$#5$Ktf`dDvvuBF(pXrB@&0S z`2?CP?5^N5Fy>9-5QxivoD;b?697IYf+BuN{C%_8+nX-gU=e8arolf+9~J*z4?nr?8=>W*Ki}XjFJr4OWs$bi4XH8tOS{v zy@%0Urs4Ma>Jv{;i!owl*|4&+x~G_mlfj!U_QLxTtm*15K7axDvk_#%dx=Wv4VFR(UjnPNClCtr;;0 zRQIYZ?%2x*UE{-lHwS;7g-MZykQ?aU2gp5p)HIanc050mP& zdh6&$khz-BX^s5mBESULlU;uKw&wF|bP)$m$^wC8`UNK-EGa}g@q4WJ1uWJ$_v6w!R`*Dtu^!zHwZ4b*J`GX6CIuScPduQH`$S{_o;`~OB`u$G` zCE}qz{H)NG^QKBNy@!JyuayII%Zzv{ve7yWq~DtaHIV>4XFdP|18Q_AA-F4C{>PtI zPJ)~p%KMXFS$bFoc@ttgySf-_7%d7@@Htxi;xtkog0DoWCr8u!ps0Car^CcRX^uq zLpEBQLFX2J7q(Jgrk8Nnq4|~Q+eXB7*>LZB5q8dnH_Lw69y8p!rITrFHB>m;KY(KE zQ^H{lv#0HUYU%%x6c5v3NZRG~jntm$#)ilbRFUkB*bIHN0N5=a6Pu#lGC!}bkPRBV zGh;7%E&S<6wnc@7M*+~yP=d{r@fH9lr_Va@USynVlC{jk(7OUR@;95s9C)}|{z^mt zNL`-{32T!k@-ZY!?K0bwoxzd zNia5`_s}o`Ocw35oo?-;>#mE;vg! zrW~v@52q9!HXHeBS?tM6a9Tzb)Y ziZj2?pRWG=;fgl3-%mkUM#}wA(NT>;$S+Fuir%Gu?%$@7QPs{Gr* zE;Ch#W`PSOtoAt}yL}9{pS@+_`>z^^Q?`-Po(SOY<|oH#&I9ISiU`#*w3&&y5chvr zm8k(#MJ1)(ySRA0P+Pw)8{6yF+RpA}XyDay)LozGN^n6BJToNgleyemi8=A}9S1_TS4GFxw#=GnFf!g16sESux zv1!j3`{RNKGli$?Pqz3GsV0uQpZHSJvt3lhuH&vxE0l_rQlG6YZbSyzT;{m{J<#)y zmo%47Gb&RJ#>T-agOC+f$wzOSVJeVPr<$%~2qZQ6{a8mmw=4&|tkT2sQna>o^@E{B z153^Di1t8{yuRP9tfqv+Cyf6zr~i5g^_BuEZugvj1v|Pv8?5%#OxooOASWdS&0}S9 z4$0+|91VUnR~0?MDe?(p7ZaOb@VyOW`lQiW5}rl_6dz?|WN=R%K$$r|gHJ!&=&}?g zh+l15blP#%07FWr>@hZ;yH57Jy+7yEx*DUP!0$Wi=6V3kStA?*P4cNV{m#)fk(0~N zaC7jizlq6)97RlgntD3_%>XuTM|J%M7q46iL1W&Q1`~e<`iN#}qp$b8`I{7b!qzy% zU55iKshbrAVbXW?ELtxz?5%x4ijI9ehS=6|YFZGM{bCGQoho7=cIJ>V-UYZ>|80Z_ zmyiV_w%Xh2nRG7;9DGL7&mS@*=JI@C!#k)gD;uuUJb7}z{rquyz?C#?rdsJ_>S}iQue_F&KEz)JZI9@=7U>s`U$GA++2Pr^Lr?Un zqizj9ultXM`n}=X;6q zJ9u0L{^&GJH1O;#3w3wm4?mrfM>JO_Xj~HkTGVuhrW-dG82t|@!J8sM#05K{^Q9%Euyoj zcTnB9@Jzm#jt8wRM@`>VJ-xMSJU(V6CYrN+mw5VgEGy7ClIYh%HD1(`XDsy^`1#}# zd#xxt9iRozcH!dohn4e0hj=1urvAZChCW7&qA{7LXlNqTd3v+GHnzNbdzggo6VGhr zF0jGZEz`3}_sVu}V%uh`Jy>8aN^2^M--Z!HWULRM~4t%7kW^yPF0=lsVc(nez6=cg72-1 z+rZLbj7_uRLW|v6fpwC7XAPWEuD$rhi~Da%QTdmWUjU`uyyk948pl8j+gP!cJS<)p zrI@B~j2Bwy55P?gk7r5Xfi?tF@_I?hc4{MO*ee0|_)Q|eebrM=%}N0WC36h)S3Whl zo^uY{5Bk;WoHCwrzo;3|;b&}sJ`cRnNd6yX^wunU=y5_6{{bjisl-TW&1D$jX_(Wn0HT}2K6C0W{ zCe0a8(Pz7hj3bBTpQV9Lyqr}6pvZbqQYZVn9{6`p06aG+htPW>kplJi4T{T+2AZW5 zv0mq!YZ`V&zHz_PO=sV_x*E^vLwgXs>PmdG6=m17R=srBJTO%R7zp_%z2pc@Tp{e^ zVh)S?uJ;BSZpJ@Xnt(rL-S_qPeOzYudt_j!m8L{(lcXp_oc?*}bvlEiKP15wI zwRfQRd)Ul%B;Z_4%Y2LUJd||2ILeC4$Wq85MaQ4MSFie4Zo_d|SvV?N#P?=8@bC?< zLzWR=MJd&2zQ?K=3(zwv*+2($u+1AP;!5Amof|qt{ty)+S*y8r(^gX!RYoXsFHpl; zC5^)2eT7H3rsBWbn;dcEj3}Uk@_6aB({=p`|LVF9U0kZc^JP|pO6#}j`A?07g3T=~ zc9V#hW*_Efu8^|wMU^IekNADe1V-dhP7+gO>D$KDS4Y# zh})}!wY{4eJA1I2KDONVDws`7cId(%xz;cs7^xdIiay^GTjZ+X4o7QEslH232ggx9Id^~w=xt2uSO!=Aje8~V#No<>Q+)M%ZluU z!JV}PAodw2kgN09od&qgrQx&jp6U7r+|Db&z9{?-?qON@)80rNs-26MJiySvKcf5V z({zYniBgn@r;W3IKR{&d-Rm8ITv0LY5meP*#NJu>wkj0mVmjpJ+HuX8!LgKpp`bY6 z)DUm{uZaTww6An^9n*O$IQUpf#BlPp;y+VTkknYN=>v1;3SrqTK6_sA*8^eI0hZF_ z;UoC)GUN1*k`KtCWD_kva;sxEliK=B!}+)Z3zN+zWtfAoc=-)_4rR2F)I=XFrr%OM z?dDxxUx}(t-)T5`csky#jE(mo{2jGv72j-{i6!Euw%_~N1yj<}$Qyv(yeS2y zmti8Gb07G~0GyV8#WMgFsD}(pvFCT(d<9Hjc^6BjfbF3lMEN=r(2{<^N=&oKa# zPjEu9<}}?8vDhC!#&B-1a%+5w1J;Smq86}PYb|K_F068VdI;b1IKkXFsn$bX_UK4q zhoyY7ZHx9O{?!Qdy2d&_EgITtZ~ClxslU79$c16g2aUf1FJ#2*%?8iBLqhC+r-8>- zg6qBZ&-P#W2dwB){9;*%*+D;6_FBB|ZzuFWjFRE^@6f*V)5wc3<7^-e_TRg5e*bnm z*}ADLCd%t>?nzbfT~2t*H-RAo_yCnBsaz&@suI_YfyZ0Wl+@J4Cu9{@T{i$Lq2X2n z&pc7Xjw#zSO#1kdjv>u|+!_2FNfj5hfAE^_MlLAJ%UZ`{lO<-5!`P)kaw1g4D*EpE zE`wpoZfcdWsUjT}EQc%tJ0zsU)7!@!6V)2I5pA=1>PPrLBW)Xf9rzoAE<_2Rc{4mN zHPMhceii)-9P|uwe|hmFro&IDyg^SkG=3O4@Bw=t%ka|!5u%urgF*zA?TazOVq$Y2 z+KsX+GsU-9U^WOYgw-R&X@ILLfBB-Rwy58>VjQdyM$(5o?>5Rsu!(_sY&lC%Qqj$f z9E1u?jNOeOGpWWCzaTEh#Gd`?vnN1_NFk~%Dsr@WIfTNL?bGOnUhoeg|7XZ2c}e$5 zTRW7S&Q}+~QmxW+K-&A(;H4I91~1;|5oUyRx5&`cr>L`uZz{TT->}j@yIOR4oX#r+ z0R5BZ4ihe+pfF~o=!7tGRtL`nRSlCqI%b#NpJ9+FdNw&jS1#Xv3Wl!&GSc~0XMIQ7 z(~#OAc+rCGhsfh_^e-Eiaz^oRELePq?O@QsN#r&9>=whN@WC8K_N@cAC=(Ck3*~I# z3cN-(Eq!IpugT^_33n+Q6f`(z@~} z3ifh=Z)&9FDXB{w4mD2sRcLmqKIQ})v$sH=auZb{)RYGmo^Q={TIT}seFGH`K4{FY zR4&bz&wN3AcF=;RqgOWBlY;_y!QGU*wp)KYK5l~VO0>um(7OU8zso`xz!h_0dcx%V zu}nJn;v;nTwB@P|=t|#~8YZ|i5}T5!37I`sAHJ z2V|PJugSKg2_NpCNbtAA1oY@sFqAhsz}K@F2ewL!VNs?3ZP#6&7gMn1*85zG+OPDjw0R5yJ5rgj_#8*xysRlw%6^on<<`=qfI8Y*dDg8_j>z z-p@N|DjlD`w`jXmHkY}?B%VGt+8Bq-Z+uX`z4*S=@r4tgth~)NZnDj;XW`AtT(Wjt z&BuMNsSTF}dj?^~$<5aybwn+j&4H)&IM6IHLWgC69f?kr*Xu$FYKS-#yBDi7@u_=H%$AH{?tXBEhdalU$dc2Q$6vvD*x#D}O}!*3XkSG_vnvQC+^TSo z^^E3ZP5ssL5IeOTpaGDv-kau|m~};^bB%T<6zy*mmo`6+nokA3YbSdhg1b?wyX=EX z0{da$Tk5b@{W|;oqJo?@zXDzX%l9hrxXD%~_9m+v8xLBr#ruwU2#1;+N_Bv1-hCG; z399rmBJYMt?qVu5kZX#)UJ?}P)rCE5egK?-rzvuPDF-WS4X|gfT}#BMZJT<1A*Srpm5SP$Iy$L*eJZGmz+aFf=VOl0~gAz-V1dDDEWvQuS) zF%_bVEN@sJBU7c`wT1cb@*O^qrOhA(>cYS#$>QCa`h*Wvl)Aj)M>{xmZgA5@H(VW5 zVPT}3>!VJOdV4%f%oeRSUyxKg5nX#VB~H{aaxXM#(92?o-Cc zlF}{^YK=MC6ChOi$F2YKAk2&;ab0sCNj19It!(?XPM-d+u7e9{58!_0o}bR__xhC@ zr!PQfN?-mc^q%exDp5^3?VTX40!`5rQE?~hXe}i}NxfahkW{tK0&^n#_>KyYjq3{R z3rwbh04o-(+*3a*K2G2kTwt8VLKzvqk>WZWJ-_zTw^x)3oHm#*AH=_~F#qCs z-s@FEa4`5d7hJFO_3l#q`>m}cu$AX^vK1TZgSXUdVM2q1OJOE~x##iQC-)~_iNhOj z3n!UwEgE1=lcg8Zu*eHFgU-`lKQArBxaup!;j_ni0^0I66xFjf{yT+}_a!b%w7x}j zGwCaMKk3z+X*_1{lvI@xzs=}x^7!FvKV4U&1q8J@PDH@Xttrj+WIsW!)J){H}`*;QkMkw zQsjf?EPBM%=1Ro(@IdJ1^)|^1*oXTo%lgxe~q;@L!{tJ)C*CXUoH9H9)ofFjxM-Q!~4$TiiJ{A zO`L`5>PV3gM{TYRcO={Y#8zuC&thvAYA*pBJK#@ZpmcO}6W=@((@BSXF>`6t;7{G($+Y2$ z&5yXuRZaKyHf}mP?bHA0`_EUUMIH|;jtW~TU@G&2H0o^U-{kVmS8J?o;4$jl)QWOu zmr|E4`>zWB;eI4NVPk!M- z_36<(F&(1=^ojHdE%q^K^F4cG)ERmt=mt6w)uOEQqH~846*`l;ay64?gMMl6T`VE# z&)C}1_05VAe+YXH-@<~vm<{##^c{UiM^SL8bB*g3D;qm&Ij~PpNih!GDk-K3j)E2P z{KsYWWJhk+YH_kSoj?LpO`pd57N%fkO2WdA3dXWr2NSAc`^km+CdYk4hssrTr=_!? z{>*}dzLtgF4ZYJMwP25+{q7AQKK(WEW5MF#D@N}I$9th1n4DaYO))!<9Z^LU=WB2Q zKZp{|H)As7e44*cT^a$FwLvTT;%zR`=;z}+k*B;W8&QC^F*ELofF>LG1G-3By? z1Np$sjo;^$1Z*}R+|?~@;N#H;a_ddW9IjAM|@G14?1#dERQ$3rFg@>DT4^wOI& zI$E_Vx1U2?$!AjGmY{a~kHV6{N)~h#Zi&mCdxr zFDshg=k}zuh$%zh@ux~BRc@PyI)iM6TCuA4Ph;9k4tK8(Q8#xj?M^jjb2D^6bJfq= zW*A#KMAt+NPiC8Z)P)A=N}0aS|ceOn_=&4ouB9!JzI`x>ig?CBOB|&M^l+Jx7n!(oAO9pG>q0 z^$wtZZshbvl7gW%M$OSNPVD^WHGjaA>7+l_c1C_ms>jfBN&das^|x=|*3{OLH=N|z z@msgN_a2lPD=I6qon+I&y)!GrDj55EwQ(!H+9~T6V`{dx-@O!+>{3_iKs~3_3yaOS zZl7l@WeA$cQxKR3ZluJ-YgQwFNHu>yK}j}-rTq2!EG_KP>Wi)QRbhq?03uKj%cZFFB70b4Py7P7W{eL03{P z4OPEOc)hto^@E$dT`ca9>KrG+rT9*f8*es4u!l~L-t*_716fbWCPE%+8yW)Cp*L^d zlCJ$IRs2?=AIf#(tSX9FKN;^|td8(ld^j;#X1iCdWxx#by7Zdze}E9tyq<7? zh%Ak71ujsPYR!0hjf=mpzpyx=cr!ao9F$!xbW|_C@-q2&_wc9|9`lL5j*Cn67wMRh zZ&Fb!MQV2PXDVtgb~bPSKI`O>KpEjQ zL}Pd$F!WdbMYd*#e)1&(!>>d$7S$Hz=fbr8$&%^f$3(@~9+#6XO4JiM=sMPZd#Or*deaCD2;XKiI!mi%w~{ zIV;yEYsF`3U?pC{#|8X`GS=1P=;9RMW_R?w|MKG6yuSOrjkuw-c8LRsqZQKBxtbh1 zI`&wMQKg1*AUS_>=bbXS!GV6gGuJ>*%Im@uMe~OE#Hr7f;ik^hu|oKM^kOWZ`)g}< z8Jh#^*Q^~OFZ&)dS)_;iiyfZ4chtj~+)F5(=akr)SA*Uwfqif`zfi#64I$u0ZhLHs z?8j}VuP2*>M7X~sV{3XV9t0A>CJmq~Z5G#fKq;JC{I(UV-Sn$D#t{X-V+thO&zO@^ z2z4(yT`}s|J8`Dy$Idi(5%t(qvW7PKnQ=8gX}Jn1-gN=S+)R$)@Zdk_2Lp7Kjt^OCp_dI36M~n4$t-#f>c6 zia{P4Dc?%spgLLe=DdI{t3ew|Jos_W-KS~hYX?5_FOA0|bq#K)W-X#!Q;SUBqQAY| z(mk@!HM&odnaKS?r^_K zhN$yG)I|k~t^FG3dat7$2~YEQ3m4|Vl?#AwVr9lGo_vAQc}GE(P1A_Y3?iK#`jiLu z?_xn!C_Mwv?@d0+gfJ(8W#tEJ&Xl(nR5qNa7{8^d0!t+C7me~5TeB z%xY(5HNl^njEG^RjM>v9(qSV{yWs9bbG$K!XRh{_8SE8`4_Zx)c5#$|0Z85gz>(WW zg`g8j8t$m+>OP*H78&2qPty=@I&iKN zFru;NE4NePGuPDeX4MZfSTOt51kt6R0WoP9oE4b$AArY*x#&jCw!*`%j~@LFzjRH8 zFSWf)x+g&%xsUreq12IfKerND#?$-jq4dDf5}%7<>V*Dvp?`j#2!;0>bn1IqMlBld zt}0mZ9UaE;uW(!zKxNVbE?d9=hLkqmCPD1T`^=@xA{v*C?-ny<7^b1Kn@ zM;OW^edW{hMw|4A0<~WyG2UHd$yXR@A=Jci+R+5IwWw$GpVHFqIk3n{4v86uD3~I= z_|JCp(#^TFS$Ml7CGn!lI?0%n{#<;?5c*GSS#mNm^7^rwojfj#BWmw)Kl@JH2fmh- z?p?Wmi^`hgObxmLSEJmTyuPwW`rME3WGdd@dh?g8Y|l^y`=Ba7x3Z{BQ19ljxt6Y$ zTIMHbx8}!`v&;$&;ve?sP*!jg@Kt@D9ZEin+TX_5C`*f+QjGN|#p+{5F$e+;YGmYZ zzLhQ~rP%;=xo>Ee|!EQ5In+LA){>Iq^T#eXjt*nmYFA%d7V<>hMrvcjI~+xrV z9Iz=7HCNx$hW4eUq4fN`2$*Avkh1)*Amnj@XIlJ!7Z@eEGJ7CMaR{Z6g%-Vwqp-~xkd4p zBz~K-UoOZbP;3^;?6*EDpXUiiSiCEVOT*V~6ksmdsr!v6>W`=yzY(bYd@ZCH-4WE5 zaVaQ^lwn_#mG2WzPdT}}292IzEva1Nm5UR5j$>0-pnQbhmp>O5h&3pz*SmVfeSUg^ zT$Ku~gTGmI78ir}^;z_9826dGX5H37j`B3!7ms4n_~a6( zJ^=Yd;DMbqdC`yGy7830HPl5=TMq2F(AjzPl-}m!+tzbc+NMA@p#XLRpaFd~lSR(l zVgT#<3a;f4`cM1y$^_$8_!mi^uoZ0+R-J_HW!t!Ta-+#{_xT!;Am-1P7pSj#bLK!b z#9nOC&~IIduC{L=AO#A%yg|X&#P)_cL zILP2HYE3mR#nBgE>GzO-(7lp?t#k*e=7)X7~${ZG59q$UG z1Sz^A<{L@6j(Gd!o=_Tc3`{oCGrm8tCwPhNF}XcQFi7Vs-6=1v?h#`@N}4@ENSew_ zSEinCSQI8kV$}2?857@KHOY}`YlcT2Dwc-KXcV-rra0`}?i);c8}Bh1OhXC6>TqL! zuuo%CGiG99Y;S6e7(J|He>t0na7XnP%ZqxSFoZ(NkVL$$r0_h8m}-cC%e*IbG(xy! z*@}2%YoQ6%DK0EJ>q&$=ckWx_DB0}CxgQD>CF`!{EpI(w67fgu4RS}sB=ZMaFk1Yf zN|2LGk!LB6-0up80NS{yJ}*6i%2rA`-daDA{o{S7$%3=>pA z-y|HQObs>9Rp*{R()c5qr5#LHGj~VNuaB9!6&{N|<~4TD!S_356xd;7QHuQTx}6*r zCe_p52Whawe5Rb7JXCP7u5NR}sdF#~Qd_E?gX(@Xn27YJ6c$;`JcEAj@=a{K#Ab=` zF}@$`zVT(9*CK7~lcB3<%}YFmEgnU4eb1C(jJOuI&HmcXQ3cf6+FWV(r+D%cZJF_D z#v3DO=sQT&evqM8E5Q7<3SdZA%kS)y=1ERuNA6?CwbFNJBaIU|?Fv!Dt3M zOJ|f4iFw)CdVw+3uZRHCld0P$x#)!DfxvOt$A(~TR?E!nS)e{559MzB#ct572=JB} zzsTWEw)KjE7U&~<&Vx2bf)!Ls>O5RbjhqK~{^?8y--mEy3CV?c*ZtF)3~yq(s+oIg zhCh3$_^$TMmSo|PSklvbIZ}_wWu?QHiI~dWMiOJ*#R=7wNpT8!=u8m{uqlx&`hQH& zw>NcX^cQf+@lnCHeMEOeh_y#-^nx}k-#MMh%on|jhME#G=%y;4B>e>ZZmoHh z@y8K9W`qGq;N#hLqTqPSko4DQb_*(rpXiT&EpQ}ySe7QW(`WLGvE+_0rD@n`Ij$Wt?b`)LLg~A)Zu#=asm6+ zJqn4R5>Z#vo>o?W`R<$7Q!Nf+?+;vI#riC{7rl?1cfKFd}Fn-u3dbY9-S#Kz&E&VZ*d-tz;b)9GP{BQWn}c;&t)t8L8Xeyk!&lB z7FYY2jG@N4(2oeqW|6G5M7gf)w%U z?CX1XEtY-F9G|^6CAIpE(Ub8s>R4{6-iOrDwR0(>hmA5i3RJE!oi*F`*1cNK#bZ}r zegY@|n#g3N7hWhom6P+`FY+0tp`J=)^7pX4g!^Fa+b!-uTWe29veCTi;Nm#=YfnMW z<5%UnKi#~B9T!-~l~kPMDx)MpAp8d9FzS*f@!Mk2D;*Kf zd@o4xq!O5uY5=S0K>X2!`~UZ{s1cIV(zRcoFlCe{d%kjBkjGL8iOwRYLC0RxFhI`c zh%YD_GWt9Rj01IUom%%R>SsHU6HvHX=qihh4;dFS&$iebVIv@XKS!wzB~x^K)ajx0 zoar47Xz!qhgAqsj#waFGZ)m!$&k<Qk@(euP?njg;aO=)h)6b)~ET;P(OjUnbi(n zmbudXa+@x>mI3X3CWLW>N5?mZc@Bzu%DC4rfsE=ZWkUm1o(GbPDhTq7*C~d%ji@I5 zU=^2R?@0We^VMKxoTdJ#fjc9fBFio{K50#*>6W6IDowcBRlVith{PF%Mf~9i}8xM13d8U{tAPdz-U&p@;j6!CXcnpwau5Hqf6acw#JLCfO|K z=eiNmqQDfA#I$!I*B@p#BNDPR<_wp;QvSD^{?S>bkRwGNwf9m4^XdacOTU0ZfpX-F zXB-?}yX}P_6P?Fi9vaLiTVMC+s@1()Hhlw@jga$kj3#%fElodKxh_*@HK;1mEsbt} zY%dO%Q&cW=CPe@JRq_gUbRXp&$h+}u`0=Fn>2B(FhZGMTQeN(;a*5zUmU4_PjZ@7~ zy-P|9`uow$n?@dUneR>O&KZ-7Y)fLEZ zY*l&mZ+7_ae|hGEoMG}NKF)rBw@4ND>k}&6!eEedX+?cq?hpS#l8$+JsKJ}>%Auz_ zdncig-qKKvKAf{8UopbuO0twePb%s+f}2y3kDdxU!7Ln@b!%bgh{}u&nIJfeuh%-Od~l|yd|)06LT>OvicqkyQQ;FW4*MW$;cG_|G(~!(2(BL5{NsD%Z@Dh zjmqoiM142fpH@g|RFv5dITeIt95Tnbm%76|u!`f!`}&%E?%R&FKAXMA@4=>wpp1RkI~=+llquF7bm(QTrM;QdGmWrQaC3KAR2gMqMCzkI zreCb~d17Cx;LY?qc4Yw)!XQOa?@<5*EWij~VYIuxc*(oFVAA^1zjh5u1^M&>LZZ6F zXXO)nG4681JQAI)`O$!}nHfq(x?S4YJi zC0Pdx8r*{uAOwdH+#!Sz2np`)?(Xgc0*wpIs1kQDXbXYabdJRqF15i17`xGvS*fG&eJDUI55iloo&VtNRcxN z|IyJrd=1MlN1Cx}-cg)eSDp1;-zq>T>dGU)AC z+-xOa`2RWczpqU6kxmq@)4K1!y#Tal<il99oM1Du4pDAF?Wp>jki2+y2v59Bw7 zB^?P%X~!;O{R6+CyornMm{M2gv-8|b6n8_iN6ztgKeWg~Fbz3_`G+U&jeS2-1|CL) z0~h{Ryqr{nxs$pkFr~MwBQ(g@cV?Aa+M(32uQ5XUL`=z?G=vquG$`F8?z45`3^#@O zN0R;u&1F-1Kj2y?vvB%5Ez{A&nX$UXW)-LbA$5Hc&%!(UP84ko%fY`H{#1YrErB|m=r+#%dXRoiPG9vW-% znZlrCMZg~Wg(eOxguds6B?;+zn-xZwKWahi^CrWMX9}Apk2L}6jK2A!8Qb9^>az_7 z>7s4{&?gszVpg|NVVL~QLhNS^mj5GcP%R>AK~KsBT#_c#C4JnOC%s#qiT6l=g3Wzc z(&@Y0wMH&Mnqxtn%yX=8{2GOG?kN0mI+x}@!1AwV(6ptTm4@uW!p z&Gr>Q!X@C}Us8s(>Dnwlxb(wL8XE;2E1{x8hgCY(_%qBaEsE@eS^?0xq?P+fh|lgU z4j-QYDOgdk6i=YgHIDLGFExTGA6xr_)haVG^;+5_E`Bep4a*MyDoj*Hrl?e{?&H(F zt8d~hx^T}r$n8-xC4D(>t?puSGxuWco^mMapkipk_loP*_xXxTMn=Ba^{N)_-|2~e zeAHvOcCYNs>`Pgf?OX6x8z2HwPFZ&H*>gB!)I;5OtBN0s2y(22GDadPzcWERMD}M_3xTaE`nKi< zA;0Z{o?@c`UDsR!qey-H$%H(fhq=Rkt&B4QXO1QFO!0_$44VSm1!+Kn&b?DlFbC@Fl ze1aK~3Y8Qo5B#t1TMscnPE<;D;Y-tScZ#gDDsb8ZDA)Rvra9DQ%n3{06R(Xlbp8czW;R@H0sABRYcKB=;y53{AeOw@=h{d`|Q1trPHC+Sm8u$l$-xTY#WmB zEiR`&Zf{DZ z!gH=+v59ZO*m3dw8Cf7bVU`x(h%k z5YM^Y z?pTNyRf}fZ1uWczYuzd6opC=A&Z!VKJLuBpt$(hrZi}%lMZjv9f5WAJ&SjZiAu;(2 z(Q#rlgEDa+mMUTy@pJkWsO}*)d|Q#gfJ6AI+qs2Ev$3SNDix|G!!Y}8N5=t^vX;{>hlnmecMgq& z@ksqiwf%?+W6z6|?|1e@`5*u|uR!=hM(VX8kM#+m2&FbVYdEOYpv?_R!cN14YmLw&+FfII$Bz#1|D+2 zd#Bxa)IP_EJ^Ts9@893Bu*mT{AHD&$xB^^GmSw!WyrQFPrv@MJ+Sb+@d=4F17lcH0|z`cEb*Nk&G;Nx8|qzmosGN%{BwClyeQ2;7Wa zRf>!VJ5Mgd4{gdmETJ=*CJWv7ZsXaKlTf@Hi>Jx6o-qrLM0?6P#5*N?u#KV8ac?Rg zddShnvUI2ex)CPj7jF#xpow!CEOop7qS?)sk;h7ofAP?v5lP zKCN2zeFU5qvv19ps*T5(TSG_X&R20-s59?d;Do|34WApew`a!vS@p15T9X!T*~(7s z%6wq=^j-tLz@K}$ydmUYxgcuMl4}Z}zzDZu;b146_Zv*6rJ9Wba7jhdh^HfHsQyHt z4-XqM*7(2k4JkZagwMT$;Kg*cp!@cU*AQy}qMGV3g^gBfV)(>2#=w%Zh@m6KgmH6w zhXJXw-PG){d>L`cK4#~;3{G=nODuVobb;~?V8qeY+c4uqwrv;Y%#r?V(vOgP`jWu3G|dL5xP^ipp&pW0vNGw0MajL zIYw*b&y;zxH0Pq@OusnZLg+0s;S3Tt?g*28>F=UzNksm*8c~x z>|%iF56)6F!ax36!?n{bKeR>)RIBQrou@LW$$@2mvkgS}=MT*Y%9xEa8uf82woURj zjn|)-+Dx;Km)oSL1!@z(4Qo_CzWum(kgXVgLI`#0_S;sAi34_(Ysw=?n~wcww1DXx z21lX8k=PSiYVi!4o6Z%B?%$BGj3nxI$~s$^nI-GV-o>p?tkPGZRJo0v5#o}66Cu|H z40M-IhN0;yzuo1CsBCA8ku2$vm(D}N3k@|4r|2f$M?oMN?e&~dzTb`&VP$K-$?0Hq z0%Rs9|IW(Gd*i!$uD5poWyFB&8fI-6J&}ntVGr|{Q-)qdP02UF_9s15X0{xax8%Xh zRFxxUO+9oOIwojewEyH-<8RLP%0{?HrObHW8FT&G6Flpk{|LsLzG~ugb}1yi{>S4% z{{sw>23^o;6(~{8jDybY4?Pl%tSj|iFR4KLT0Vfyq5q&CP2s`oJ$Aj6AVfbR)}_de zkeC5kSs_j{QQZ{YCmNV~CsgnmSltHA;HZ_WbTZ_=A{SzhyKMnp0Nk1(; zy+#8PQt)?}CyX2qb(^pVoXQ{dz`udQceIr!YT>PzBM|m5kTP+Pii`RfS)kn@znRcG z931zsWh3f-N6K=3=3LK$Pb;(gsYSAM`OVE{bcN&laqAIF6}6dn4r4FhmMa{+QjvnU z8A%4g1}U3cujVzMZY9w`L|S(K7_UEkS+2Kca!LTB9l`Jwo6pxPWlU;3FD?c%VF*t)0d+6qR-)G5NAk4hYIke^^gS=%?fIF;NdU>#pI%B4UJeUoq=AM0;m!cyj6(AWM4^tE3G&Gn$nvct8*8h%oI zY&_gv70s-|_-xZtQ&YQaE6&=~EggUV923>9^|R}7!7QcCGFHL(BkpZ+|Y{jVm z7>d1Z9e4>|QqDQE?JWm-?z;I1tISEuP&1Dl410?{ucj80XiSwCwWa=b-kxl^9Mj-b?sqanikX<tah>SG?i0nw(*^xY0DFHmN z1wqo&wajOl6HC=wzNwVyAOnv3ZUjhK`P|(vcH?a~%55sOe8&hJZu9Y+Co@8~v)Jx5 zu1^H045ee^iWFIs5RkEkMJPN~Fe!wY_4T!+|BrKp#fr`$#9<_dOvii(9s~*P;JsBp zF7ja2!^Bc%^8ISNeN>AxRg^1hNL1)uI9)WcyRT3QLS z#CFpOilut%G_<2G+)0@Z498)e%kY+pF{N)AD*NqHn6Dg{n+QE;ZH!?!+?xuPX}tH5 zN&<0yBf(RAExJ6MlYr$9K zOPHFaGu=L}c^zq+&s7I&InLpyaJmP)my!8l%+#J(nB^&@;@zUs=g3-p@iS>yRhKQn z_vuKg>AHC2>{MD{Xmr*82sF6r4pC-)cG?77>`OpLj8HDQOxl_5u_yxk){?_DSN@Oc z;I!5Gs%d9`C>>skCAhtLky>nf6f4z0TxA68W z)9T+~w~pEvI2Clm+spLz=OZ%a(0G(~B|BR@&=We8`&F3Dc084K$PW5Z^~6b&2<>X+ z*%skrt^1i8=TQc9x5pj*4F`vq>JDg^Pv;BoKCs$3)X3CW_TI&sx>fqaV4u44)I?Ml zsEdK-;lV?BB6#=Xo7T?B-R!?q+`sV>od+m(tHV1sKyRo(gM6=5aYc6653ri({XiLP zIhZ0NVXUH^3!acB%z(LBcOs4DNbX!@l_zGWF&>iZ1fm$t^A5a)pPN+19T2wZLSlj*e2w3R8vRYWFn|;vbIrFY*(^y1MP<%U^i0s|0 zFPC_azClb!(>MJe4kXNrD|ME%uRqv)Lx)aI-f<^uqXI6Gf|0tz1BHb=KN*O7-NM89 z(q@o9y>4Jeg3rfjNPz6% z2r*(H&EFVV+y&F@N`p>>D~&ZXB?WYcCUF?UP>9-q1_@c{OHATnED3rg_waQ zHNzKA{wgpJR?+`A?F$1Szl3qm(1W`$BXScr6p;h@1C@SC9 zu?XJ^p7Dd++!^oMn3ejRD3q(}A1?V$s%-G5fW7DIx1_02<;xNh62JnpmSTg`38$9= z@|1j!zpC~bu~i(}1Sr4x#CS4@)Rb!WxgQKWsyN^Y7$F|=!98h*!=|tAXp%hEj$bMZ z!89&Pt{R3>od>9P0Y1a|L_OlnT6V<4&UfF`pJvvD zTOMxapX(fp{f&gWS9Dpvrc6&O3ISrBem>qi;1-+2w-_%?Mm?|$9{fGHhdO;v3m*4H zjG*mp7S7K*fxZc^HzL-wqjjqauTMnYF08sV*ly)vSi7dra8RzSm&;im%r_-CousoG zevFBmq7BKMT!Z;prFhI_3~IkDd6K-fSZkTCHJ^!S;5!g#vR$i}SbMh19QAT72csXq zTST3z+yPG)RogvhoTpo)p$X*`SjdYZg_*umI$4k9L4gEqq+i;czI*>po$LD7 z>x9+oTyQbb1~lStScH{wdYFhXCT{89QXvw~r)1MP^d^Mc%gE3<kr?&|eB3--|D)KB{9|zYIn$eTuU>ns+sXX%#dP_rKYh_S>kxqK!u9 zaGiyJiSr;}clLZ3KmUSA!T3ydZCnOAdYX3I)Q1a@NYWllYTD7YqX+-70SxJqlEPssLN-IZyG$dE z&N`nQ4(PV?c}gb%RQ2wRPeL1UKLgDp_GD1Q<1^QEmTNx;+P!9UN4l*>pFe1EISKZJ zw&J}6!locO@4B<&F^?cn;Ri|KJ2!tLW00P)wPc&v&3QLlUS2IR;Wp}4bY#Mkqi|eF z!I$FiqM$c2xT~{{!R$~HhP8}@^KOhc$gE%@@5gAb_8TU5&+*WU(DjGU^wE^tuBzj{ zX>LM=Xl@goGLgl<&em5>1UPpZpwF-7S0ZPd+dKjC@#*P#-tkD5mqKBE4b}sg>K*2h z4^JY#{yxX5%J$AK=@SabjpwIRbv2UGA7wb7tpBsqM2hDB9iw#lP0$cDv{yEi{%qAb zK#;gqB_ud#2+%S=$gt9plui@081PF+{h}MYz*sy&@*}kGAaA%jU3b9C;;6_;M>S8m zYo7c!Qc7^c~|Ip4lGjB40902PjSueT`rK+~RibJr!3y4;HttgfIKzGNg3 z)W0M3N%5~zEu&zqnSuGwAKlK&co2LU)-C;2B zUdaj6c8jSy%xkfDacZlj#k`uzAmMfWyRLx;3qU)CJUOGkLGB7z9$m72IX>lyj(4*&}k4O^l4Ia;2^%cI(^0ffX_KyX2WXA z_s#?0Z=s{=8YUJq^w_^(+Vb@#d5_KY53B}@jqW90?|rjJA8!=Z8|-r*z!g}-B@=?> zHo%Fy0&Y8MWS1G67F3%f&yp7R=8=Z~Xgrdl!9@_-f1~F7CHK=wUg}c`=@;oXq-q*l zz)u2-5)IMNS1w*(xS~#oQ%ii_#EAJH1SxGEg@cm$6!fmN$r^dPfC~D$CGE93qLd`OOaq>LxdlybL zn_Nr^Ugi}S@O1JXb(rcn(H3ilz_2!Kd;*q2y3u7~O7C1)N{4Fl`3%&c2e77fmq8oJ zHEbK>2gLn0j|4krqdUT?Sst4;dc1*{t~6&9#64g+M1 zeXl^y2`n%5bXXf-jIYM-fJBb%mKS%l^w>9ZrV>@27dr0ow8}bSeSJUg)-|jN^T3fu z;tStha*<=?cb?p{`ND7tG5@0P`nC1SVCR#!(Yk*i_7c&Me^2NRms+PT$E|@cg=;9s z%#tmv7jSqdgfoA}0hfeqBmA`T)zU*=xKA%zl=-E>rDy^w*83mCs~mg$EbQzAG~cGa zY4AWbY)15=vtk=Bv}*gIFEvah^|C+07GKY2fF#bXl#?#ktya^Z+uTmhl)O!fOWcA< zky4~fXLg-pT7ra@lTxh$RON@H0yh8NbO?Z{Np(=Y3m5F(UD>4*hCpq+iYrA6?S>$r z9>ldJG&Nx%psoEuoU7!DUPH^)Vt`@B;~63$F;QDci_qJ?8gl6vvTt2uEO7(x>L-L; z>ou>7h)nkNy)c>ZyH5#Xl?M%UqeY`}H@uW#{dWyJ$8nlPadzLVRR<=fG!ThS(o3AG zDvoK!Hi^3Bl8%y_41TYj-(FW^oGAjfaC?g`vhptFuui~t)-=Iy1se$gw{gQ@&9by~ zdORW)^6p2*97p-^e%vqR+=9`@7KdwvMH(3yAK==?Cs(4QMIWgZ)>+1nuoz3i|5n3K zcpD?kWhoV{Ue#LM&YVGK1@C@O_uU=4?hOwsTb_N6qGoy78ink$l#lnr6<1}zCJCUE zLOr5Vnj~1-X&WCOr6wn_11kU%nOM`_v}}$)S~rSKjEoF8<5U~$TDYG?t2>OyEez8o z^y@oh6Vq75cvWvWx_kGp*vYk*jO&!Hi!-0oluqw<*meZGeO&Mr^q*_FHyW3Q?0UMc z7Q-JOc*K(dyTtX@vYs|5qLs%DEjQ|d5o+G5MP|w6{PH@R)bC}*P*y#I$rkvFh|AgA z!NVi7fueXpZ2BTE>E|71lB_T0s&~V(+O;t$1fv#@o~7>S`m3RV~Z4bZz$e zc2Mi{&X;Jal7tDuY{}u6S9xTzqu;occvU z(A3ZPp{`Ux^SQCY#gV}i3{_#<_pse3!~O`!7HF}oz5OrdNoWt@v95z<_PCK-&lA5; zr_k_%2w~&s>^f&Eo;Km#A3)McEV@X6er6;>4$0%zNC`AVi+`vh5YWs|!Ttv}OFxhG z(z|7WIsOQ5>AkC35Rw*vnBu&1sM}%mCgU!+D6%rWJ4yEc!?Ev4{pPoZ~Ml1nlNF+P&(dVwL(2Y z9Ye|MHVDl*_CH&~Pdbn|Gti-8lk-(H5z{NA;uNw5GGPR3PV4HQNHq+tR zwCC)pyMilQvtE?k_|iVjUTe4PtkfMD&z@zQYO_Tw8jXhkTy51NpG`0GlZW1suQaG` zrlI2r-|Q$h9aax9sCmO?Z$|QoVgb~FFZW+?(urn3|w^iagRt8th%S^8)f=kOFwEcs|=ctDDIo8cir!zkv>`9UMw#r6g z9*;Z^R0_m1e0Go-jip(oF5iiZ<9Lej|BCMJx8gZeuk|k-6X;g78BKN@`x6^ z*x{<)7@@1wVhd2CC<*Klzx>8^IrX(&M6TU&Y!;93!{p&pw7TsGWM)0?(aoeO&hN^w z!$GW5Zb6$xr1jp#e4#l}IClBPKgP)Zhc7&gdy&pj#0!_v4O5`l`28y^D?*ME%8xk>CVAM1vpsN-*>#@g{^WpX)Z%#{yk4Q=) zEIO_J6QNI|o0aunx#-`r7ABKoGqFm2FEdT#gtiPDly8369x|nScJpuE z-8=k_mi`4_O_AzlL-30xlar6F_!T|qbpxks=_Oxl93V!0#dCJl&XUs_A3~{sN`~2< zc9bCxgQKJIx9IJ0QrPn(3^t%~;Dv6-T@?l;=cm2Vj6#s*>xXx0Vy7YKP@2-Uwu|bi zclA0S%mYS~AIl>KZO1bM?_MQ+sy$T-M@Sx?R#Bt1o9vx?lv7MipRq9MuSyMQw)Q?G z;Y&(kjD3Kpm%bfO&?mz9InSb5Y|LXRrh0r_*eR)c;Dma;A|gU1z{&ZhO!UiiKpmJ$>qO%lvfEr!HO`8nxGLPZ6K1__vkWDhF1F$xK$*-?WmpmpN zw9+vY63-PshVTXs>iAO-U2j_H89BaW+S}d5QRp`~qWfKOo3YN~kvJpnnVgNp z&tG5cR0K3>WCH-N$ibz(pJTX7NCN=?8_!oMFF^R1hL~Gi%&opS+mGZVo_Pq}%h4@n zKef;*LSd2y-u#+C_E9Opt5w-*L<6?6JU-CX15?Gwm0Ib z1YIUzaNU?jd_=g+8{oe@m{W|$*7>1wRQTEJ=>Y6K=_g!meILx}G$@L)t6FmJinVvn zo5gK-?fK4&GRPlJ=%b3NC@3e$i+Ie--_Eb1RTyujA|Kz8>3!zSQ|;;SPUL{OdN2~w z+51MF7zzP;Z%?RFMKH|0zFqMA62d;Xgt;ABzzbkBl-B*72`48iq8z)-_pfY^zlXFR z8;~PR6ZpOk)j*$UFsW?C7?N~yM>9@P=w9aX z>4)HF7nU;`i39&2lt`l*hDq4CEC^fPT()?SnnvSI#vFxkN}ymAeLCJ>tW_WE+<_17 zQ;+p=yZstSrCsUBQ2L9gh&_G2S}GAw*$RQ>obiJtJaajXu-8tq;NzB)(0JFdf?9Bv zY(&qCgAa{^g`O8|?K;J4a8D1Dxzn(|35k%^?`Fo+Sq}2Rwt0r8q2ckdxnyu_J;AaA zFcC0P;Tw@S_o;N{l4mVmMCj&sbC@sWgpZ#$=M$J-m`O$kl@q6G&9>2^*aLgRj|B&v zIt1gm(0&c8vkmq>k6YmRvl6bbD{igwY3scPE?sQw6K&jMQ|t=A@)(hg%BS$^JZ(#_ ztBPe2d0ife-_pL!dcC=J+;fX=j7a#Qwx`pDkIr)6?@)-R04Y?5P;Q zpyL5ZIW-{l)-$F*@HE!(!_s$iqD8TPyAskjajHu6>&Nes8Wun!@loQ8ZwX-(_>ZDC zgWW@64w$|a-mnypsnWo^oecoA325!D*-Mqt3P4I&1r8) zuwE+MtRX{oelTRtPew6fud9P902NBPLEp}n2i-tN*g0{84;)h*{OgeOhl!mmwYa!Y zcPbBiGAz~0giZ1)meOrms!pCHCE>_mY;5Z;7jOo=gE1%_64bdeA5x?paI)U+@pEh_=zO1{P`7a ze&?SfY$?QUOX?>xbPtamk9DnQhZxRW{r7gtkVpa3!4liCr1mzCp}ccLqv^)T%I>Dz zX9{F2%A|%$HNW|tS}u(2@)Jg+*YKQ@2qK- z(!O$1J<+{PRpsvje&Oa{9QS zz%Grr)8Q(+Lir4%+TY-%TPtFE)B&iOd?C&JCqy05RmsO1ia|uVI^v z*v`E}9&kS*q>KDcCKh>^@)c$osPfAr*b{m>d-h>mSodg{6j%pD0x}c)#`)+j1ksLe zme{d>F^Gk9=Z3b`9ewzWfq`R&DE2MQ@!QeHVLIVj6$c0BFJIdXo)We7;r5z}Zg%8_ zR`+6!Qb?xN0&dWWCJNw8P}pG+n|QD{V?HNiSKv|iW$X{x-KxUO1fjFpMS}7rzF21z z2unrlQ-P6w)z~JjG)EQygDpf;f7V_S#;x@U!W;rf9mBP#?8atCb}|KQe`KD~5Auon zkScP*wQ*e4*UkO2p=>sZcoUGGkw}X!tQnM;ZD@S>GcsQjAdfBPIv5h2#<72+r5n){ z50k5eVo}a5epjUb8pjCuGCB8~tkI35b1Ooro$71Xh_kqOx{fP04YTf{JBx1WLBxGA z6a9!?Yj1;P8hx2&os#PrrT*l0uSf;Z|C}MrI}>5VDx#;9XWOXhV3;vsXD+42S(M9j z9Jz9_z4SAj5Pkw@$3vEg-fxA>%F-7!)_LzkM=mf=mWQwkf#v62BaZ2h6xs*R56Doe zka@QhEPG!*Ns#tE^x$xvV7)xa89SWh=z&P2^|j41d5J4)7_Z&_FT<3Wi1I#*O;I8Z zbu|LHNJrMNw*f?O@P~8n?nohkq z*4-uOkW6@?)g^1ArwAsK17@?whWh8vU-%iHPk4a8Y>wN)vij7HN{Nu0knHRU2}pwH zfK3;-TNUZyQtNXV$XpAk;2m{L~F^VREefX;tlSm;d$|znIg$bj6KHW zjbdl{v)ZjZA9FKyMNuz@GikpBZ1GQEZ4glnL`Jl55|Enu4xNxW4kPHc78OB^V+^kSe$ni%vc-VkL&!OtC``mNQ-AxP#9&(9A4$(}}k z_`3$!0*f2arGXfhr(pjrcZj0Vqx=<5Fch+}j$a?^-l0=3-iGcl^`hru>a9P-eNJX` zQ~&I9lSJ8FLpN1OKZ>g#<*nD*6vG8>6fbY+&b;YLOvW-1qaEKfsyO$@o|au;!#c*^ zy4cOYOiOl!e8%{IAWT{r+h*eY;eS+*qI8H(*#1bjB`Rf!A`iFvrMPYC{GD^xVVi-* z-HYh@Lo13DUOSA=BXR)nQYE&}bKuuJ-F2PjoS#*BB6mjFm@nVrE2?F^w=XS~bjNq$ zs;SOUE_EvcpF}D9Sho`s}x1iOhGQ zB9oWtpN}SX*a(8d!t9*82H=*5=PZo{=XHdLC3>;afHhCxff`spfB_ zh+^W_gqo4so`6-0{#gcU25bSw*Ew|SgMh_pG%v>0q{ovV47=yZ;00a~j1-?m#o>H% z0eakyYm10_4>Pd6yE;ZAj2r#kI<(tUiFPHvJG;W+Y4#ChT1mvFp&$d5m`~NABqeQK-Q3e_&cn$B#7@)JMeeI31Ps01*rNMo>V5}AYYGdh5@eBj0VoPz3AfP4lDW3~<*XAd@v1 zTQyG0{u0_aMT=9Dno|R@nq~O@Amj3Xyin5XkOZq(4+|LpR*!LWu+79QT zhIO?`G{*THR41N!xm7*+G@tycgVwOM7K^j@tY|wg(cL{L`hiZ_iLQtYr-Yq#BiqtN9?tRq$isyCe3%Iiqktd?8l$|hjE zR$hbQZHvB^s3AeWeIfF|^!I^X&%V3Hb@d8zl9t`6!puZv%XykNFiqf5eVTso+7}7t z=G)@si#wV|-)A)V2QTI?pX5KsM-D`Xyzp&8JM;RuC_J7}^^~r;)Z*L0szwFP>y=D- zdH&GCqf>bQe%P#Z2=TIi88UD4Pwe|k40j`vbKBK7YOXj0FqX>hX zQ{kgFFFr?MgZY>D@-Mwmx&%oKZh)?<%rj?AS9?eA3lc1~Ta6AJ+^_q5MYYxgTI-D=d(H3*x*L38yGn5YgzSw2 zhlGK+;7h|Q4GSa5yr?$2Jf9@58m*_Z24oyhugK=btiZ%>81o{7EXS|z-=&7jd~$z% zh&ghPhpc}Lx5iLst|-(0;&*d6_)&oN+QSuP_vnLdf2XHFE8cM*m3`o~WlMb-ho3;3 z-?)E{04kx%7|0);O;C+|LVoL4{Q1#=4Ao?Hmv{9|`i!%No)z@4e(K`iWvBj*)Yu`e zdoFU_S9ogjHrc8UIIlBKXK^NV7zz8kw;qahIN}M3=ohXc6F}`liP52YQf8kGsQ91T zbtlm_a?fk|3KV9XedkG6&KI)#!3tbR3m@B-SimY+Ei{5lLMY^(M zU0gyc_6=@$OxqZk*s_?P&l5c78Us|uuIQ%TdD8CjnY0T@gLpJ(FxD%4eX>Hl9kUGQ z8?d5?l6lAsPSJ>6{|Ll%MNK_PC?7S$Mx#c&VGAHX!4sZx<%@lBo!QKl-sIpIdo0$} zk+lTB?bUTPOm?J*EA4^^;8i zgRuD(y%Ra;iBPkXioK6%KkMy4!bB0${i_A}xiinGTX6k((C1C`Xi;9(UY`ep^M&bb zYt5$HkP_p?Nimqy$oK{C!oZ|oq@B>wY>l+))ig0BC7b8wu=iuX+}#8gk~^t_QBR^k z*`YdvLldF+{n&zT*_OLA%NkRCZnhT>TwC^KUR}>WaT7bdFud0RXd~c!vcvEG2(}-| zaMvc?=^!0bRYi_l_zp+y4Ww@o;fKRr377HxHAafZ?VFv0x8LmMV3CgOJpIEUncDA) z5F}33JWdfjsUK*WbB_-W^BRL3vFEhV%j*-` z1ubDD9R!Lv@mfnR6(KHrV{SZc8|U6%Cn?etlTY)3?UYXI@~)TZDUsp!y|{nZ<8J3Pu*f`zEQwSw-An(AtePHR#YXiAJh9j`V(`O9TMr!b=g zwv5INkDSa8UW^YM4uP+sG$*;#2*`)sVV#!d8Rbj`J+w~B9vgfsJpYqd|HS+{nP1rF zqdb(X-y$Jp(z3=vz2_?7+0!-djlGh*BO(m0kvKld7M@l1*44jLJpHNr8_Tb_+V`QU zO$$Y`yTm(-Rfhb8GQBj$%>y=Cs7WB~v5es9edMTZb|=GFwPHhfe7Oeeb!v#PI#npP zPpsq1^w%lDP4VYM(YO(9SB$|uXPd#QYuF)$+oy9vuB$XK(pikSS)rrxxDPUyBgNGy z;%d-ryV{DBQ?I)E!lw3DCLCPmgdu$IW)VQ{f~U&6W&Y_A=y{z%^$U`cZ+YDW5l-}f zy#JJ?BXpUGA$7y4m6ouJ)!|y0bi26z{AQy4A+?qF@zquD4PgDb;qq`vd!)e9DYu{c+|G?8`fj^-3Ysk20z_0`O;PO@bQdW zdUHN=xx+!N0&agWRWvHuG@4lCLm2%RUVDwfbnZGCdodt*W=?sy{Z+MgT_y9-kKD?}+|M<^% z4^!W8z_ojE+2A0}x3>d!B|>A1Mi^bELsqacFokt5xeereqj_hGNM8$}ckgjDI(PFT z=C}pv3YsP~(zp!7Xggpd#83y`kG#O(C3b8nSK*q;m@Uj=o1Sa5n#i*!lEK1gg-x~D z@F-Yi-k*Cd1rjv0=vB32RP_(Ukh+VnBm)pAF*jC`5WrVmtJRse!AKVumR!_ig>R2w z^_#x&)ldb9Z}Um&J>vw-gbU< zyg~%;M%IdPoCp=ZQ)?h|!UC_KDgo{$>OPKk=H(&oegarJ9jsMJcs{#>N5uv2V0&|p z#6tvZn{Y}RH1&V2*EP@y|YT5p6V#HZ=L(N}R zN5eplPPHFpnL3`yXQsww%xCU|ps%^|AM`A8*&&#@pz z2-zU}Gzb+hNF^hh4hA8&jX&)jzxoW~?Y(*hTk7WDpkLQYVenSlPB#GQP785@cUih> zKlj%!Yy*p+Yh7*CM4g+rdTi=<(PRSw9uf6`ukFNyYYg+T6B=kiIw5o0=_o{dM+l)W z&+gk1ka6y8iZrrxJNE-ZJm1Y~U23BML@v*=H>doRA;vHdWT@uyj|au1uRl5diH zy4pv0r%>UKGo(xDBTjU!i?o@la@6`v(Wn<2q_$r1m5pG6Pg;?~UfAl{UjjS34Hu7q zuB^&$^D5<3RL~b$+^u@toE=MIJDO6Ud23h0c6`&T=0Vf_Sa(9!-aK3@n%@g6lZJ7> zzQe)CLIAOBpA! zYbWD6-%YiTO^y){6N1l980e->ha|RQ+%{eS2GX}T-HLSSD19!AR=G}8nyv~gjb@U{ zstrNl&)PYbUEDW@yNBGQ72#|*CmU;r;T_NFIUIUL%p4!*0%M=?0<%!u9j`q(O?J)_ zdY6XF(XTl!C}u0zwBj1XtZvEFt31jkBYYM&{HGBSYAYw%^##wI?aH`apWvOp_4i>1 z+P}h6MgQ8b2U_P^i^o7&eRezKYdV@wdtXn2oQqtw<#iCDd?s2cS>CqA*^B$S*xQx< zWIs%K#(RU*hZ_;>O@?CN?0jEuZG=tuMTz0Zm7j2%abJVww*es(qO+pBoVBu<=?$B9 z#H!Z$Ay_lE`<9!NB+%0t7!$xo!Sk_Qd=wg>-LjiVQj^C>h=xJ_UNn_z_C?v8>nV_p zt>e6)R*Da1VH(^YR3YyT(}Mg9sE5tdqQd{sr=G5o3DWXQ-gjEh{Gm>ha$BhsQn^OK z^WK_+cvj{|4oiQbGva&X$kBCo5V`xs5X0Q(TFZsZ zp1rYqr)(p`@j$`_fR14K=Lv_))WLAZ$2!+6A*Dd$QMV&)Z8GeL+k~_Z$5(qU;q&Y;xVn5QQ3)F+`uFA#CzRnFHS&U3OE)=~AmK|NYg`+Z?AvXh(e zeDQ#L5f+XJyjS}6BFu5#yiUkR`BwRJkIdSmt8=eM_nO)I^2-HrmiQa(RDmjPM!SI1*S>>vWSWqz7(@mRO>lJx~OSNx=qC zn$agFCPHu2-wjk=0KoPAQ54ifn-WmHl?LNU!M1tz36E!l=#;+2F912R*m@PAuq>1X zJIWV*BYqL2ehg&7uYVGA-P7s(lsNQV8bXiKS%_+XzL-(wYhG2xz2kUqN8N7tf?v}=u zhC>;p0#f~w8RV}~oFsr#Qq`f;{#_^Iw!UBTex)b&NIW!#eA%GSy#U6P!8>cP$i=7o zzpdDQvGiXPzW*(@{f!Pk#E~6lO~FLebLeH8Bu%07lSvjzI3jR#k+1ELoJVurl0SaF;Db`1avPH&L2e4E$Gdq^#!clqx-<(&Jr|+J2 ztx*d84$-GCPEk?)g2*7UcRC}tzr8C{3yh2TdLjSq1yH}9ArSNJau5C)Dw14ioi{1; zqW>iw_I6DTgbu5tWa%t^zkpVHQ+o<lntg`QoLr<5Y#{R+R2l@I1F-nHN z`-G3B-xa(XoV>$l5xtfczy;Ri_yMOqqWBxL$LqCWxya4FB6hy4lYJ+QQGCa>o|0?8 zza0ai-x<7EGO16{fj85u+^CV7?$EVuayc}%AZd5lwWzBFtzsT^vAZK|u-J|6>toM+ zHR*4zihggl|AOhk8he{aymh_OJ(7)Cw{$h2?nR(Yhd~-zgPXuS#XEe+FGIA@U1M@u^OV}R=7B#wxT>T z&mEds)h2v@!89~FJ}=hY$U$2-rVOmoPMe?3Hs?KcR?30MwJmWPoL?nh2| zv_Y}n<9E&{t1>Mc1+7QTBPqf?808=^=?i{rGQPd7;=zPiiqo) zm;39{lzo*Lo4IxbrVALUZ1BSm4=)}BZr&AW#@@)iMW1zks4>fJY38S3>S)P6QI$(! zu8ntH=|5urk8*bTjRM9W+o;B|ZHcQHI&Q7&JvSp=`6938x=*Y}IEFA&WPZeLIdUrd zxZYU9SkkEY6783UnOLOnVKjUS0+X)C{>5+v0n-lU^G#^d6tSdJjOS*${J`2VJga4; zQUl`Kc5o2%L$ig5+gYU+hjF||yyA$3QgjCkzW0HKAaOWM>*`{gI4>?lGCh2|{Z&Nq zH1x4*KZ|gp5LcJaXQA&cwiEgWT81OJcC*v>Z>?L-Rx2vZ%?o$iQ0o_am1gXshJkE^ z-oY-XQ=U`C{Dy6&;zq(4I1kvuB)p(;>dC~WwEgOIn{{=pkjd8^PL+ES=hgV=xBri? zcZ{wi-13JzwmWt@cE`4pjyrb8Nyj>|ZCf4Nwr$(Co%i&;GxNW5XWsc#Yn?BrR@JWk zZ2X|^sR=zor%x)>otk;;5`L?5{@qKExO2u|H_~8?qFRfdl;aDWQ=noSk{H_E(olnK zMG=|M8GgXxU^_J35Hf&AY};#iX8$kL<}Ygll}OKer3GPtkfCVbg>9#=7BL-en`dTV zTr=Of(#o8ekmGY_q4cZDYq*=|yiwe~E<+pbYQtr;-xc*zxrIry>q-6%exGtwXylAj ztqwdC$N59r{?0X~WaWkS{4XP;{g!?9f^wLnh~mcb^8YGd1$IfiV^9N(VE6ur!N-Kr zgvj^4uQEYUZs(kcwV1@Rp_yH6cc%!?O1ZRj$1h> z@a;$cjeH&YE(HGB_l~dYwxYivSXRBrLwxUn2&5x2Aoy=SavZ3N^7RVa%bWl*L$kqZ z5lhd3YCzBowyX@w;Qm^qiB)dE|A(G|dsRqq+D5yyH~_BawSxB*Ig9`f=1Mni&+vG? zJx!*&Wapsx$9vNEfp-MtvgHF$tg#IG`=bTXf_2wFXJTVjnUvN7SvmMi{;! zS>4-9BSY;oFa$ZF5uJ`h) zcTgyV5um)h#8aT2s4n4HuHD#=N?W{^oBuLd06z0{Iv?656Ww$LQmETDrlOzzcfZk( z8K^N%ZNF_Ttou1zbvSEsse)pq1$-f8a}0@7Nl_}0iQ$Eoy9a8ZkLU;6RRn(weTy>v zhT9T+A&N8wn^CM4$y-}pt7FOUE9M=DlttU8<~GWPCEYiKHTGH;ur2U?&DKKbv8dkV zXOA_jg%F4{T-zq^)lgiOZ)A+_=Z-k_%!PNr!{z4<(Sa(@%}(bB@jCHLCbexx2#Nc~ zH4iH}7NH9|z|GV5?w^B$m z9$!rQX-GiwBoo$d+Thb3)2AXW+ZF(J5TD3E>B?B<0o|rmRxr&mH-J09jb0X7TxS5e z@V*iEQwzdHt>@P2Ze|GAKY%lktPSdR)BT-wrdg@Qb!vD0nA`)b4WgnC4+j&3$L7;| zo_WuzDbfpwuGBzEyhiA`rhBssnYz`>%H*9(<$-}jG^0x`J?vni)v>{#j{n4fWHMO? zoCD`d{o12j%hsh6ml1<)vwB$y{;f^ki__70O0H1HK=uY74S8nLEDK0`dcgU=B)aTw zl%bKaL>K+OY7>#OU7sRW?^F{e$Z~m-`HpHpVDOG5r zus(p#w#Rh1-+U2Ck8=%`;j~Vm<8>m9HIhr)gfM`n?6`8W#}UdQ!TdMa8KTc4!{@E8 ziG$|A;tmBPtKZPuRF)^E%Tf3PcGerA*LyFvHd=Bs4J7p&<9=@hHYPYD8wONTp)?-e z=iNpttEQDsrmQKcevF7wNaCs-&(-0G>`&J+u(D0B+b}{^SNf|h;Q4|C_k0S5lu}Q#S z?p2_9Q4(=omnU|l=)wEz!@`wC-HnroBJDvp9+K#KS05mUF?h5eISQ zn@bL@crs_?zCELyh%MKzN51;VjVjx)sjh8@5Q96{J)kq10!W*#wM)C7sdlv|ZP2-9 zyAzmJM3TfH5C}=QGT_!AjMXF`I!|U4i%iI%Bd{FU_B9uZAe-zWD)$0~_hZ zZ-dr8so_8TYZdC@vUGmm!?@QsW8tpuih#`_o5}B?%>Br$vY8{EIjkVTgW$f8wV z1WE=&+{C>W=rhis+16r|a8qf#IEm6)AyNa~xk*0*C1jI+Vnz_qe+$&jE>&-|(j~ve zbPu`J9l73p=4vuS-a2VQ(PEvLTqZ>%ICU$LTI2uO&WZJVh4fij{Ve@oZUzV@D`EvL zkL%eR;j6B>PZr-;SED>dOpsVCK&hcvq}e2(Otf0+L_Az2((M-!o>Ig@%={y0+HZh+ z<}Cj3M-Og0-8l25IPJhLd>w_j8%RX5!vExZT(kE?@t809NuA4#BUw(P6cva?US2t8ISxRcX%tFfi9IW6ah@1{}BMJOOE>aCN>gKQ5NzPPmqSxs;MazggLNV%H}fwJ>X2ZL2}Ca6K|gQ7Yca;ZL2% z-c3F%i37z)VE>K(v+^@RJ(zdmX~(Ml>5&vo=ekE8NkhA~eUny~ta8#_ydMxqVY%55 z(crVN4<9CRY72WOQ+D{__i8kM;>fgH?mYjx1t-T#qL8V0yj&h8(tE-SZxrc|DG_>2 zc1167?KPAQQiG>|{`7cSBTX^V?z~y?_zTw*=5yDru$yLEXq^!9S0YN4Zy^mJlj4=> zPBf=b{#1UQ@JvaoY+0H(T9eEEuRskabL+pd5f9OQEY&XPpDa-zxpB!*{BSzlO^l88 zkz+#UN1m}Pf5!sRi`}fs&Spp!#sj~0zEHRS;@0MsPSO(Jddc|S5w(Q};Rt)?pzU~c zrLb{zInLn1iV)KfOn{V49nV}Vb)u&Mj3iWS@NE0F@pR3Ew%6$o7s-b zUy#1Wdg-yMQi497{k6=m?HM9H@R$7Vb#qqm2|;f(6ld*igvtUz2SsiQbaMVPy_;(x zMH@`)+oMQQymheA1Gp?SNLCbS>QxJZxqkPSUgS8R#+&t9?W5)gLXTfVfo5@|tjOZ# zzwEvX$Z#m2qQM1v6YD{1EkJLHP7tyjKiO`Lfw)J_cfE$Unqo3&Q-vkcC)xfHA5!vq zDNoG_jk3r)sK%hxqQ7O7tv)X+v8AT|b!PBi#IL$udO1sO*7ayznun5hH^ArXBRgqv~033C+o?qttE z%8w^1xm%$d&gTG9xm17L{a$Stj;B(pgNa9}&}@`Fn9S0pgK^OKVZ#z|%klN-ep&HI z`a7zsamL)rMuSI^JF|VHzt0$f^Z5MK6k_x-v&rZSLfZb+b}u7b2X30Hxs*?;P2n5P z!5}fz3ZfTKOF=Lb;oS7)oq(%|P+~_0aJn9~e|yYK2Emj?kIy}{+v%!?DnO(}(Bbk- z%?UX9YA68$+|uE)X2|X#5%LDs%*_ARqb#HUnkXon39jnR*$g;IN+VzAErQ?YUntXL zxO8WPSlOYvxg#V@3Y32!VyFQ>I7y<_40+?UyS-oRkpaNh)wNpy)ucp^T1hY+@qO9c zenl^mZZ(7GJ(sXf5q)YEcz&R>40!Ah4-&@h%HusR!c`6{P4ZB9ecoQ?lf5-ZVY7nr zjj<2aF&Gblbv{LmbmDXwzBw{>%aXJKVNoSU6MQzeJ!qXD0o0jOKZs6^wv4~D$l`G| zbv`6$?2|raY}vp$s1IH)?vF)q{O(YU6wB77`u6+1tqf(0w9f5P=h1?T4x~96-a?1N- ziVvQKTz+lTW+LTN-XPaMynaq{mRK*H2h-kA9VjmxQ>^O_ za?4P^e}HR!)grm&?r1YD7LH|_+t)4djs6B{m^hVdxf$rxw^8#`)=wZbfMJV`P7|m# zg(l;g#Bl5tquqE03~~7%$TmY(lNZq<{DFY|{l$&xfR~|dKOn#*^QqfG!+7#t&`Ur8 zY#oL+sGx!t3-ljf#ecs9i$K0^2{U&Z!CezgJXg!Jfx~Vat$ts>xbg4=yb+L@ao8Wo zsCRn4tK*w(v^C$IE?$;3o!G_58Iib8;P}+imq^PoTzVFzgpEZghn{I8-sW36&Hn0+Q}%D+k;*3)#Hb(NzMUUD9Fc4#5Hcds`2>|UhTyz z4}ExaDUBr!J8$Hs9+g?2K4iF7nrWf!(@D59~o{xlj*>3boOyv5op6F=v})uX3-lYm_rkiG}~Y9{6R#cX07CS=Oh z8RdxYW=R-HAng6OC4m~nx}f(gA?Inf*vl)S90XsQ;YSbIOv4Z9kdRQ3m#iLxZ#F#x zzNT92VPSDVKu>YA<3sJI}Y1d;DMWygede)3@EoXimi&LdJN>xgW`E|nzJV+&U z^j*g7`{Paj-Eqk@=4M`qh?vL`_)eR5N=$3Qfybv`*=m!5bJ(?L+2ggrfj=5ZEt$gf zG?VR{;}ZUYvhGs4Rs(Q7n&ow0|H68_(j50fY0I$KuE4T*bI;B!IL8q9oaE868{V34 zK93kz6fAMZXh9Q4zM+=m>AnPno;QrnF?1^0eWsR*cWFtwT<`5}bi__@aw>4!ak60% z{Xy;>V60dC5>C%{)HhzETAmnH=t&Or7x}qK!-6(j@RKHm(TbLQnyqBrtJ+cB^B)T&u=en<7 z74nl@XiLyKj85P>;NJMkwAy8dH&}SW_Am}Us*sJx?a5eJL_Az(EuTL8poj-$70Yc# zHe-I!K}Nfn@C=*T!G3z2f;~H|sG2)gNf$mybrJH!Q<RkRO+hc(p#3i1tLDuad|` zzdUC`_IMm#@Rn>7fN;hVvNVsPYH6GVoV;q`?k9$XdQ`SOv9XM+3fA(Xk*`=QVEUce z&xD}W*jzKspUIkHAc=M!93o#?i3(y@>0BGl*d`G=h-uBYGmnigit(f6e`i@WtH_jN zW`}yaAKnz4w#~Y0DbcJpc4MZTTt`s4PQgyu67ePDpp-yAH-+6~MmCYVS!0gS{&YcR z1brW5R#})a5B=h-Zp-vXh1tXQ3ZfPE!)~R{Dgs|t!6arVol>?J3Wg%ANh~4{xT8c3 zmy9%4lg;Fz!ez5gj9|nSLAZaV*d(JvMa_dG$4>>%sf>yn9;WOxwBJp)#AMK<&vNJc z0Tfp9!#DlC&7IFrz9B!4{Asnp!}%qP?>HspW~=>?GRLdBw}Hd3N2ZtM1gWqhZ!eMCw))(i_gS&uFQDSESWTNw}@sk!SB04Y|C)#H8SK9~%7zMg>ov@WFQegdt=~i91vijC_UZb7YfrIm z_JrlXox=ZdCO3hibjhiFSd|N6;DeYX!Gj0!cwICf8jdE?_16f*9!BwhG=&rLcL2VVw6u@tGwjmI{cr)2vxvSv$` z@jvdIGVXgS4{!AJfRd$|tz;aG4GV+&K!4bbVAfc@LxzAN*N#=y%G!>oY~JD?7kU7_(o_`i;RdT7d~^W=l(4F%gIhe55Y1wxS!b?LGW&I(F! z-%yfZLCfkrv|aAM%N0|xft;`6Xjd}g%ZrT3>V;w+L}T0B1=}g)Up_cNr>&T)b>Mf=Z4JO* z(7%r@43A=ics=pzBJ{jb%EW^Ez)uc})PeGGh{0o1JD$#Q4#GG8TF8Tec0iqQ+&c7Q zxTbAea`t<20c#~({JoZ4uwiD$3*I5lf%2WuBRw8tDbdpHDBC6MO4GhI;EbljraWuUXJVZo9+n$psU~U&X7vw=`1s z?N9`iE@W{zrtL_a-IJJkuM2daWv$89a0e{LYmcT^6_`NSi?McnL)oyt?A|<*6%l_}t=5s@|g=(0P?x#if zZuP2sV@;;4v~^0+?8$nkG$Up#u|bNt(y1B=E(IkZ$@NB+D4NKlx8J(^{5qF0bxRvU zkI(K<66)rdeoFGo%43}YgItEpY{)<_p zaN>`wHPVUV6xo?%fTU2IccIoBQShCT3*Ty;IX%(_yLtrympqJJ>>i$R>{&d2jKqYG zy5q=AqvbmB=i{SSNxe{NXyF29)^`o_e4dc!3CtsEwl01Fw%^M@O%|lwbnCiH~*@hmB;6N`;SqGqaPfwrY*StHd<%VBS z!7Fq%_=7-QrRyNb=0l;NMbdCivnjl=*oEXT&86ngB|oJG><^brpA@4YV00I{AQp(D z4*`tJ8}Q`P8a}iIlFo^Q5u&R_`oh!nPu!ddv=nj~zMc1wTngXEah_h)>y67V^!{AN z1TH-zR-9faZ8JMhm%GN;Hb_!HE`ZJFM2dCg^OZ=U`$#bUz2vOs_}>&Bn{!Pak5kckgP)yk*=WWOM zyR%^sY4O+ur9=GVC@uj70cx_aSWyC!`SsXKsY}YLxSr^L<1Ie5wffVP3DFGwTgL*- zl|G8dlz9daENF0o8c8Cc2fmbJa3j&aB25TmqrL`WR1i9SbP0vOH!1xV)4fTg1D&Py zkWKZaYy8>GDD|~RjOm|AQXQTR1GG?-=~jAw^+Sx%^!D_GhH#8%NygqbmYQVW%%pSL z&sn~z41LE3{DvFCCYE0{PHJe zQ7`0u()QJ629Q%l+We`-|$g#=&9Agk^zaAQ62K( z6pV}uc?(OEukg;V1I>6e8^Aj^He+mg?7J4dKopv?a8mJY=Z4-dgtdq_7`lYVJwcD~zQQ^2ju>GU}m<&AR0|M9(! z;4K(stAZAFkY)QK>J}(e)x!@+K3nh9O{~VLUXZ{yxxMlg{2-{tQH15TJb}sVE&^FEtUMxVZIc zlV9z*BXxHF+M)kvZ6FUWk$srKL%egTMBkDYRovAQ&6Oh=* zkRx47_Q@haNm-PRP9*$?t(dTkW8s8fs7LtEWQ%q?{gN|M3EmCoKzx8dJrV|KN-=4# zz%nI_sWmv)x`}KMDAITX_oHOy=Y?~p(zv~~$UVrAnq)SEdQINgxv?9i$r%jbo3?f$ zg*=;N?k0?KSFYS~C~Sbs!}HtX7uktK$S4Ia>z@R2_kdYVUuNj5WjSf-AkYnZN$_VG zuYItW2gMmKOjujlEqgpvoZK5nPcvmOZI}o5pPqj#1Hl17PUZXCP!|fE2%TVisG!|6 zbAB_}#SxZEE~0k17poLxT`W&ttmka3o;FKCWDJF>QK zy#{4{0@>T!$1u}HYH7act+A1$l^MKG?caixmgB4kxkv-NsK3qN9_NXKvn+MxJ5eRK z^BE;Stwvdgcu~RzFeg_=n&Vk**l|Mk zGFl(H!e14hFS##=X3%Mr{aP&sWl>R3K|*-$Y^)yQiIS;xIWh%p^% zYty77jkU(bQCI960J#;VT|7886Q8u;kDBz=95VtuwY^esw6aF3L|f8v=d%@v+;^1o zTb1ZtLa&DuT8$Q&ALF&-jcYD`cc<&pAGbH9<~<%q*@8G-_Q#z!7xAs|w=Uc9-zMCc4<|eqDs|<6$axr<4T$2;jIlw3#4!J~ zs#b@mXyTQDnjOpIf5dH*8hGjedyFpM8`|?TgBJxARdEZ|k-=!$+1p(9(Rytf&)pX9 z68O&y2;PK|b3Czl5o!k%*^b?ziLYQ!keQ0lcU)4SH<>mpvPumyh z%`2Y`7mawnD)C64v6aOGQnW>NOBuB|SH&P_ia|(0C-}siWdhiz8l2Hd0qPlg8b!9= zzc2}Sdxpz)>B9V|pIwwllHJYbCCKrd{I#v=wmOkAxtlu-X;0_d?2Dm z@7loZi_$Smx6tp?ADRt2wW4;6#53-$YHFs<~I$un) zI4vS$Z@vZfvb$MoYt!0+X7XBhq-L3Llds!=jlr_3L|g?ToRo?^iPf1vz4X{&a|kkR z_VRlOcm&rn$ZoaUW2gl0=3Yl?TKNno_$YeAq{R`i!$z-Vaeulcdtf8!(v_29d~7vy zY+YiZ-l;mClBcLSD4x0xPOPi#1?quXg=7Fcsx%pX{Ft(LCRpvw_+x_Xq_M|kXNQ0Y zoA`3XjtP&~=s-&#hJZ`HI~e&>ms(~R;`?`HB~BAeebs+-{K}M|K2Q4J?Vj|W7dNxw z4|QHDX?5E0YT^V~lYY*$mI>j?2lh}-ZoTDk`!Uz%S$FE(3~ut0zgKgoa%a%}dqn^3 z2Gxn=Wd<;^Tv*_)qveVT9q#{VDsn|xV%n$&yJ`^{I+ZA-=;b`IT9M?$S;cjA3quH1 zz)`;6Ozb$Q8u^_uf4eFMX=qn7mN++w6#dSDxk;h1M9O&qKJsBY&`w~OapBW3Oz|T% z?>@`dVl?KP_(+k$A1T(DjV~7rmz|%UX3!8+FL?!lPndWL}5wg z%H=k(hs52)CvfYyBso(gh3G0R29C67Yk<=qS8)U-q)$^m?{~}26kEryt=g+9Ky_54 zqVQJRUP!45CGLz+a|A(GZo^j~u7nI*3cp-~lyX}3Sxy}^OMwqgo7>Tw|5nUAHgf^P zj5@QAuhZ{h(pG(hmI~qZV52j3M!k)A3jw%{Y0ojR4HQ5p+6sdh3mi|IcL0Eo`8EEY z*KjF2zN9!`sq-;=q%${gCmPa8HDc%*-GI@OvEBKD!SA#DvP(Q)sugFK>2Wk#?ZU5dUFT8{(f%FwKp#gp^`_Hl#_W`{?v1a1{`1s> zcN{}s@tdHm*J&iSeJc0o=H^G#i&A9}0>}j%sjTl@w5q+hX%_Qw;v84(*_whlKi`-z zvlxr>Bm(%FyMPznowO{1D}{}Lq3ePuXl93!X^lsBuINgl3Y})xpnKbz<7#;*KI?PJ z0&~^67SYt%8&sBO3HQAk5@zI>RH#5_cxiMrG8zX?@9 zlmr=66?-v?@Ee^bOK*C$Hcx7 zVDvw7@jMR5$ojr@e~GaCL_NGaZd{W?rgk3yyCxovfO+(xnz@1YHImz>4Y{$XgmZm&gXDf@D*&jg1Io+&`RE!6{BTj zn`@9^o2VAaNPT88i|B>()jDbdYwLXQ?dLq*n?Hk*(p+N=w`p^rOgC;9>3J1;emTM0 zJPa4loE76llM2mEs|D~QfTwL{QT~%4R3vFJ*TB1@73>Sh9<50~H^Kb$T14s`1>5Kf zrDZm1eHRNks{SQ9;cP|V;<#OLyS@j(Cl)0e^2P26nje(;e9mg4(JL!ePCwGp^am6q zcuCY%`_vcJaw{393!gkI8D*BY*u|cnd;yZ)Z~6~;^ei){(r(G$4)gj$3VFJrIud~9 z3yyYqfH<)w{e>KDO;ZgdC_u;0j`RN@}FghNSx}5_kRL zX-|^0Hm%sI-fqv3zVLh@GG=O~k0ZW!)XQHIi1B&U5bL+VU#i-0&sT9&HJ1I<&y23r z(6`@9o(`;2YI#m*`HeP0DKuaXlfOwzU1iCr zfHl`CaTq>m9i3QrBSj})lT5@kIHQb9!4XhI^ISs5zBOoCsmxMAEM@ff6O7l`nCu3~@Q{Ya#md6I$Jsxs z0u`5XSg|PY^%~mr-yx^4tRZK(R6cG`N^5>S(l7f$sDqgn+xP6P1UtIYr!MKp4rCH@ zQI9Z}tSxGR+jNh4eVF=j3tp;Y)sG%;zU4q&1W`R|UzOHqkFU?_j=e;r8S%?(uGt@+ zqXsycHH$(ZqrC(HO#@oZH)ol;exOyTe$tj*&a-dEa^4KO^z3u%nW*6dGnSL%9-wPQ=hHoR4(<@rU$KZ~L5-XL9xxKbWDbMq3QdcF3+M24nJHoMu3 zh(`Cm5%QY6in4s%`BM)^L5ub#{-WLyWKd|y&+^?w(a%_UlylV55IJJX9GxxSs=)%MoAYXdV zMKLxN(Rm?|w6ys82f~#Y!d3To$Y;}%^tj!Cvz6RHXIKo)OZTT7p3f1Q8n;OuvV2KO zC1!49au+wJ%L4yqB(^Vje0IvKvOjFBpgF$q?_Ox^q|0<>@M?CXe+P>@&Z&jIfHNbs zwF70ncod{bf3mS7w>?KbnuytBhjB_p=km$;Lz4~21W{u3dwonutLW4r09*+Ijy_)N z#%UJH26ldx8(hq7Yy6*;3 zlU@~_k2v>NrvK+0=D*g-TQejA!?FB(;u~KD=(R_O9T635OCRsm?wF@)f$gePj}Y2VJF?BzYk5S^R00=3WZC2D%Z*bb#Pu3Z=J2eZ8$FXlb%P&-{l8*1-j1txP885+QuUmB^ z7g<3kL%KTRDx6M6fr6x(ZbE+^if>ou(YPN1p9n$0;wcsJIAXNkCS>`cGyjL0)8z)u zYQyiO0^7T9ZUdEwlBV>*PtC|eD`-VR@v5DkyqvH#A4JfXNcGUz_S;Ifc&faAQt`_<+R1xHAh_Lj4LNyOxxc zOz>*I%58YAkc`U{Z>(r}tx!=ba_87*ChLv^j_nI0TBZcB5%df~4k@CIvE4JGaQKv+ ztr1TaF&Alm3TOO6MnNGi-`3=1W-d){uiN`yS786~h+NA zkOkGJR+Sz|nIkzB%#Y2(IxR{2v-nT#5&@p&hS@^7(gFa<*VKmJtK>k1gxGesM+};K zhl@3JtEO$p91N~oWn~-pY;NIQ(_HTT+5))Za+1}fy8IS=``epsb0VFOo4s8r6>x#+1mn>5Jok(1J*u}ica)#PPP^D{yXQzoE2^8h7d(Kc?$`M2&gjb~H+&~6 zXswFB?Nf7Pczx*#Nta~M9%p?GkfWNf`gk$ZEDS~FCuv~O)l;D02U%ltteA|+Uqt#F zDH*|zeOG7ti!F!<+Etu&>(9S^H&OrM(B|j8bx5x-FC_=`hnMVd;`ypx1&{hlZ=0K2 zGPB9iW?>`hDQ=@>%%P4eHebJ{pzx|Vo8@v@$3UgfXD-P%hLUE|ZWCWdxgbaYDMm53 z;M}EeAh5!{sa_1HW=pw%+Q~FFW3ybLy~Uu7$1~k^wp^4=HK@iyL!%q5P9B?>2wZ;n zu|s$irJb@$db|fiSNrR=K?f6m4Zdp}ZhiaF6yGVUN{McNDY}YEJCQ&Bv zxq5MLx=*=TselH9eY<-DsK}%Gi2ig2-Cd*4Fy(E5o@I8vU*WY^FdwMJx>%|D!@;~H&azO_LG_g;dk2ov*G@6^D4sV~ zLQYOjbvaK-Sy+v_eK(TZu*(~y|3WCk4bv?z_WN)DSjK&1`OLHM+(;z_2%JMUF{?r{ zwr*yGz}DQL=Drp$c=libQ5lRp{iHn~R04jHZHMc+m^zaBYmTtE%^E3i&0ddQgzqHqwE{^EIlNB`OT4+jEwDVblfQ zsX{;+2A$D<$$X9JG7}J9L^@VWDxu<(n5VBFA0Voz?&NHH-CZ-w%*3K=hKA#ucONiJ z;?Srv9RGNpl8tWP+$(YVUJ4MfVLSTi z-g8?uqtv|cp<-Yt5+~X+wB)D&kuQ?K%%UUNrBNLyAPGG+2W* zL;B>VGcUX&@Ffb@BZ3}7(lRKgVudk52dUto80IqiQA>opZ*Vk&F@n$h37QjDx?uwg--K5kKiLw?fEj znGAn4D;_JGE>E~uUG12Iy&*E}XrlCG_TIbTDJ#oGD-w^pAgr;WT=P^!7LQ^R5TwO? zW6lXf_i|U~poc}}C=fa8&UeeT-_#g!o{iyJiZQ;=w?`Nj0Y6MN+=A^5XKvm%OX%TM zcg}@;ycU2%ptEYBezCvO3`E5JdxiO*0n?Q)PQ=C|aDlfb09hXvTUW+2l($5V`Mt=5 zXiWGWSMra>Rg5;XbXUEq26Qk|3{L%So|u45{=C96L>6&}bY*d}^8PS()8ueo$0XJM zEIbd_;UQ^z5p=?5cg+EV=QW%eR9NC)E`)W*Gh_u0GegN*$q*hcF3mUM+H?-v+!y;w z1Wuqe4PsoFfOCSZW(niWB~EHCET;^Ya{uCms%T6;p4Oxs70j7R0^z z;p~i_P)Bi}Fm_eS$X@&COlg^|N(`|)#NXh6Akst+^yUU7HB0Lsln(O;Cktt|7{j$4 zM;ECk4C(E1Wi#?PzT`wV%!Jijcom{8G1Y^>8FZttX#bh(+ zKUyXqeNwL3Fz5D0whLA6V7)XQkMKTH3;z&zP9zKOSe={~0@Paq95)90Jg%S4N;LA* z1|@TN7`l2UXFVn-c`l_53?8$N(j)w8%srp`zYY)7Z}K!lax3gGymB-rC+|1YK8I8_ zI2+`AnZV-3e8bS_LXAYyRxFe2vFJ)SIL##Z=b`MrHzt_++5Ms}1F!2{^l%(SY1B2E z{85e=*LXpeKir@+dNA=mFh$NQh85fm5+HHfGpj9GuGAG%^C@6xsQcLMx+BsX<#X)q z9?>x-K2C*7H>Rqwx-55LPD5qmBbJ*9$5OSdGisvKka2tz7u=1{uZqj6Q9mMW5k)h< z?3KaCl(_Hq5cBxI%@+Uli|BerAyPjf83+qj6X}Ze_3lhSL)X%S zZHXhL8lTJ-^o!@90LU&AMs2WxY3cpkpAh>2XowPTfk1$Ro4vKebO6C#vQC0@&CxK} z;>@e&BGqZSLbcc`2)>ETX0K`QgFO=qAQpJ$%&HZDw*iTtd8!72RjK~gO8Mb+_p``N z(BLDrl(cdyx2z#yGw{ihuwA)RRH{j{EgUqwjd2}$%7?AGihL9w2DjY%OaE7Y0c3l%TBU;s5je4b*1)%?3R-#80Czt}03A*0ob)!du%lU`e+H{}B+w%wbW|k6%25CD7t~0=X(kPlCe1SN z^8l6$^i2l2e+>7ka$25pv7h0zlXXRyX-of)%=Z^39FGQaIoI?kgx8ZGPBthxL+vQ* zy8uO~3LASYt8q!DZfQg!u)7{V87ncUOE%RW5&X)L;8^PyVPO=Rp73{Q_%9_3ybraY zH)#uh-6VE6PbKP5`9JUTf7wg^^HH=xr^~^uXCUu4+wB}u%|qR}fE?S^R2Z7s>TTde z5;|x-UlDwxQ|1JXgyh<sJJm)!fX7Y`|A)ikkd5Vc zl?jN+Q4ZO$p6tnp)42~EQ1r+z_1({9&)!Sq&Eo>+*E1|btTBUx9~E+PlhL0Yw?6Ld zk8aIYW0cKaH|IdlT&46Gq&(M|5T%>B&)3GW%tt>KOEo#JI_q!1!F+sc$Bxi>-pJqa z)(CMU>^~+x|9tCGBHnOksjL=KI-VVQ1^LqJOGPv&kf*i8HvJ?5+lnj44(I%n|07|| z!+?+pUJu$Ak8bvCEOdrbBusqD3dBPOxjXM9g!c1_TfED(W&9)q1*(aFx`#q8bK0%p zDGlPuBL13|Z;`lH#2G&9VrD#9Q=3!<4!h$Kd{R9grhLp*I^pz0cO#RU@-F zsDQwVxPoh2olOO@gb5R7w1Xx7)SCc2?o3kY(~88b4L1{8JO1cf;1VyMBFj?+gHD|q zJ4GFpa8r$>$0DgTa|iT%FP0dH@h9`!pl1888Kw^n3<%*_G7|J%QrVd0FvHaQimKvc zd1YW1dej#PVaegbc?W$pwWH?Pei{N|u>TIZ&*u8J6(K=^BD#}6P%l}~8dng`AmERB zt|t9TV#K#o6j9+hWowmlf|AYBJ1sEjykr+iI53p)#K)XyGO?yPdWQk;Q$r*mw1Nan zwISr>)S#-EigTcBps&`b|EKNlh1-tux@u3jm<(vArwBxaEKS4%Ax?1&d;oDfd;50u zOICU)jZ<8<--&)9A*kpm#P}->GY;;##|8%TsrNU7g`dP}jaI#_BjQ%+j4Ga7&xj$R z;ZrZ|80IlaWI(?!-Nasl2&Vt{EKULi5NK1u-rvc1>4ar7r4kI0&43DtKo5llLgB73 zVjR-{)B-@J1o7$Xm9*P24BfcDcf4bklCb=@k0G!tU!+SZ;th1Q=O=@t^`yYXoea7Z zH+tM*n;lBEj6c%cgkZ|<(C3_SB?yA)YWzir*-x!Q!Pj)p$@$zbL${!mQ0c$Xy>an5 zq$;+CW88GOe>dogBciHKOkYD~W@SO$a8>q2#({6PT6d0Rbjn8xt#YGl>=nwANt@bK zIb1HNTjBAmj914=nAim00-Y3x-yoz7yJL-j(kt}KwU^$E2=(3X?-o*}2QV}B_Ttz} zjjGKOzpdVe0w11{;F6A{!{4zuEu%+ixi88!J0(5eU-?HPwcYA6VRkEGba`*GV-NRP z(RE2Eo&Jmfkp=A|*$tt<^p(v5&hgCA+QX4z17iG-{@Uln{|oDspD$>DXSAaJ0ATik z7Zn$cYP(*DjFfcfG;;Z5&g(Rc*d`zNq0M~wiSG|p$Ej`ZNt>D$`3D3xX_mAp=2Uy) z{tH&##uL0MF&BbC_o<>@-Vu6ArZLUv-cI%GiSuzx0;rO?FT0KSEM+iHJSW-N0<8u_ z{Kg*6aU2#n@IlO7jZIGe>={8aPN4&W_J-9tV-u1pcl)ZT7evJG9TX<3w>j*tlv~$W zgDb|7B`P0n(%eX-Uf5cBl)uFUm`4bVr+VIOHf|;<4O21ZZ0G__8S_aS3QM6zrV;U_ z;&pkiO@L5YQe3`)S^*ssALz>C)55){c!q+}j7FLGX;q{cEgM)Uf%MLgh1VK`dks#z zyQXvwN2x=k7yhWoNZ-nv)jXwFC&gA3x}hB*Ql?y|W&pGuCR}1!w72&cAce@M&T<;> zoFV#ND)Unk*b>wE_<)!${G3YB^4GMCNSS3Y0df1MnrdxE|f{2%21V1fW ziRHOKwVaK1S~KDFm5@C}ZlSom+BE;QNa;f6;0Gl=xyjBrg2PS>pce8@{&ij=W5!uZ zYBF-qARKekbPDQ~;U?v~8~T-Zmb$uxLPod+kFNncilbn^-k6@+@3E$qiCB2N>tIf! zsYV_h8qbGB0Mc+eUQX$<_{(l=(6{}8iORHG{kemtff-f@siJR*-~g0L9e0P7ib?6| zfVhF?Lr>cCOgAp>P9Bu(vd?m7exT;q$CnYZ!hL4sEu=25rzHz92_gHm$4jbr?ak){1DX~u=5dLQ2HA~`aQvgsy zrKI4ck#Tmy)*8<3GQAWa!;54o`KJ`#!nKzNbc1QJn1<|^ob7^J}5@T@ZJP89;b zgXahQRt3*0p1WDMx{9ln`iX5pHB2MWOh=k1-5${GuwFht#JzZg#v){ayz1FT@2WTx@cE5sQN~WnFh9z$@G)$ z_d4~WF1IX~<56~;e_Ua16c;uKZY10_OHW5GO2Z8>LwR3fUkF89!3?$@)OF0t7UpBN z%blBK^AZON+>2z(vr8|8l+gK933W&KXho_2j|hZNV>c4KO^_nOD1ij2P-d>psq*u} zM7^rTJYBEZ-?KJUJVq>@u>W9k^2EQjinOkJK`Fp+1({p4@K&E3l1RD>SN=9N3TYpZ zw~`r8LUFA53M3;D53UwA&m_v~rgf8t1ZBHEA6evPLfdVB z(d&tsWjt#5^Yu}BrudheX)aP+;y7BKnLAqjTZ8AWu`TqSzwtFH=YiMY| zCWBg@QFJLbTVCgjn%7wf#k{gR(DRw+x-@7yG6yxhg(m^JSVUN~cec1#5p6T8t1H`} ze_-BXag-lu%vjNG+_VOsyGcCF%*3=`ip^}a;oE;RG z?M;BNN5s2UPJ6?ZB;8@3J`v!eK$ICSA7d=W9me+qIH`-X(rzij0Q`vVD_tmyyT@fe z340of`34+viz7cCrXoM|_BEKlLq6NRz;n9a6R)HA(@)h?wfC-Fm2H3MaZfYX7aWrc@%iJN5b#06=Y8>s(zJl@QE5{{p#;qd3TbXogtOh&1|`%$o`YEzXBEV z@HVO05jR^ks(8@;se33`0de+nEUqB+! zernNJ8nS#c{3qrgxCkC+GU*9%>ZW*)-ec4HEf8H4&V+CwGmqIHtgpT)B6M`2sIfRy zE{zzN`iQRV8Jo#29pGzJmlu)zm;fWU`8l8(ccb^s=Nrq6FzuebAcj|kX@#@)m)Emo>u%h#^6P6Rm9 zRk7c~D0WVl>1BktW@UajAT0pkeoDE`08S{CSR| z>*%;Al-#}vWjQ-;B2tc#P-mn zTlgB?AF56Rb+t?Mn@%;`a-==kP#l0S8(%7xL13vF6;!#nF8JVTLev+He@rh6#UD!V zaadUaPmdUjm=#xqdOixzHxLn-USv$?fSeL{V6%n5^L~v{t>FyaYDa(AsBZPh5&ya$ z8@*`2Wq~dM98G7uI55i^iDv^UPj~o1*CxsBs_xwkIPOhvtdrRk=bl$ZJRBWF7Ri0n zC2{FnvsPS+j+g3Ch%cW0%yu3HPUwV>)dv$UW6-NR(R`Nr-}zMshaQ<@9xP z@Z6~02)HV0a1QU~cRF#OaUuE*}+o58H#@U`MY`oN`RWKd^ThN!|x z|A_iNtW)tvyk*H{*szoUa^cBpUfCmwR3-(Vy$1J8i^r;iS(_R3wZaIbQnhUFA#&33QO7XVjBf|B>%-#Txa0d*3O-6uLS3<{Mfy72L*dJ!o(1_ZZW9qnZUInIRGEW z-n1TGY`_uF_YB%(A)-V$_H@5h%fO{!S0UF&S&|>(YEP>wutW9YNt8#VJ~^CHjja8ek4bx z#m+-_vwrd16pp32Oi#VB{+6LgJV8A}Lz@wAp|6w_SEM+kk?hsEJ3x}JrjeWoZc=B< z*?TO4QyI3D-uG`QgfwKlEbXS$+umtl!zxIyCs8t;)Cm>R_}<~q zAQ?gkqqtBeN`m?Je$v}0=!=}h8KDR7&g=;B64>L>vl^Onj)9$KUX5(*96_NUo8kSM zsOy_UI^@$|oZZcw9Io)8G5?E?8|@-@nQ*8LjvZjXh6w6Cd729UXF~>0hn6_m?GR(x z*4YTOs#Nr<4Xu5c5Rn?qhMu$_Y`4<~BL^YVe2mb7c3t3wNnRTII=?*^7; zf7L8+47hc4?bhcibmv&wi~i z@6a@R*}dx!1?}B)`mDsiS8rQfuNYd4rZH>rm(KkjmOBk_-Qx0#iu~PvdAJ#Gh13{< zl%(M^5V7grI%+-jg6l&u)dq_tK1b*tB7!z`MhE|#NCAK=7^fHy$y||!r!bP0Cz4cz zReOW8onO8s?y+EUju0cp2L)^J)W_>epwhwU4y`-#)5>;!bVdekNwRVeJKEJTmLJvi z;rldoJGhBPP|z=l0fH{LY%Snyj8QN03`H8gKE)VRsayMVjF`JYae4vGcT%xv{n8j` zxI()=I%5)vUQv8kfyZkI^VNE$vY=gdIoN0(BF2g|0yFF6r#e|obfs4 z&TA(aYR&X{egoIlf9+^>iHqqC&5+#jd!7T={+zSq_x&h?_K-N1HgZ>Eq#BpmHv0Yh z_Z_&k7sEjc5r=b^=rvQ15dDTWEi;Y8!&R&7KqPTN;d06Qm$CB2Sk$bmK4;vAr?VW>qEHCF9$(&Bs#!BBBMg_s z`aNFNc$&ZhQlS-$LX>fgz2e`Q@_2(sf{%(owq0n{iwII?)0I*uSYzc`ujJ*5U}CAd z=6A4lC(Ymx&ONEcM>0Q{Bpfz+JL`Qz<19C%#n?1RI4OBl-m)%tVPT#nF4v}Tv^Pw) zPaP;lMHs}@d8BBNiK*QrWBQfg?w1geP&GFG!FZ!s4;Q>oP**t_#FTZXG-}Cy+GEVX>{A1l@&ad${V27$FKoG ziXLmPKX1t=r7}Yb1ri?NUOBm1``6vO(I_AN$DxD?s7iE2=528*N`b}erLsXTKXVJj zVU4s}qb%A=%&H#$AQD36np*#e*)~RMj9@q4Q9F0wHDs)w`Za#)!G(Ie)egsm97ejlYe2Nw;uS>kBHhLr zVWOGo=*9OXNb&ErLFw8PFfLLmvBq%3RQ|)z^oK%7%Qn7t`H!^6b+(T36X9Sl?wXPK z)NSoXo45)=*I_pDX8l8ORoPSFgzJOtdZSO#gBoO3t3rwQNHu{LkeCzvM~af4UtxNhlWJLj8dO%SwGzfO zjKzrIEUoeflPtWixd4gKC8-25s*H%{IFO-r_*k9Nau)1+wLpc2g&NX7 z@`1McQ|VZe6Te+|)K!@s5GA-Q@FMgDCMYirO+-0u5x1NZ$ot?@b5f*p0}~Fb-Rb%) z^V*@Cn<7C(N(iJO@`1#1%8^-j+x@HHYD?5IvAa#qPh3j2>YsC3 z9_J0b{|M$BC&-$L59~e#!UZ{+Fo?eIKWhNvo4C|e`?V7)#4qI6- zG)uPN0^^pNY$_a1eX^%FdDq8Ov9jerH+U4_!KX&cN_uiv2L>B0x^x$)80+8+ycPel z+zoxr9|$*^IKXzgnpK3DvfXyMk!^!3)@e9_X_(}6S|OOHRh5pN=>U~A?^|kn`Y8_6 zS$3AVd50my7*Qo;|8dcyu36=%ig(n)RfkwT!lE8Hx1PuC7ylgUi|U40On7eT>KF4g zEriboX-3j#{NlN@IpH^I_FctI{r#IMZ!XjEzV$_)f-VeJlCZnha+XwKchW zBo$xYL+s7dyU?FPa6l1Kt83=DfAqFfu(#Y+3KkUVD=3Kgb$?v+GU#-cYNKes)#HW$vC_yg z{qEl%J8OR$OQRjU21hz6Joa-hhy5pY@!uGBQAtWs{c4a>e$RygDle| zOZ?;^`Y=^3d*c|h83{AUB-h&oO18m5MEGS1VtD(}_POm`?s`SU|1(HYD}tD3(#y~NkWt>4B>S81XhBV+ zkhPqR`Cokur<3&ITz`vBK!@tlGuK1bTNUWHZ!wd~c9h+eyF}(#ooMpAWGg^KQH}sZycxC4785r~bR9|94R-%dhvDZlz%jfwF-D0-#h!IlO~-_gI6ms|wm@ zAQ7H&^dBY)+NxygrdPJ4DoV17dX2_k@){JKbOHK%3w$A2DOr)xFBa1Z&1JN>4lOW|=aRy?ccNwSd zH3Ss6zIx;)40H4OTr4|%I7N%4R)!!6j%;{6QDblud+Jfxa5RmZ%`|Vqq&8Cb;vt#1 z^_vZi2hgSdM4PCt0!v?-N5P^kP4~Gt;VrYyguc=mbNLNHIG#T9X0u*xRN;MfWwA^k zYYQBwE}nPewORW3;(OnzW!kwWT%a^T4jDxuF-)0%pWTgx&{5xo$=ElEa{BQPqMn3z z5qq>sPV7%Q?@DlmHp(AQ@CfINx6Jp=hnqJ3^^xB>h!fw+x7`AeV0#sUqNgw!)OfO^ zxv;rftp@36t4i`u>eyuE*R|dkcnWD;iQGrL!-^US(ugnBZ+F@#F6OI9n8>Q{vpLph z`kxx(ej@!9Wee$1eCsb4{z~6BeX>;y!-q;5N;{I&n-4Oum@dv?4wZ3BwT8~r5stdd z`bVWq`y@@SfZ!H+JKH5$LzNw{jnGG}gT=hGR5~|0+M=d(q`QmLrJ6WP2bH!qerfO2 zUafX(e($oP9I`<8c5Wqe#kJT-Kr$)c7js>mb2ViHnX7Q1(=E9!Dmen(I-5>@AODdc zn%_qtw>Ql@AK9SAn-4gKgiQVs6E;=2=W9FUMF1qi`Br)a*M`g1hq1KLx4+k*Bm!etB(HK*mnMSR&uVI%{@Hg64^gg3UF(@cP0b3Yp!v#J(o(;T)2BRBIz8MvfrJIkGZLL z&2HDIsFZO8^algIxv1&&W9w>7wx?8TcP4Qcojxf{f3YQqUj6#2T_9wUl0Pj#2&&6= zNP6P*@$a{p^PjAdHJrYly7-~u=fatS{_FaMb;`a-#l-_=TW}=QkkKV&7$|dvMYN!f zm)fuY9WP^|dzP)R_s|w^X@+8N+^clmu92U@(F5E|%c|gj{(>uQN+Fb7JnznE2VJX( zyNUAIG21(Cxft!#51H1^y&&#{U9(;751%}Ycs6|r%-B`=R!zXQ&=D+}ECE6+kqrq? zto*UtBOZz+N3h0equmrA_HN))*o5oxLIVoA7dH(byEI)S1=IR?I+I{`$0H#DWeDa0 zw8EWsqbcw$cIePUTaAao7E;n1ZOajmgjC7A2M^ai#<_0zpFhe@XYk>Z=v8IMNB3dE zjo^8PsHr?F`d!!JAd8&Cf6A4^>c-T!{_q-ni;|FTpw4g{j!>UYXY2WBRvU*M`+s%s zeYiH}^mdr(lbSfyrTz2~Z%?o`VdYwl^2xw@y+ckfl>ZVljrWMP5Y1>{UvA0i^Jo|i zA;9{Mh$}nGyVE>p6h%hpU@xo|56K(PRh7GRT{M-RMjA`LgK*4nt&}Cwh-_+VDmFbe z*VyG8GwNOJVzHiE>J*{0W;|D1n-pXwzuAq|#kQFQ)GAa}`a zqun47zCkwxMN-m9cPIB?<73eH`j(vez~X?zXV2|S^CH96exq+$C?`b+5N?(^hlppdEwEhO zY*0WbSzABt3r~I$N9>@r9o9$1P_DLKMN@(4hpw`ZPR-=HJy?!g(d#Bs7E#uPoZMK8%b>DXjhUqLtVG~z_e({$%NF5B5xHWzU! zLqp1Yf~6D0osd~kFbbxhhu`LO!2(S}0qHBBzbaUrzT0#j+pAF~=hM4`a_f8CJ9d5# z9re=YhYbg9x5snPcPwB}U|zES<)Ai&_a_WOwqT~^)ly?n1WI{QkcUw-m`o^}cO^uk znDKtjikBg548UbQDSF!Ok}LF>CNemGBDfpTBoZXJpgnP}G(Ps~#}9dwEZp}*Ilc#) zJR+QC6M^ryA}+#Fpn+TZ*{LPa#k{hh?$}e-`lt8aQA50a+!i!&T8%$^`E1EByxbms z*Hqa{SBQ#l^x)Xbmm&oopDa{nz&Q>{wJQCh{0CffttMG>)(B#*pdl<~?DK%#k45gP z-+$237xeXp8n!|(lOHtLIz$JQdc;b|yKqBjOdlD8^U>U5 zPk#hCR9<=qispios@vo67!G1V^~Mh0LfG(jbJE)%t%rt26P(Qp2I1y${z|4tGDOzTpU}LT~4!$6UNvZIX_vBcTT&$eyiDJ(#CZxDB6?O zH2F}HzC-M#uAMB5jXBKH6@vaNHwf_CRh_~ikS`l|RwycT&!eh!6OZWk7^>u|^Pm%W zmq;u_gEMklGk#XGmO9c=ZQyfr_wk?V&RwxzOAGhPbY2fBkli%sUa?N9!w@?Y!1q|% z0uj@4_=!!GvPFbUYe{Bdbc%Rh7vtR8=k5TaOsZ4(JSL--C961P7Le~ZwOyY70LfLRrh25sk2mar?YkK!67q8O{5i)ZubmDR$ z&(<{NDL1e;;iB19U4fdfP7C~qfJfeeTcXE}M9+W38CAuOy!O(7<9TpQYBkUyR^bKvVu} z_xP+8ACeUa@aqJXTGU5z1CVpbRy%D@}0Rm%8yJX18tSK3-He{W{`f~Y`F>Z?AyKz*;*X7Mj<_n zK*7psfU(0ax2;e3I)b4we3y|w(h5QzXT@)wQYOR`(r>OuzR0)Y^oCHiT&Qk< zvvD6#b-qru5f&l-w+(KCcK=)4NJm285V?Dh=Q8zRBE4-(+J<_GMffrgYfz#$jaItt zYsAjvACp?IaqA&K#;4Fmn*{1MH#zIuvizxR!z~ihkN5RRe>m!uw6H-D#E|2nGH-}9 zkrndqF@i}UC=te(llkW4J>GWag3f>F8&)|Eq zdN7){f*K1$V>(d##3E85mxRoHNbRBz0atd*#CwbW%MQtmo+lMe1@QH!9FBL@mx+*+ zUr0jqHi{ZWoE+7cOd9lDsqy#b!#|Skh7#eEK_mHTwtcxY`U)cwUHQIxYgj|S)){mu zJqawq|2ts*@9_Cwzq;Q4{nbVwU}!(+3X#s8n-ZhHl>G!2#-5pq_xenY@w2oGq_6n! z#a2^Uy9ZrSPT5eP_8|Zj`E!LyHWFT6z9)voAz2^iA=S5XsXkb=_gAf9(gbC*Z5$=B zjEaq#>IJ`6CxxF$6v(9E7j+SDnL%NY10n^dj*`S#-TOs~^e+)<9FkAfhFSq-3eA(# z3jl%%uH&q)9GprUT;!|yrZKaq=rIEwFzSk^<79qaN6{Yy^P>sWa)dGiF%lM&UcY7) zfAI(`*d`5Grxu#Ag*9R@J&(O{%0fI@30mr&W-Lt%3Y35A@15GmyF4;WGdd?pw;YVU z+=J+_5o2-H%77KRDI*ZrU3zN~ZK2P*XL-Hu zQ&K;%m_s7@{epx#!#K za_GW&BzuQFewu@^t~@72(xz+$YmADmMvFzA5xSOjxH|HF{l!DV7X~Uap&raQHNstm#x}dOwC$|ZKdD!@mhSuUiE9z33cA#PTx4fP{*en#-=5o zYmdR*obFUongO`ID&5M%-B*3vtZIfD|K>HYu+8N#DCyLcA64NDpsxFd^VsEn?y^ z#5=rF9S_#_Kyd4N+Bt38v4d|2KmH|h^K!o~A`AC$AaD;p8*=;}+1(^SAH5E^z?h?B zQ(DxaT=DM3WRIxDB6)i=0$*T4c-&{1A4ljDn9k>c@J>D#PD2j*oC^BAHz!$EIJvOC zBhYNK?RY$%(wDg%&oJ(r?4E8=k@7$R1_4qzB)P|pa`QGiO{(C!9^_}ak1n;&S;yo0 zIR*c>qUyi?D#b>i$tRsI$=8c1b)<<9f`raeY)9+%XUReWSde+kk(#h~T)C=F@5I%& z-aBk<(|b^k#aYe9|3Hh2?s-ca6o`?%AAl#58kc(E?_r8J>cNZ+HntXx(S#~CU^W&Kb2oc)8^;=B_+5lcRBTh0tGF;rxlDh^NqD}CyG=_X zp0Gb>i8G&nJS;qX+QoAqGoGc|8pDiQR34!^hDwl0s?ZOX(SCm_RqJ@-X+79AqY*?H zw$^=?pm0<@3!wM+W<-$L>z7kUZy2=L9 zy)eKT(UX(A#R4 zuG!)8ud(6&u`7%PQLq;-(|Zr4`Kg1Q?C|nT)BK4%U;10*8z?WS+_>)#whN!o9!FXJfFMh zZgw9>vZZiI8o+T@+`6WGHR*ge@C>jlXWc6%K4<*&N7bsj%$nq}gytv+zTw8j@g(`P z=Sy8x;YfMQW%I?nw?hO;uiFsP0l2M6!5C>i;QzyL{Gxh=6pu`sf}TSuWA`9N&!{N& zK@5=aRMH-aCfyw1Qh>}=$whW8WfjdoaQ-&zl*8vVdf&2^taeJsJf%ohA>q8>ZuV=z zBtbjAp(;iW1?mJR~-F%@~uKiYlDaFO`Io(t9 z^!bfenU=g|-TEoUSxI?97yY`nr4SWU6FT9oa)zj%MFlZ;u9ELQ?!G39GMz_7n~!U} zJ{%ff%Bi(q`XLjzZk{>^X!R~3)o#;Db%rt`f+FLhtF_JuvuGO-y$k5-^~22Axvbzr z)_j%WLr&>}J01?CmSXjIkJe0xpu+vxf`UlCNY3r#DBY>^8TXamDX}5cXs$wQ?+4zx zosOuYVY<7=#1VJaThIj+CIj7dpJ_9WQw;%t#MU|JI*dZ5u)+t4c({_@gzrEtA{R71o|W1 zg?ja;cUqPMX*lAQjLw7LKm3TI<%+5V#gg~=^u#TN?8ybWxF#xC2oXg*eV{T01uPIGaC z&)I`tE-A(+$lmvBiV|jCAA#e*&zJ3|IvAlT_^AwxEN8wm&2$$G@$kjlehAFhXS9xHd9_u#_kc&{P|r%HOzpf3@}^+QG`bt z?_zr@Vhp&YaND@9%_zldp_lvH&O`p~7LQ;4Hb;wjq2AX+AWQPBgLEKBZO{FJa?r0F(LQ;|~~Wr8RE|8{fv&pHimvM-$}fX9tj zc3Qad#bvWF+?{?*7B9oXLLgmh1uLwQMri9&)vWC|JIF(iY9G6L#Ilj>KxRY58^pl? znxURZ=J}2~`n`D= z8NWZwUF&h`oqpJ%h;pmmoc26?m&qxTV&nzj_Q|i%%kzeaMf$i6301}#8F3(a%(M=3 zVPL>uo2AhRM#BqOyc`;n86Oe`4!NYq@$rLQ)A_;(Z+xVZ$9O)xMy8^naizgQ2oj~X znAh8T%xY@=S}`?h{+08vU4wtnqYN2Gmu#&-M% zl(cm2TX{K(!Fr}uvxZ*Mq(|Iir+?tO*&;G|x4GGp>HsF_E%YW@g|p9YTMns#hG3+t zb~USVyY~A+pIfgNQ{Hvor0e^BEX^vKqSWE@OFb*F$K{MFtbO6u!@JT8+}M63*Kgwa zb8)6|Xd)}i_Yl_ZxKZPq37nbeJj#vQ_b79^DduV|XtSerXs&HPQUu-)@T4g)~qbK&-hwkIu>W*~x z2ySzn7ZstNw>{WdMp6_FleR5Sw%Wj-s;JMmse)zInV4)3v_f+HMC%P_7lD+v<|E%4$F7oNIA-J7m8=iv&eX+D)V#jxTeBSGbg$x z;#j)iSf5C<0t?82%N&avJ5x=-?!niV4|;(JK2I~jZ&2Lp&Ql8=-|9;xr--0Z{(6P* zUmrh8M7<;J?@s$6!&~Q@>G?0`GuBi=WF-WisC_QvK!Xm2#r$N7T=E~&6oFzw7 zb<$~9!p2V+yHuqsvxO~Nb&tL~9sL;=uRdxRLmp$KlCq%eNeG3`)i7Pt>ITL!Gf?xmWk zFH_&HS*>a}YRof{JROb;J`xAE`|QLex!YX1j$mG)AXZ3GwMG^_laOahrLiHO7)CM( zfhBRY)OsgvG^D2Hr9!q#4`?q#-t;uPm$=J23tlXoKuQv&IP9*%NgvvgFDu-bYhK#7 zEWIr6htD)%#h2jTP-WO-9>o3RlDd%FUcqZI(L)p5d2U*q?%I8C=B2X3`MC7ghPy)5 zwPP){{f&+Z*3x>#>YA+ex#Z2`C0hvb0Y*pGRbk=4W}5)qlSurv+oys-r%CacWY^DF)4hB%5f-LU5#M{U2K1kWQPNC0EJgh%g`877J`+_3RDWB!^o0)g` zdYgK;FVJwZlO|GGsMt$?t?_O1PE4l^km?KMty5UsPiubls$1k^K4^9a*y4)5 zdX0qhUmnG-uQN_ae8(N?edbHLe*y?hzjc*;ViI^E$O^~cyz{mkUiG@fx?~hlkJcv6 zEu(7SgEhp7<-ngwz+ZG(lu3JY?k4aH~SZzJD&E8D`I(i!= z_xzU!Xq>1E)Mg%V9Z8BL@qPY2Q=dir6I+Jc1Dq7fqG1q9;gRp+UQjAn1zc)$Pfk7` z){RN>a2|$=UW9l3@K^WH8rMSu3CI;cvPLyS)TelQ!!tKqXUv`T1p>a6vDp5 zhg_zyciM_)R|)oixr}m4?keBbHTejMs}Ngweg?E%kJH}7l~vZ6wYS`mLn|AW5%(6? z%x-k5rXIKCti<|j-06S79^cv>3SIe}9wldHPUKDJ3*mG^o>4l`E+Sl4rovA;*0?Jy zr=py(bYaVtrmG#XOUoo3!I~oKReRI=nlQ^|)Q#ePsgPej`6k;wU>kSahq!ZfY?cNT z3eP^ZO5gFo3l_sfv-Y%kJ0Dp8O>xdtE~CJ+62ktdHmCQ^YeTNS4#qG$1MLXjr^a~qVh4@o)ar_>;0$6PneOikZ&8M zOY7(Za-h)Y*`#pstLefOZrgku;aMJRZS^>~EiyiV)mW+s)NPK}T}Pic=px4&ef7tZ z&F+uvN~+2na`Js8E+cae0J*v+)vp1I@HQ*de&)({jrbge{@3@DsGWHpxzgIVF5moZ zuhm&>3ZL{dGQ1xSZq`)R?4q77l3YP9;H5nUU8?4%{#ChS@U4hJk$d!Wjgl^2YOC7% zazT#!iglZ}T<>KLtpCI!{2XUJ3gPB1X1L`EC&6i<`Gi7kmHMR4G9L7lzFxTTIBa!7 zgzewfp>(NdN1HvSjiao;VCK8=qs?ciq{_464 z6-qgwTBUDIe$z>DkNPZ{kMy5}d=KId)jDo1>gwQHjJPcWeyE1c<{ac8dw;-vngS}! zWv_lB+fw#!b7)2H4mGR`2}j9Y{cRN?d;kPt0pKl`EFQC%)F5SBr8d z?skfLgmOD57_N7Z9&3NPVsa8;m5C1O!@V4N7&zHcw!QfOEkXb1|D62O|0foC&m24+ zB zX6d57h7>lWrKKHT)rlBGMK0fZ-T9*&7nbD~u9CDfp2LJDpZbMwmxw4HqJ1u=cPTrz>*mGxyfsp_&rmpV+y-oLK=>2Dk`Xk%+G27|vLWwv9j^pFjt)Rlsd~7`i%^KO=Rx3x`nZG#{G30A`WPfFrZ-24)_d#0h?!Vc< zAl`iFhyOD)TU+5T%!j)Mkcp#9sin9%osFQSuQt}r#Gyv9->UkfNNdj!&{+lgW>9&c zC86RY{ONC%6jl4FB`h%Yn|SlNjYPP__9L`0bgBcV5nExk!|f04WrW0Sqi|#+Q>43A zGbD=p6PG@Pf^(etWN$Utm#N4U+x4iUv__*k5q4X% zxLtLM%6N&v4mG$;cbY&OYlGDC>kG8LHOxN~vK7!TUy2MdU;f6w)#hX3J;$YP z;M>p5yL9oM$vXJfiuL6*lN`D&K$vw1h~ z-thXpC>a8-iG2UurszVC+V2|$PuT4ebs7@IPc9G2ef5OQ%i4Lak)achmq~hC+$CnA z;6rneO7{c63u=+1e=~G;th`WJxcqVeeJ(oq=%2zV0MY?EcjT;}y9agJYim9J#HNTP zmpE$4@jI_R5vC*WJ#j|I$yO=?EPsCQhVs9?0KWb|>Y@J#x9qP-Vt?U(l_Jv*vNZ}% z($=JT3H8>()crS-3$n>V!4dO$XFTYA;>xFSvVqQXD-nUtVEG848xZ))z1bUy81>ZVLzhXD;CYad&1OJvXeucb z3TX-svyRAo97Q!U4^e2i&uSEIJ!LQD#M}N`#1y{aMez zvB&PtP= z$z`Yr=*HW>THfYx06&OA=rXCos0>tYF&Wiayp@X+SYe@+Oo%CZ5dmpulaK*2IrBepP ze-DO7x#WS+*X2yl@0(8YPOT=_3;#ZZ+15Lai+}*mHz*x9_Y)_jOu3Z04MFPeEQfPt z>dRx~#aS<#mnU^uEzDd>mAiH1xrKi=3(^NlJu2_FPY!(#l(ojE&lBABxhn((myRa` zvCfDg9)hRI{f$t7*K!hT=PVZgUG}8B$BIakB{h5(Loh_0LFnbi%_pV2!M*M@>t(d) zWSh`;;rZO}W%A(x`S{G^@>r;IGUuvUsVEBJiaLsK^!ZfVk7&3}yjXa==j70FTSvH# zirp6eX&qEPQ~&#F4)rfh_GBHGIk^RS1PMSNe&XtJgv(WO%Grveg)1Y-9krCO#TT@! zhlTOGpr9|F3u+oX=<^M%!MhICB*Kw$1=pb!Hu@yGaoiGdJr`5IFJ4$qZG!l$FT1-z z7UZky)x=RV8nf6mf2u!Tp+n2s z=*#5{p%rUvw`5K0wiK`hkeDBsqI16orx0?%PjaONo^owsllpMrw{_7MwY@ye0owj_ zujX$rCl~H>EtiEcmQd7@WfiF%bGJY>X&dn)%)&bIUqQMMR~`z^2{)58av? zbXzNeN8r3E4m~YWSU%CvPi<8wy`QdmgCcZX=D1y_KybKc9<=aTitN4EV?bzEX|S$9-!2nb5iIXy z;_Uv@NzF}DNy$|2S)uaP-95p&rKge6z-y|b>G=qH zSAXrgoFQ`iOV}*bi{gNS|28mDac=n+jLzb>{*270cP3v9)R9mp-6SJS{{4+7YJl=O zI9ojD5=*5i0@cvs^Jmq4HR4<=*8Tu=g7+MjJgaPd2kBA2t@1)W!nZ>a4EyKKk$)uH zi= zmJx)Li5sN8L7gnRe^u@A@3Ug53?)((tziD7bN-qAoj1I^Q|8?r3H2Q5zfvDznpG{X zVCSif0DORGir*) zBirWBK|tQSid1)XhVlb-ud%D6_9|yG!Qg`=znky+fOnSpWon)}oVrI9{a+ej;0nJP z;H7Sri!Ur=(_?jc*$U;jsp{z&>a)sv<-1SP9`b_0)^7X{xVT%Z2U`ieWOMi1KNJzp zs$POLxW8S59KNR%ty(i0$)x&!0ABymsj{;mpi6G2YrgrwB%#hxcBUn6@w@U&?X}zQ zR^ez>oU-c>7mIcgaz<%&{k`)Cd`Hmhiajt6%3&+TFcBeFrUNWi>I={`GBoFY3wO6u z6}R!d(XwztpBw+%0;8rf3q66T3H;DKEomMOGWd;_io6)w&B953dU)PX=qEI5{Bm5x zRzo7h?)P(%!|SkQw~(Fh6aq^Gg&6ms-u(Q6-!)M}ozDrCFCe86>m(TND^z8E$p zwl3rKtI~pqJe;dG9xg&yjvB_bJF2cQ#$Td+rr5ZYIZsOGsvzZBdJJ!`8KK-y;ZMcy zvZa(HpFdU${u5)NpN=H{eVsD!2ESoov7SNfO!sY#oP`)o8%q+VziszB{a~O&G|3!( zlqoU%i$q*Ad{94eu{&Kgo4Y75^jrWAe`|GEy~WisYkxfB-{R;CPdHT(vUOWORo*is znFS8?Hp(GyeFjR=GEF}5ae)Cz^28U3st4}E^VyvRYgkv!h)=AJ1PLX4xa~=tha_DMGyBn`f&dy(WsM9a*o(Fq1~dYbQ1PBp}dt*>BzF7#nzx*|yPM7Z~1ro&JO3 zlCAwJ_SO$b!$9i0PvyE6I*#h^^}f0q1C>VY*DK+g(2#(Ce}o={mTiR?&F!#_bjd1uVF# zD6=Vd8q(kQ9%YaC8*!@D+VnjLeZ0Ziy2Qmip4XPz z_oJU+2k+H2J3|k0{9HV|?4RFJ6m9+~t3qoi7r8u83N~T8Tsq#&4au!Z^p@0PEo`!k6Np<8yeZJaT$`xD}Mjw;W!k`f~V``NV}-V|`pa94d?uWrqWu&~CTmAY-T z5%d*WvT5&d_dEa$Y}0uPmTPQlt?-A2RQriXNe-CLI9F|0w6PfFi12~rw7DY5i>$x>p(#iM2GRxbIZ&@QbR&kC3zW9C zo4Ad#0hJFPZw%VX;FiRe?{TGc$!vC8oQApiow*-J++{N>H(n8tz{nG|%<-4q8Xy)s z#j>}Lgdg?`fOslnZGwx8cU>8xAYcn4I_K%`SpT#-85t6;FIsV({~3~xWGHF zTAc?fx(vP2Dc=J(nR$?szdLn1AEynSU}# zGXhDaeT~^kT6ibzGi_y&c6nUIw`X27kA1kkN3R&*&aqYt*Q*bLigMk}a~kuR5$t3Z zWfP6dMor8ZjNILJ%PxX=n4pC9NEliKee2V6LTh{q zDy#fuV_RCia;B~a?OYj^@U1dg2$*D_TXQ*^A3VrV8}mlVF=CNDEzq$B8fZJ9#RF9f z^gDCB+z{-yV3m_x8pUN;J3f^vCjg0=50X!(dw#R4Ip4&^1zKhQaYDj(+kx`c!2PSFs%B1e755A7 z(9PZ}h)Ualdiy{QO6(~5&difJ4y;f1wHR??iQ03yi?z-U_E17j?7bmzBl{BnNnLCf zU_{#$Ut4h=@#D-IZ&3_b*lbtuH1yjs9A`~GMl+b`pV8pBwfK@czpA!Hu58~y7mBmj z5?jr2N*abhVNm!0!9wBMb*A8TRUACRti8UV;43S5V{JE3#MxMU8h!@;x=ttz?>{Aj z8(y?auYNp~g7IA8^7*vy&$~VRW~=N3DV3T@$T7&I?PYBe(!EAk0eseb2Jz$nBnY9_ z)B@ILh3jLKM_wr{E??_@O=%Ueu$CsIH^it?*puZF%0f{DbA9ui=y=XV-{j0BYUlLl*eJ}3^X|k(?DpE7%-W<7g+sa4h~N(O=mb?2 z6{#SgH1&wdV46|Gx$7JXSH5o}Zs0#G_^A)+X4RDS#H=^;QF`3Kt}M{<20Go#TCUzs zVSGL3v75;lWKSeB>Nltz6dO@|ciT=SDiw@392`og`?#w}$;H^T`L!f@<|N1>5Lo{y z&xa*6Ox;lrO=uC-2Hf^_*sR(n3jvY;>gXN8NtIY*A?;msYLg8WlD3tgUsldWU(>CoOAf$*;3I z)=n-9caK(^iIYQAF0(wA?3jrGF9Sd>ESO z{~QP#-u{q&H#+A*ZNk^_u3d1&o;op%h^>y&&z_wJw$Kb&U{*8kwnBY884NWqwwZLk zoG>DWBx$^hR4P>^&ou;L4#eo_K8wD%fF#eYF>&Vl4+P9L=Xvw2DYv)Oeed2aYDaBQ zo@=YLCkthj6~%%Fhctz(mmRocr$$~Uzu_Q-PeJDlq80m!Kf$tCX;s_DB?=lVfw7TC({{L{?+vBe^xKu$$r+_=C0j(~ZYCOu8ezu^T)8>INq%Bsy{_iQLr*Rz{c^JB}aA>hi# zpEFk;DDK^9UwIVd7j=?PSbY712RXc1dG*!3YwN?ROGXbYon_ZYeb35_EH8g(c^a+l zpS+)9eC4S@csj#ws&%y~061g5SmF`N0MylMC7JJH2tH`jseh9mA zK9`|WO}XuOxxYCsW5#2*JN9e$i7~~DCJG&{BrLrDd)J15RP0_ee6O5&aSU4?!qQe$=zsm$B8wUf)mNZnLK3+ z^h}Y_Z)3{ogqnO93Lp)flnj7XcM704uF|&#u zv$z~BIf$xm*fK!fP8j3Z)8ekxz4oe(N-wnWj=_V%+W~FK*2&*864g3IL6>%p8zBsL zY6Hw}#;sW!{yR{;KG!|Wm@39|Q?u=4=Gh!lX)<^Pqv=L0|K|9>OGKq?&bH9n(y(93 z-EH?ug6inDm*5Q4AshP94bYuqp#_X@O_Hv$T(IDzQp*gH-|t)SqN3R?PEmTGf1iak zz(s9)H`N+kYnq}4;f4uSaZn-Qe5JUup$iJqU%2jXNz~%dU!$ReI6g%{~ zQtJ{AM$!)k&L;(>&+EVA4sAQxjlBnp+ZQ?9>DXhKTb*ih$|$;#9RPhv@*lcfco#Iz z6Uo~EEksz^37T3MN2T^v@T*dx^8~3d_do8Ln!cPlnmElVz&OeXyT5!3x;>j==Up{g ziw^BRAKO%0DcLGtX89#Qma&9 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 It5}8oFCE7 + + + + + Scalekit website redesign — reference + + + + + + + +
+ +

Homepage

+

+ A developer-first homepage that replaces both the current marketing site and docs landing + page. Two-door entry: Auth for Agents (primary, purple) and Auth for Apps (secondary, + green). +

+ +
+ +
+
+
+
+
+
+
scalekit.com
+
+ + + + + +
+
Authentication infrastructure for AI-era applications
+

Auth used to be one problem.
AI made it two.

+

+ Your app needs to authenticate the people and agents connecting to it. Your AI + agents need to authenticate to the external services they connect to. These are + fundamentally different problems. Scalekit solves both. +

+ + +
+ Inbound and Outbound auth architecture diagram +
+ + +
+ +
+
Outbound · Primary product
+
Connect your agents
+
+ Token vault, delegated OAuth, auto-refresh. 100+ providers. Works with every major + AI framework. Your agents connect to anything without managing credentials. +
+
+ LangChain  ·  OpenAI  ·  Anthropic  ·  Vercel AI +  ·  Google ADK  ·  Mastra +
+
+ // Give your agent a Gmail tool
+ const + token = await + scalekit
+   .getToken({'{'} provider: 'google',
+     userId, scopes: ['gmail.send'] {'}'}); +
+ Quickstart: Agent Auth → +   View 100+ providers +
+ + +
+
Inbound · For your app
+
Authenticate your app
+
+ Full-stack login, organizations, RBAC, SSO, SCIM, MCP server security. Everything + users and agents need to authenticate into your application. +
+
+ // Node.js — add login in 3 lines
+ const + url = scalekit.getAuthorizationUrl({'{'}
+   redirectUri: process.env.REDIRECT_URI
+ {'}'});
+ res.redirect(url); +
+ Quickstart: For Apps → +
+
+
+ + +
+
Already have an auth system? Add what you need:
+
+
+
Modular SSO
+
Add SAML/OIDC without replacing your stack
+
+
+
Modular SCIM
+
Plug-in user provisioning from Okta, Azure
+
+
+
MCP Auth
+
Secure your MCP server with OAuth 2.1
+
+
+
API Auth
+
M2M tokens and scoped API key management
+
+
+
+ SOC 2 Type II + ISO 27001 + GDPR + 99.99% uptime + US + EU data residency + → View pricing +
+
+
+
+ + +
+ +

Site structure

+

+ Two domains, two audiences, one source of truth. + scalekit.com is for human developers. + docs.scalekit.com is a machine-readable API layer for coding agents. +

+ +
+
+
scalekit.com — human developers
+
+
/   Homepage
+
+ Two-door hero (inbound / outbound)
+ Pricing · Security · Enterprise · Footer +
+ +
+ /for-agents/  ← Auth for Agents +
+
+ quickstart · overview · how it works
+ connected-accounts · token-vault
+ tool-calling · delegated-oauth
+ frameworks/  langchain · openai · anthropic · vercel · adk · mastra
+ providers/  google · slack · salesforce · +95 more +
+ +
+ /for-apps/  ← Auth for Apps +
+
+ quickstart · overview
+ full-stack-auth/  login · session · orgs · RBAC
+ modular-sso/ · modular-scim/
+ mcp-auth/ · api-auth/ +
+ +
+ /sdks/  shared across both +
+
node · python · go · java · expo
+ +
/apis/   /pricing/   /changelog/
+
+
+ +
+
docs.scalekit.com — coding agents
+
+
/   Agent entry point
+
+ llms.txt  ← product overview for LLMs
+ llms-full.txt  ← full context dump
+ sitemap.xml  ← machine-readable +
+ +
+ /mcp/  MCP server (SSE) +
+
+ search(query) tool
+ get_page(path) tool
+ list_products() tool
+ get_code_example(product, lang) tool +
+ +
+ /context/  structured context files +
+
+ for-agents.md · for-apps.md
+ sdks.md · errors.md +
+ +
+ /pages/  clean markdown mirror +
+
+ No sidebars · No JS · No images
+ Pure content for agent consumption
+ for-agents/** · for-apps/** · sdks/** +
+ +
+ /search  REST semantic search API +
+
GET /search?q=<query>
+ +
+ /openapi/  spec.json · spec.yaml +
+
+
+
+ +
+

+ Key insight: + docs.scalekit.com is not a parallel docs site — it's a machine-readable API layer over the same + content. Coding agents (Cursor, Claude Code, Copilot) hit docs.scalekit.com. Humans hit scalekit.com. + Same source of truth, two rendering targets. +

+
+
+ + +
+ +

Docs experience

+

+ Both product lines share the same doc shell. A product switcher in the sidebar lets + developers move between the two. Each sidebar has a persistent cross-sell prompt at the + bottom. +

+ +
+ + + +
+ + +
+
+
+
+
+
+
scalekit.com/for-agents/
+
+
+
+ +
+ 🤖 + For Agents + +
+ + +
+ +
+
For Agents › Get started › Overview
+
Agent Auth
+

+ Connect your AI agents to external services — Gmail, Slack, Salesforce, and 100+ more + — without managing OAuth flows, storing tokens, or handling refresh logic. +

+ +
+
What you'll build
+
+ 1. User connects their Google account via your app
+ 2. Scalekit stores the token securely in the vault
+ 3. Your agent calls scalekit.getToken() at task time
+ 4. Token is returned, refreshed automatically if expired +
+
+ +
+ + + + +
+
+ // Retrieve a token for a user's Google account
+ const + token = await + scalekit.getToken({'{'}
+   provider: 'google',
+   userId: 'user_123',
+   scopes: ['https://www.googleapis.com/auth/gmail.send']
+ {'}'});

+ // token.accessToken is ready to use +
+
+ +
+
On this page
+
Overview
+
How it works
+
Prerequisites
+
Quickstart
+
Next steps
+
+
For AI assistants
+
docs.scalekit.com/mcp
+
+
+
+
+ + +
+
+
+
+
+
+
scalekit.com/for-apps/
+
+
+
+ +
+ 🏗️ + For Apps + +
+ + +
+ +
+
For Apps › Get started › Overview
+
Auth for Apps
+

+ Everything your B2B application needs for authentication — login, sessions, + organizations, RBAC, SSO, SCIM, and MCP server security — in one SDK. +

+ +
+
Products in this section
+
+ Full Stack Auth — complete login, session, + orgs, RBAC
+ Modular SSO — add SAML/OIDC to any existing + auth system
+ Modular SCIM — user provisioning from Okta, + Azure AD
+ MCP Auth — OAuth 2.1 security for your MCP + server
+ API Auth — M2M tokens and scoped API keys +
+
+ +
+ + + + +
+
+ // Add login to your app
+ const + url = scalekit.getAuthorizationUrl({'{'}
+   redirectUri: process.env.REDIRECT_URI
+ {'}'});
+ res.redirect(url); +
+
+ +
+
On this page
+
Overview
+
Products
+
When to use each
+
Quickstart
+
Next steps
+
+
For AI assistants
+
docs.scalekit.com/mcp
+
+
+
+
+ + +
+
+
+
+
+
+
+ docs.scalekit.com — machine-readable layer +
+
+
+

Agent entry points

+

+ This domain is not for humans. It's a programmatic API layer for coding agents (Cursor, + Claude Code, Copilot). Humans never need to visit it directly. +

+ +
/llms.txt
+
Product overview + SDK naming conventions + page index
+
/llms-full.txt
+
Full context dump — all docs in one file
+
+ +
+ /mcp + — SSE endpoint +
+
+ search(query)  — semantic search across all docs +
+
+ get_page(path)  — fetch any doc page as clean markdown +
+
+ list_products()  — list all products with descriptions +
+
+ get_code_example(product, lang)  — get code by product + language +
+
+ +
+ Add to your coding agent config: +
+
+ { + `{ + "mcpServers": { + "scalekit-docs": { + "url": "https://docs.scalekit.com/mcp", + "type": "sse" + } + } +}` + } +
+ +
/context/for-agents.md
+
+ Full agent auth context — drop directly into an LLM context window +
+
/context/for-apps.md
+
Full app auth context for LLM consumption
+
+ +
/pages/**
+
+ Clean markdown mirror of all doc pages. No sidebars, no JS, no images. Pure content. +
+
+ +
/search?q=<query>
+
+ REST semantic search API — returns ranked doc excerpts + URLs +
+
+
+
+ + +
+ +

Pricing

+

+ Two independent pricing models — one per product line — displayed as tabs on a single + pricing section. Each model has its own unit economics. +

+ +
+
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
TierPriceIncludes
Starter$010 connected accounts · 5k tool calls/mo · 5 providers
GrowthCustom500 connected accounts · 100k tool calls/mo · 100+ providers · then per-unit
EnterpriseCustomUnlimited · dedicated vault · custom residency · SLA
+
+ Overages: per connected account + per tool call

+ Connected account — a single user's OAuth connection + to one external service (e.g. one user's Gmail)
+ Tool call — one call to getToken() by your agent, + regardless of whether the token was cached or refreshed +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
TierPriceIncludes
Starter$01k MAUs · 3 MAOs · 0 SSO connections
GrowthCustom10k MAUs · 50 MAOs · 3 SSO connections · then per-unit
EnterpriseCustomUnlimited MAUs/MAOs/SSO · custom domain · audit logs · SLA
+
+ Overages: per MAU + per MAO + per SSO connection

+ MAU — monthly active user who authenticates into + your app
+ MAO — monthly active organization (a tenant/workspace + in your app)
+ SSO connection — one configured enterprise IdP (Okta, + Azure AD, etc.) for one organization +
+
+
+
+ + +
+ +

Design tokens

+

+ Color palette and visual language. Dark by default — signals developer-first. Purple for + Agent Auth. Green for App Auth. +

+ +
+
+
+
+
Background
+
#0a0a0f
+
+
+
+
+
+
Surface
+
#0d0d14
+
+
+
+
+
+
Border
+
#1e293b
+
+
+
+
+
+
Text primary
+
#f1f5f9
+
+
+
+
+
+
Text secondary
+
#64748b
+
+
+
+
+
+
Agent Auth accent
+
#6366f1 (purple)
+
+
+
+
+
+
App Auth accent
+
#10b981 (green)
+
+
+
+
+ Aa +
+
+
Typography
+
System UI / monospace code
+
+
+
+ +
+ SDK variable naming (non-negotiable): +   Node.js: scalekit +   Python: scalekit_client +   Go: scalekitClient +   Java: scalekitClient +
+
+ + + + + + + From 4bdc88c418a31333c0de18b3ca1b22280e7d18e5 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Thu, 26 Mar 2026 19:48:09 -0700 Subject: [PATCH 08/40] chore: ignore superpowers and docs/superpowers directories --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 912eb0c80..91a9f669d 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,5 @@ skills-lock.json .windsurf/ .tmp/ .firebase/ +.superpowers/ +docs/superpowers/ From 1300f6ce0dddf376401f6f873eefbad77847f120 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Thu, 26 Mar 2026 20:07:04 -0700 Subject: [PATCH 09/40] fix: prerender redesign page for static Firebase hosting --- src/pages/redesign.astro | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/pages/redesign.astro b/src/pages/redesign.astro index bf81e0053..bef749fe0 100644 --- a/src/pages/redesign.astro +++ b/src/pages/redesign.astro @@ -1,6 +1,7 @@ --- // Standalone reference page — no Starlight layout // Scalekit website redesign concept for internal team review +export const prerender = true --- @@ -1464,19 +1465,23 @@
search(query)  — semantic search across all docs + >— semantic search across all docs
get_page(path)  — fetch any doc page as clean markdown + >— fetch any doc page as clean markdown
list_products()  — list all products with descriptions + >— list all products with descriptions
get_code_example(product, lang)  — get code by product + language + >— get code by product + language

From bfbcbad8c674b9642d4015c3eb6283271a4687a9 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Thu, 26 Mar 2026 20:12:18 -0700 Subject: [PATCH 10/40] fix: serve redesign page as static HTML in public/ for Firebase hosting --- .../redesign/index.html | 320 +++++++++--------- 1 file changed, 159 insertions(+), 161 deletions(-) rename src/pages/redesign.astro => public/redesign/index.html (86%) diff --git a/src/pages/redesign.astro b/public/redesign/index.html similarity index 86% rename from src/pages/redesign.astro rename to public/redesign/index.html index bef749fe0..428fdfbc9 100644 --- a/src/pages/redesign.astro +++ b/public/redesign/index.html @@ -1,9 +1,3 @@ ---- -// Standalone reference page — no Starlight layout -// Scalekit website redesign concept for internal team review -export const prerender = true ---- - @@ -951,14 +945,13 @@

Homepage

-
+
LangChain  ·  OpenAI  ·  Anthropic  ·  Vercel AI  ·  Google ADK  ·  Mastra
- // Give your agent a Gmail tool
- const - token = await - scalekit
-   .getToken({'{'} provider: 'google',
-     userId, scopes: [// Give your agent a Gmail tool
+ const + token = + await + scalekit
+   .getToken({ provider: + 'google',
+     userId, scopes: ['gmail.send'] {'}'}); + >] });
Quickstart: Agent Auth → -   View 100+ providers
@@ -1027,21 +1019,20 @@

Auth used to be one problem.
AI made it two.

users and agents need to authenticate into your application.
- // Node.js — add login in 3 lines
- const - url = scalekit.getAuthorizationUrl({'{'}
-   redirectUri: process.env.REDIRECT_URI// Node.js — add login in 3 lines
+ const + url = + scalekit.getAuthorizationUrl({
+   redirectUri: process.env.REDIRECT_URI
- {'}'});
+ });
res.redirect(url);
Quickstart: For Apps → - + +
@@ -1070,10 +1061,11 @@

Auth used to be one problem.
AI made it two.

GDPR 99.99% uptime US + EU data residency - → View pricing + → View pricing
- + +
-
+
-
-
+
+
+
scalekit.com/for-agents/
@@ -1261,7 +1255,7 @@

Docs experience

- +
- // Retrieve a token for a user's Google account
- const - token = await - scalekit.getToken({'{'}
-   provider: 'google',
-   userId: 'user_123',
-   scopes: [const + token = + await + scalekit.getToken({
+   provider: 'google',
+   userId: 'user_123',
+   scopes: ['https://www.googleapis.com/auth/gmail.send']
- {'}'});

- // token.accessToken is ready to use + });

+ // token.accessToken is ready to use
@@ -1329,15 +1322,11 @@

Docs experience

-
+
-
-
+
+
+
scalekit.com/for-apps/
@@ -1384,15 +1373,16 @@

Docs experience

Products in this section
- Full Stack Auth — complete login, session, - orgs, RBAC
- Modular SSO — add SAML/OIDC to any existing - auth system
- Modular SCIM — user provisioning from Okta, - Azure AD
- MCP Auth — OAuth 2.1 security for your MCP - server
- API Auth — M2M tokens and scoped API keys + Full Stack Auth — complete login, + session, orgs, RBAC
+ Modular SSO — add SAML/OIDC to any + existing auth system
+ Modular SCIM — user provisioning from + Okta, Azure AD
+ MCP Auth — OAuth 2.1 security for your + MCP server
+ API Auth — M2M tokens and scoped API + keys
@@ -1402,15 +1392,14 @@

Docs experience

-
- // Add login to your app
- const - url = scalekit.getAuthorizationUrl({'{'}
-   redirectUri: process.env.REDIRECT_URI + // Add login to your app
+ const + url = + scalekit.getAuthorizationUrl({
+   redirectUri: process.env.REDIRECT_URI
- {'}'});
+ });
res.redirect(url);
@@ -1424,9 +1413,9 @@

Docs experience

Next steps
-
For AI assistants
+
For AI assistants
docs.scalekit.com/mcp
@@ -1435,20 +1424,19 @@

Docs experience

-
+
-
-
+
+
+
-
+
docs.scalekit.com — machine-readable layer

Agent entry points

-

+

This domain is not for humans. It's a programmatic API layer for coding agents (Cursor, Claude Code, Copilot). Humans never need to visit it directly.

@@ -1464,41 +1452,33 @@

Agent entry points

— SSE endpoint
- search(query)  — semantic search across all docs
- get_page(path)  — fetch any doc page as clean markdown
- list_products()  — list all products with descriptions
- get_code_example(product, lang)  — get code by product + language

-
+
Add to your coding agent config:
- { - `{ - "mcpServers": { - "scalekit-docs": { - "url": "https://docs.scalekit.com/mcp", - "type": "sse" - } - } -}` - } + { `{ "mcpServers": { "scalekit-docs": { "url": "https://docs.scalekit.com/mcp", "type": + "sse" } } }` }
/context/for-agents.md
@@ -1534,16 +1514,18 @@

Pricing

pricing section. Each model has its own unit economics.

-
+
- + Agent Auth + +
@@ -1564,8 +1546,9 @@

Pricing

Growth Custom - 500 connected accounts · 100k tool calls/mo · 100+ providers · then per-unit + + 500 connected accounts · 100k tool calls/mo · 100+ providers · then per-unit + Enterprise @@ -1575,12 +1558,12 @@

Pricing

- Overages: per connected account + per tool call

- Connected account — a single user's OAuth connection - to one external service (e.g. one user's Gmail)
- Tool call — one call to getToken() by your agent, - regardless of whether the token was cached or refreshed + Overages: per connected account + per tool + call

+ Connected account — a single user's OAuth + connection to one external service (e.g. one user's Gmail)
+ Tool call — one call to getToken() by your + agent, regardless of whether the token was cached or refreshed
@@ -1596,30 +1579,30 @@

Pricing

Starter - $0 + $0 1k MAUs · 3 MAOs · 0 SSO connections Growth - Custom + Custom 10k MAUs · 50 MAOs · 3 SSO connections · then per-unit Enterprise - Custom + Custom Unlimited MAUs/MAOs/SSO · custom domain · audit logs · SLA
- Overages: per MAU + per MAO + per SSO connection

- MAU — monthly active user who authenticates into + Overages: per MAU + per MAO + per SSO + connection

+ MAU — monthly active user who authenticates into your app
- MAO — monthly active organization (a tenant/workspace - in your app)
- SSO connection — one configured enterprise IdP (Okta, - Azure AD, etc.) for one organization + MAO — monthly active organization (a + tenant/workspace in your app)
+ SSO connection — one configured enterprise IdP + (Okta, Azure AD, etc.) for one organization
@@ -1638,49 +1621,49 @@

Design tokens

-
+
Background
#0a0a0f
-
+
Surface
#0d0d14
-
+
Border
#1e293b
-
+
Text primary
#f1f5f9
-
+
Text secondary
#64748b
-
+
Agent Auth accent
#6366f1 (purple)
-
+
App Auth accent
#10b981 (green)
@@ -1689,7 +1672,15 @@

Design tokens

Aa
@@ -1701,25 +1692,32 @@

Design tokens

- SDK variable naming (non-negotiable): -   Node.js: scalekit -   Python: scalekit_client -   Go: scalekitClient -   Java: scalekitClient + SDK variable naming (non-negotiable): +   Node.js: scalekit   Python: scalekit_client   Go: + scalekitClient   Java: scalekitClient

Scalekit website redesign · Internal reference · 2026-03-26

-

- Design spec: + Design spec: + docs/superpowers/specs/2026-03-26-website-redesign-design.md -  ·  Implementation plan: docs/superpowers/plans/2026-03-26-website-restructure.md

From 53e41eccf362cacdd0750bb13586b3e435277328 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Thu, 26 Mar 2026 20:19:31 -0700 Subject: [PATCH 11/40] fix: repair JSON block and restore redesign page for local dev --- public/redesign/index.html | 4 ++-- src/pages/redesign.astro | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 src/pages/redesign.astro diff --git a/public/redesign/index.html b/public/redesign/index.html index 428fdfbc9..0cda875ae 100644 --- a/public/redesign/index.html +++ b/public/redesign/index.html @@ -1477,8 +1477,8 @@

Agent entry points

Add to your coding agent config:
- { `{ "mcpServers": { "scalekit-docs": { "url": "https://docs.scalekit.com/mcp", "type": - "sse" } } }` } + { "mcpServers": { "scalekit-docs": { "url": "https://docs.scalekit.com/mcp", "type": + "sse" } } }
/context/for-agents.md
diff --git a/src/pages/redesign.astro b/src/pages/redesign.astro new file mode 100644 index 000000000..3993f6d87 --- /dev/null +++ b/src/pages/redesign.astro @@ -0,0 +1,7 @@ +--- +// Local dev only — imports and renders the static public HTML directly. +// Firebase hosting serves public/redesign/index.html as a static file. +import htmlContent from '../../public/redesign/index.html?raw' +--- + + From 7e507d006b18bf8c803799d806609dfb2a02566a Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 11:52:14 -0400 Subject: [PATCH 12/40] docs: add docs chatbot flywheel design spec --- ...2026-03-30-docs-chatbot-flywheel-design.md | 326 ++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 project-docs/2026-03-30-docs-chatbot-flywheel-design.md diff --git a/project-docs/2026-03-30-docs-chatbot-flywheel-design.md b/project-docs/2026-03-30-docs-chatbot-flywheel-design.md new file mode 100644 index 000000000..c63f74b1f --- /dev/null +++ b/project-docs/2026-03-30-docs-chatbot-flywheel-design.md @@ -0,0 +1,326 @@ +# Docs Chatbot Flywheel — Design Spec + +**Date:** 2026-03-30 +**Status:** Approved +**Scope:** Embeddable docs chatbot + Pylon feedback loop + Slack bot + +--- + +## Goal + +Build an ever-evolving developer documentation system where every unanswered customer question improves the docs for the next customer. Three components work together as a flywheel: a docs chatbot, a Pylon issue → PR drafting loop, and a Slack bot. + +--- + +## Decisions made + +| Question | Decision | +| -------------------- | --------------------------------------------------------------- | +| Chatbot engine | Custom-built with Claude API (not SaaS) | +| Docs update workflow | Agent drafts PR, human reviews and merges | +| Slack integration | @mention only (any channel) | +| Pylon issue creation | User-initiated with confirmation | +| Pylon → docs trigger | On issue close AND on substantive team comment | +| Doc search approach | Direct llms.txt custom sets (no mcp.scalekit.com, no vector DB) | +| Agent runtime | agentboard (scalekit-inc/agentboard) for all agents | + +--- + +## Architecture overview + +Three input surfaces, two agents, one shared flywheel. + +``` +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ Docs widget │ │ Webflow / app │ │ Slack @mention │ │ Pylon webhook │ +│ docs.scalekit.com│ │ script tag │ │ any channel │ │ close / comment │ +└────────┬────────┘ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ + └──────────────────────────┬───────────────┘ │ + ↓ ↓ + ┌──────────────────┐ ┌──────────────────────┐ + │ Agent 1 │ │ Agent 2 │ + │ Chatbot │ │ Gap Analyzer │ + │ (AgentRunner) │ │ + PR Drafter │ + │ │ │ (AgentRunner) │ + │ tools: │ │ │ + │ - search_docs │ │ tools: │ + │ - create_pylon_ │ │ - read_pylon_thread │ + │ issue* │ │ - search_docs │ + └────────┬─────────┘ │ - create_github_pr │ + │ └──────────┬───────────┘ + ┌────────────┼────────────┐ │ + ↓ ↓ ↓ ↓ + llms.txt Pylon MCP Slack Block Kit GitHub MCP + custom sets (issue) (confirm button) (PR → human review) + +* requiresConfirmation: true +``` + +--- + +## Component 1: Chatbot widget + +### What it does + +A floating chat widget embedded on any web surface. Users ask questions in natural language. The agent answers grounded strictly in docs content. If it can't answer confidently, it offers to create a Pylon support issue. + +### Widget delivery + +A self-contained JS file served from a CDN. No framework dependency. Embeds the same way on any surface: + +```html + + + + + +``` + +The Astro/Starlight layout override includes the script tag. The React components from agentboard (`AgentTerminal`, `use-agent`, `MessageStream`) are bundled into this CDN file. + +### User identity + +Two modes: + +- **Anonymous**: No identity set. When the user initiates Pylon issue creation, the widget asks for an email inline (optional — user can skip; issue still created). +- **Identified**: App calls `ScalekitChat.identify()` after its own auth. User context flows into `AgentContext` and is automatically included in any Pylon issue created. + +### Answer flow + +1. Widget POSTs `{ question, conversation_history }` to `/api/chat` on the backend. +2. Backend builds `AgentContext` from the request (anonymous or identified). +3. `AgentRunner` calls `search_docs(query)`: + - Classify query into product area (FSA / SSO / Agent Auth / MCP / SCIM / M2M / etc.) + - Load matching custom set from generated `llms.txt` files (defined in `llms.config.ts`) + - Return relevant content to Claude as context +4. Claude evaluates with system prompt (see below). Two outcomes: + - **Confident answer**: Return answer with source page citations. Log question + answer. + - **Not confident**: Return "I don't have a good answer for this. Want me to create a support issue?" User confirms → `create_pylon_issue` fires (with full conversation + user context). +5. Thumbs-down on a confident answer also triggers the Pylon issue offer. + +### System prompt (chatbot) + +``` +You are the Scalekit docs assistant. Answer questions using only the content +returned by the search_docs tool. Always cite the source page path in your answer. + +If the search_docs results don't contain a clear answer to the question, +say so explicitly — do not guess or invent information. Offer to create a +support issue so a human from the team can follow up. + +Keep answers concise. Link directly to the relevant docs page. +``` + +### Agentboard configuration + +```ts +const tools = new ToolRegistry() +tools.register(searchDocsTool) // llms.txt custom sets +tools.register(createPylonIssueTool) // requiresConfirmation: true + +const chatbotRunner = new AgentRunner({ + anthropic, + systemPrompt: CHATBOT_SYSTEM_PROMPT, + tools, + sessionStore: new InMemorySessionStore(), + model: 'claude-haiku-4-5-20251001', // fast for synchronous chatbot + maxTokens: 1024, +}) +``` + +--- + +## Component 2: search_docs tool (llms.txt approach) + +### What it does + +Classifies the user's question into a product area, loads the matching custom set from the statically generated `llms.txt` files, and returns the content as context for Claude. + +### Topic routing + +Uses the routing logic already documented in `src/configs/llms.config.ts`: + +| Topic | Custom set | +| ------------------------------------------- | ------------------------ | +| FSA, users, orgs, sessions, RBAC | Full Stack Auth Complete | +| Agent Auth, OAuth vault, connectors | Agent Authentication | +| MCP, OAuth 2.1, Dynamic Client Registration | MCP Authentication | +| SSO, SAML, OIDC, Intra | Enterprise SSO & SCIM | +| SCIM, directory, user sync | Enterprise SSO & SCIM | +| M2M, client credentials, API keys | Machine-to-Machine Auth | +| SDK methods, endpoints, webhooks | API & SDK Reference | +| Getting started, quickstarts | Quickstart Collection | + +### No external dependencies + +This tool reads from files generated at build time by `starlight-llms-txt`. No vector DB, no embedding pipeline, no external API call. Content updates automatically when a docs PR is merged and the site rebuilds. + +--- + +## Component 3: Pylon feedback loop + +### Triggers + +A webhook listener on the backend fires the gap analyzer agent on two events: + +- **Issue closed** — full thread available, resolution known +- **Substantive team comment** — team member comment longer than ~100 characters (filters out "+1", emoji reactions) + +### Gap analyzer agent + +Built on `AgentRunner` with three tools: + +```ts +tools.register(readPylonThreadTool) // Pylon MCP — fetch issue + all comments +tools.register(searchDocsTool) // same llms.txt tool as chatbot +tools.register(createGithubPrTool) // GitHub MCP — open PR with MDX content +``` + +### Gap analysis system prompt + +``` +You are a documentation gap analyzer for Scalekit. + +Given a support thread (issue + comments) and the current documentation for +the relevant product area, determine: + +1. DOCS GAP — the feature exists but docs are missing or unclear +2. PRODUCT GAP — the feature doesn't exist yet (tag for PM, no PR) +3. ALREADY COVERED — docs answer this question (no action needed) + +If DOCS GAP: use create_github_pr to open a PR. Write the new or updated +MDX content following Scalekit's CLAUDE.md conventions (sentence-case headings, +4-language SDK examples, correct frontmatter). The PR description must link +back to the Pylon issue and explain what was missing. + +Be conservative — only draft a PR if you're confident content is genuinely +missing or misleading. +``` + +### Three outcomes + +| Outcome | Action | +| --------------- | ----------------------------------------------------- | +| Docs gap | Draft PR with new/updated MDX → team reviews → merges | +| Product gap | Tag Pylon issue `product-gap` — no PR, PM sees it | +| Already covered | Tag Pylon issue `docs-ok` — no action | + +### PR format + +- Branch: `docs/gap-pylon-{issueId}` +- Title: `docs: {brief description of what was clarified}` +- Body: why the PR exists, what was missing, link to Pylon issue +- Files: one or more MDX files in `src/content/docs/` +- Follows all CLAUDE.md conventions (frontmatter, sentence case, 90% language rule) + +### Agentboard configuration + +```ts +const gapRunner = new AgentRunner({ + anthropic, + systemPrompt: GAP_ANALYSIS_SYSTEM_PROMPT, + tools: gapTools, + sessionStore: new InMemorySessionStore(), + model: 'claude-sonnet-4-6', // quality matters here; lower volume than chatbot + maxTokens: 4096, +}) +``` + +--- + +## Component 4: Slack bot + +### What it does + +A Slack Bolt (Node.js) app that listens for `app_mention` events in any channel. Forwards to the same chatbot `AgentRunner`. Streams responses back to the thread. Maps agentboard's `confirm` SSE event to Slack Block Kit buttons. + +### Identity resolution + +```ts +// On app_mention event +const slackUser = await app.client.users.info({ user: event.user }) +const ctx: AgentContext = { + userId: slackUser.user.profile.email, + orgId: slackUser.user.enterprise_id ?? slackUser.user.team_id, + isAdmin: isInternalTeamMember(slackUser.user.profile.email), +} +``` + +### Response streaming + +1. Post initial "thinking…" message to thread. +2. Update message as `token` SSE events arrive. +3. On `confirm` event: replace message with Block Kit button message (Yes / No). +4. On button click: Slack interaction payload → `runner.confirm()`. + +### isAdmin gate + +Community members: `isAdmin: false` — chatbot + issue creation only. +Team members: `isAdmin: true` — same tools today, but unlocks admin-only tools in future (org config lookup, etc.) without restructuring the agent. + +--- + +## The flywheel + +``` +User asks unanswerable question + → Pylon issue created (with conversation + user context) + → Team member answers in thread + → Gap analyzer detects docs gap + → PR drafted with new MDX content + → Human reviews and merges + → Docs updated → llms.txt regenerated on deploy + → Chatbot answers correctly next time + → Fewer support issues over time +``` + +Every merged docs PR reduces future support load. The system improves continuously without manual curation. + +--- + +## Technology stack + +| Layer | Technology | +| ------------------ | ----------------------------------------------- | +| Agent runtime | agentboard (scalekit-inc/agentboard) | +| Backend framework | Express (agentboard/express adapter) | +| Chatbot model | claude-haiku-4-5-20251001 | +| Gap analysis model | claude-sonnet-4-6 | +| Doc content source | llms.txt custom sets (starlight-llms-txt) | +| Widget | agentboard React components, CDN-bundled | +| Slack | Slack Bolt SDK (Node.js) | +| Support | Pylon MCP | +| Code | GitHub MCP | +| Session store | InMemorySessionStore (MVP) → Redis (production) | + +--- + +## What is NOT in scope + +- Vector search / embeddings (future upgrade path if precision issues arise) +- Auto-merging PRs (human review always required) +- mcp.scalekit.com search_docs (not needed; llms.txt approach used instead) +- Analytics dashboard for chatbot usage (future) +- Multi-language response support (future) + +--- + +## Deployment topology + +All three backend components (chatbot API, Pylon webhook listener, Slack Bolt app) run as a **single Node.js service** for MVP — one Express server with three route groups. They share one `AgentRunner` instance for the chatbot and one for the gap analyzer. Splitting into separate services is a future option if scaling requires it. + +--- + +## Open questions (non-blocking) + +1. **CDN hosting**: Where does `chatbot.js` get hosted? (scalekit CDN, npm + jsDelivr, or self-hosted on Firebase?) +2. **Session persistence**: InMemorySessionStore works for MVP single-instance. If the backend scales horizontally, migrate to Redis. +3. **Webhook security**: Pylon webhook endpoint needs signature verification to prevent spoofing. +4. **Rate limiting**: Chatbot `/api/chat` endpoint needs rate limiting per IP for anonymous users. From b910cf16f191128f723870a605d32423a5ed9d1d Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 12:22:24 -0400 Subject: [PATCH 13/40] docs: add chatbot API implementation plan (Plan A) --- .../plans/2026-03-30-chatbot-api-plan-a.md | 1337 +++++++++++++++++ 1 file changed, 1337 insertions(+) create mode 100644 project-docs/plans/2026-03-30-chatbot-api-plan-a.md diff --git a/project-docs/plans/2026-03-30-chatbot-api-plan-a.md b/project-docs/plans/2026-03-30-chatbot-api-plan-a.md new file mode 100644 index 000000000..dbb405be5 --- /dev/null +++ b/project-docs/plans/2026-03-30-chatbot-api-plan-a.md @@ -0,0 +1,1337 @@ +# Chatbot API Service + Widget Integration — Implementation Plan (Plan A) + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Build a Node.js chatbot API service using agentboard that answers docs questions grounded in llms.txt custom sets, offers to create Pylon issues when it can't answer, and integrates as a widget into docs.scalekit.com. + +**Architecture:** An Express service at `services/chatbot-api/` uses agentboard's `AgentRunner` configured with two tools — `search_docs` (classifies query → fetches matching llms.txt custom set from the public docs URL) and `create_pylon_issue` (creates a Pylon issue with conversation context, requires user confirmation). The widget is injected into the Starlight docs site via the existing `Head.astro` override using agentboard's `AgentTerminal` React component as a placeholder — swap for `ChatBubble` variant once agentboard's UI variants are complete. + +**Tech Stack:** Node.js 20+, TypeScript, agentboard (`github:scalekit-inc/agentboard`), Express 5, Vitest, Anthropic SDK (via agentboard), Pylon REST API. + +**Depends on:** agentboard repo being installable from GitHub. Run `gh repo view scalekit-inc/agentboard` to verify it is public and has a build before starting. + +**Plan B (Pylon feedback loop) and Plan C (Slack bot) follow this plan.** + +--- + +## File map + +``` +services/chatbot-api/ + src/ + index.ts ← Express app entry + server start + agent.ts ← AgentRunner + ToolRegistry setup (the configured agent) + tools/ + search-docs.ts ← search_docs tool: classifies query, fetches llms.txt set + create-pylon-issue.ts ← create_pylon_issue tool (requiresConfirmation: true) + lib/ + classify-query.ts ← maps query text → topic slug + fetch-custom-set.ts ← fetches llms.txt file by topic slug from docs URL + tests/ + lib/ + classify-query.test.ts + fetch-custom-set.test.ts + tools/ + search-docs.test.ts + create-pylon-issue.test.ts + agent.test.ts ← integration: AgentRunner responds to a query + package.json + tsconfig.json + vitest.config.ts + .env.example + +src/components/overrides/ + Head.astro ← MODIFY: inject chatbot widget script tag +src/components/chatbot/ + ChatbotWidget.astro ← NEW: Astro component that mounts the React widget +``` + +--- + +## Task 1: Bootstrap the chatbot-api service + +**Files:** + +- Create: `services/chatbot-api/package.json` +- Create: `services/chatbot-api/tsconfig.json` +- Create: `services/chatbot-api/vitest.config.ts` +- Create: `services/chatbot-api/.env.example` +- Create: `services/chatbot-api/src/index.ts` + +- [ ] **Step 1: Create the service directory and package.json** + +```bash +mkdir -p services/chatbot-api/src/tools services/chatbot-api/src/lib services/chatbot-api/tests/lib services/chatbot-api/tests/tools +``` + +Create `services/chatbot-api/package.json`: + +```json +{ + "name": "chatbot-api", + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "tsx watch src/index.ts", + "build": "tsc", + "start": "node dist/index.js", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": { + "agentboard": "github:scalekit-inc/agentboard", + "express": "^5.0.0", + "dotenv": "^16.0.0" + }, + "devDependencies": { + "@types/express": "^5.0.0", + "@types/node": "^20.0.0", + "tsx": "^4.0.0", + "typescript": "^5.0.0", + "vitest": "^2.0.0", + "msw": "^2.0.0" + } +} +``` + +- [ ] **Step 2: Create tsconfig.json** + +Create `services/chatbot-api/tsconfig.json`: + +```json +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "outDir": "dist", + "rootDir": "src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} +``` + +- [ ] **Step 3: Create vitest.config.ts** + +Create `services/chatbot-api/vitest.config.ts`: + +```ts +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + environment: 'node', + globals: true, + }, +}) +``` + +- [ ] **Step 4: Create .env.example** + +Create `services/chatbot-api/.env.example`: + +``` +ANTHROPIC_API_KEY=sk-ant-... +PYLON_API_TOKEN=pylon_... +DOCS_BASE_URL=https://docs.scalekit.com +PORT=3001 +``` + +Copy to `.env` and fill in values: + +```bash +cp services/chatbot-api/.env.example services/chatbot-api/.env +``` + +- [ ] **Step 5: Create skeleton Express app** + +Create `services/chatbot-api/src/index.ts`: + +```ts +import 'dotenv/config' +import express from 'express' + +const app = express() +app.use(express.json()) + +app.get('/health', (_req, res) => { + res.json({ status: 'ok' }) +}) + +const port = process.env.PORT ?? 3001 +app.listen(port, () => { + console.log(`chatbot-api listening on http://localhost:${port}`) +}) + +export { app } +``` + +- [ ] **Step 6: Install dependencies and verify server starts** + +```bash +cd services/chatbot-api && npm install +npm run dev +``` + +Expected output: + +``` +chatbot-api listening on http://localhost:3001 +``` + +Verify: + +```bash +curl http://localhost:3001/health +``` + +Expected: `{"status":"ok"}` + +- [ ] **Step 7: Commit** + +```bash +git add services/chatbot-api/ +git commit -m "feat(chatbot-api): bootstrap express service skeleton" +``` + +--- + +## Task 2: Query topic classifier + +**Files:** + +- Create: `services/chatbot-api/src/lib/classify-query.ts` +- Create: `services/chatbot-api/tests/lib/classify-query.test.ts` + +The classifier maps a query string to one of the topic slugs that correspond to llms.txt custom sets. + +- [ ] **Step 1: Write failing tests** + +Create `services/chatbot-api/tests/lib/classify-query.test.ts`: + +```ts +import { describe, it, expect } from 'vitest' +import { classifyQuery } from '../../src/lib/classify-query.js' + +describe('classifyQuery', () => { + it('classifies FSA questions', () => { + expect(classifyQuery('How do I manage user sessions in FSA?')).toBe('fsa') + expect(classifyQuery('How does RBAC work?')).toBe('fsa') + expect(classifyQuery('How do I add users to an org?')).toBe('fsa') + }) + + it('classifies SSO questions', () => { + expect(classifyQuery('How do I set up SAML SSO?')).toBe('sso') + expect(classifyQuery('Configure OIDC with Okta')).toBe('sso') + expect(classifyQuery('single sign-on setup')).toBe('sso') + }) + + it('classifies SCIM questions', () => { + expect(classifyQuery('How does SCIM provisioning work?')).toBe('scim') + expect(classifyQuery('Sync users from directory')).toBe('scim') + }) + + it('classifies Agent Auth questions', () => { + expect(classifyQuery('How do AI agents authenticate?')).toBe('agent-auth') + expect(classifyQuery('OAuth vault for tool calling')).toBe('agent-auth') + }) + + it('classifies MCP questions', () => { + expect(classifyQuery('How do I add auth to my MCP server?')).toBe('mcp') + expect(classifyQuery('Dynamic Client Registration')).toBe('mcp') + }) + + it('classifies M2M questions', () => { + expect(classifyQuery('Service to service authentication')).toBe('m2m') + expect(classifyQuery('client credentials flow')).toBe('m2m') + expect(classifyQuery('API key authentication')).toBe('m2m') + }) + + it('classifies SDK/API reference questions', () => { + expect(classifyQuery('What does the getSession() method return?')).toBe('sdk') + expect(classifyQuery('Webhook payload format')).toBe('sdk') + }) + + it('falls back to quickstart for unknown topics', () => { + expect(classifyQuery('How do I get started with Scalekit?')).toBe('quickstart') + expect(classifyQuery('What is Scalekit?')).toBe('quickstart') + }) + + it('is case-insensitive', () => { + expect(classifyQuery('HOW DO I SET UP SAML SSO')).toBe('sso') + }) +}) +``` + +- [ ] **Step 2: Run tests — verify they fail** + +```bash +cd services/chatbot-api && npm test tests/lib/classify-query.test.ts +``` + +Expected: FAIL — `Cannot find module '../../src/lib/classify-query.js'` + +- [ ] **Step 3: Implement classifyQuery** + +Create `services/chatbot-api/src/lib/classify-query.ts`: + +```ts +export type TopicSlug = 'fsa' | 'sso' | 'scim' | 'agent-auth' | 'mcp' | 'm2m' | 'sdk' | 'quickstart' + +const TOPIC_PATTERNS: Array<[TopicSlug, RegExp]> = [ + [ + 'fsa', + /\bfsa\b|full[\s-]stack\s*auth|session|rbac|role.based|\buser.*org\b|\borg.*user\b|login\s*flow|sign[\s-]?in\s*flow/i, + ], + [ + 'sso', + /\bsso\b|saml|oidc(?!\s*vault)|single\s*sign[\s-]on|identity\s*provider|enterprise\s*login/i, + ], + ['scim', /\bscim\b|directory\s*sync|user\s*sync|provisioning|deprovisioning|group\s*sync/i], + [ + 'agent-auth', + /agent\s*auth|ai\s*agent|oauth\s*vault|tool\s*call|mcp\s*connector|agent\s*connector/i, + ], + [ + 'mcp', + /\bmcp\b|model\s*context\s*protocol|dynamic\s*client\s*registration|mcp\s*server|mcp\s*auth/i, + ], + [ + 'm2m', + /m2m|machine[\s-]to[\s-]machine|client\s*credentials|api\s*key|service[\s-]to[\s-]service|service\s*account/i, + ], + [ + 'sdk', + /\bsdk\b|endpoint|webhook|api\s*reference|method\s*return|\bgetSession\b|\bcreateUser\b/i, + ], +] + +export function classifyQuery(query: string): TopicSlug { + for (const [slug, pattern] of TOPIC_PATTERNS) { + if (pattern.test(query)) return slug + } + return 'quickstart' +} +``` + +- [ ] **Step 4: Run tests — verify they pass** + +```bash +cd services/chatbot-api && npm test tests/lib/classify-query.test.ts +``` + +Expected: All tests PASS. + +- [ ] **Step 5: Commit** + +```bash +git add services/chatbot-api/src/lib/classify-query.ts services/chatbot-api/tests/lib/classify-query.test.ts +git commit -m "feat(chatbot-api): implement query topic classifier" +``` + +--- + +## Task 3: llms.txt custom set fetcher + +**Files:** + +- Create: `services/chatbot-api/src/lib/fetch-custom-set.ts` +- Create: `services/chatbot-api/tests/lib/fetch-custom-set.test.ts` + +Fetches the right llms.txt file from the public docs URL based on topic slug. The custom sets are served at `{DOCS_BASE_URL}/llms-{slug}.txt` by `starlight-llms-txt`. + +**Before implementing:** verify the actual URLs by running: + +```bash +curl -I https://docs.scalekit.com/llms-fsa.txt +curl -I https://docs.scalekit.com/llms-agent-authentication.txt +``` + +If the URLs use different slugs (e.g. label-based like `llms-full-stack-auth-complete.txt`), update the `SLUG_TO_PATH` map in this task accordingly. + +- [ ] **Step 1: Write failing tests** + +Create `services/chatbot-api/tests/lib/fetch-custom-set.test.ts`: + +```ts +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { fetchCustomSet } from '../../src/lib/fetch-custom-set.js' +import type { TopicSlug } from '../../src/lib/classify-query.js' + +const MOCK_DOCS_CONTENT = '# FSA Docs\n\nThis is the full stack auth documentation.' + +describe('fetchCustomSet', () => { + beforeEach(() => { + vi.stubGlobal('fetch', vi.fn()) + process.env.DOCS_BASE_URL = 'https://docs.scalekit.com' + }) + + afterEach(() => { + vi.unstubAllGlobals() + }) + + it('fetches the correct URL for fsa topic', async () => { + ;(fetch as ReturnType).mockResolvedValueOnce({ + ok: true, + text: async () => MOCK_DOCS_CONTENT, + }) + + const result = await fetchCustomSet('fsa') + + expect(fetch).toHaveBeenCalledWith(expect.stringContaining('/llms-'), expect.any(Object)) + expect(result).toBe(MOCK_DOCS_CONTENT) + }) + + it('falls back to llms-small.txt when custom set fetch fails', async () => { + ;(fetch as ReturnType) + .mockResolvedValueOnce({ ok: false, status: 404 }) + .mockResolvedValueOnce({ ok: true, text: async () => '# Full Docs\n\nAll content.' }) + + const result = await fetchCustomSet('fsa') + expect(result).toBe('# Full Docs\n\nAll content.') + }) + + it('throws when both custom set and fallback fail', async () => { + ;(fetch as ReturnType) + .mockResolvedValueOnce({ ok: false, status: 404 }) + .mockResolvedValueOnce({ ok: false, status: 500 }) + + await expect(fetchCustomSet('fsa')).rejects.toThrow('Failed to fetch docs content') + }) + + it('fetches all topic slugs without throwing', async () => { + const slugs: TopicSlug[] = [ + 'fsa', + 'sso', + 'scim', + 'agent-auth', + 'mcp', + 'm2m', + 'sdk', + 'quickstart', + ] + for (const slug of slugs) { + ;(fetch as ReturnType).mockResolvedValueOnce({ + ok: true, + text: async () => `# ${slug} docs`, + }) + const result = await fetchCustomSet(slug) + expect(result).toContain(slug) + } + }) +}) +``` + +- [ ] **Step 2: Run tests — verify they fail** + +```bash +cd services/chatbot-api && npm test tests/lib/fetch-custom-set.test.ts +``` + +Expected: FAIL — `Cannot find module '../../src/lib/fetch-custom-set.js'` + +- [ ] **Step 3: Implement fetchCustomSet** + +Create `services/chatbot-api/src/lib/fetch-custom-set.ts`: + +```ts +import type { TopicSlug } from './classify-query.js' + +// Maps topic slugs to the llms.txt path suffix served by starlight-llms-txt. +// Verify these paths exist by running: +// curl -I https://docs.scalekit.com/llms-{path}.txt +// Update this map if the plugin uses different naming conventions. +const SLUG_TO_PATH: Record = { + fsa: 'full-stack-auth-complete', + sso: 'enterprise-sso-and-scim', + scim: 'enterprise-sso-and-scim', + 'agent-auth': 'agent-authentication', + mcp: 'mcp-authentication', + m2m: 'machine-to-machine-auth', + sdk: 'api-and-sdk-reference', + quickstart: 'quickstart-collection', +} + +export async function fetchCustomSet(topic: TopicSlug): Promise { + const baseUrl = process.env.DOCS_BASE_URL ?? 'https://docs.scalekit.com' + const path = SLUG_TO_PATH[topic] + const customSetUrl = `${baseUrl}/llms-${path}.txt` + + const customRes = await fetch(customSetUrl, { + headers: { 'User-Agent': 'scalekit-chatbot/1.0' }, + }) + + if (customRes.ok) { + return customRes.text() + } + + // Fall back to llms-small.txt which contains all content in a smaller footprint + const fallbackUrl = `${baseUrl}/llms-small.txt` + const fallbackRes = await fetch(fallbackUrl, { + headers: { 'User-Agent': 'scalekit-chatbot/1.0' }, + }) + + if (fallbackRes.ok) { + return fallbackRes.text() + } + + throw new Error( + `Failed to fetch docs content: custom set ${customSetUrl} returned ${customRes.status}, ` + + `fallback ${fallbackUrl} returned ${fallbackRes.status}`, + ) +} +``` + +- [ ] **Step 4: Run tests — verify they pass** + +```bash +cd services/chatbot-api && npm test tests/lib/fetch-custom-set.test.ts +``` + +Expected: All tests PASS. + +- [ ] **Step 5: Commit** + +```bash +git add services/chatbot-api/src/lib/fetch-custom-set.ts services/chatbot-api/tests/lib/fetch-custom-set.test.ts +git commit -m "feat(chatbot-api): implement llms.txt custom set fetcher with fallback" +``` + +--- + +## Task 4: search_docs tool + +**Files:** + +- Create: `services/chatbot-api/src/tools/search-docs.ts` +- Create: `services/chatbot-api/tests/tools/search-docs.test.ts` + +Combines `classifyQuery` + `fetchCustomSet` into a `RegistryTool` that agentboard's `ToolRegistry` can register. + +- [ ] **Step 1: Write failing tests** + +Create `services/chatbot-api/tests/tools/search-docs.test.ts`: + +```ts +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { searchDocsTool } from '../../src/tools/search-docs.js' + +const MOCK_FSA_CONTENT = '# Full Stack Auth\n\nScalekit FSA documentation content here.' + +describe('searchDocsTool', () => { + beforeEach(() => { + vi.stubGlobal( + 'fetch', + vi.fn().mockResolvedValue({ + ok: true, + text: async () => MOCK_FSA_CONTENT, + }), + ) + process.env.DOCS_BASE_URL = 'https://docs.scalekit.com' + }) + + afterEach(() => { + vi.unstubAllGlobals() + }) + + it('has correct tool definition for Claude', () => { + expect(searchDocsTool.definition.name).toBe('search_docs') + expect(searchDocsTool.definition.description).toContain('search') + expect(searchDocsTool.definition.input_schema.properties).toHaveProperty('query') + }) + + it('returns docs content for a query', async () => { + const result = await searchDocsTool.execute( + { query: 'How do I set up RBAC?' }, + { userId: 'anon', orgId: '', isAdmin: false }, + ) + expect(result).toContain('Full Stack Auth') + }) + + it('accepts optional topic override', async () => { + const result = await searchDocsTool.execute( + { query: 'How do I set up RBAC?', topic: 'sso' }, + { userId: 'anon', orgId: '', isAdmin: false }, + ) + expect(result).toBeDefined() + // Verify the sso path was fetched + expect(fetch).toHaveBeenCalledWith( + expect.stringContaining('enterprise-sso'), + expect.any(Object), + ) + }) + + it('does not require confirmation', () => { + expect(searchDocsTool.requiresConfirmation).toBeFalsy() + }) +}) +``` + +- [ ] **Step 2: Run tests — verify they fail** + +```bash +cd services/chatbot-api && npm test tests/tools/search-docs.test.ts +``` + +Expected: FAIL — `Cannot find module '../../src/tools/search-docs.js'` + +- [ ] **Step 3: Implement search_docs tool** + +Create `services/chatbot-api/src/tools/search-docs.ts`: + +```ts +import type { RegistryTool } from 'agentboard' +import { classifyQuery, type TopicSlug } from '../lib/classify-query.js' +import { fetchCustomSet } from '../lib/fetch-custom-set.js' + +export const searchDocsTool: RegistryTool = { + definition: { + name: 'search_docs', + description: + 'Search Scalekit documentation to answer questions. ' + + 'Always call this tool before answering any question about Scalekit products ' + + '(FSA, SSO, SCIM, Agent Auth, MCP, M2M, SDK). ' + + 'Returns the relevant documentation content as context.', + input_schema: { + type: 'object', + properties: { + query: { + type: 'string', + description: 'The user question to search for in the docs', + }, + topic: { + type: 'string', + enum: ['fsa', 'sso', 'scim', 'agent-auth', 'mcp', 'm2m', 'sdk', 'quickstart'], + description: + 'Optional topic override. If omitted, the topic is auto-detected from the query.', + }, + }, + required: ['query'], + }, + }, + execute: async (args) => { + const { query, topic } = args as { query: string; topic?: TopicSlug } + const resolvedTopic = topic ?? classifyQuery(query) + const content = await fetchCustomSet(resolvedTopic) + return content + }, + requiresConfirmation: false, +} +``` + +- [ ] **Step 4: Run tests — verify they pass** + +```bash +cd services/chatbot-api && npm test tests/tools/search-docs.test.ts +``` + +Expected: All tests PASS. + +- [ ] **Step 5: Commit** + +```bash +git add services/chatbot-api/src/tools/search-docs.ts services/chatbot-api/tests/tools/search-docs.test.ts +git commit -m "feat(chatbot-api): implement search_docs tool using llms.txt custom sets" +``` + +--- + +## Task 5: create_pylon_issue tool + +**Files:** + +- Create: `services/chatbot-api/src/tools/create-pylon-issue.ts` +- Create: `services/chatbot-api/tests/tools/create-pylon-issue.test.ts` + +Creates a Pylon support issue with full conversation context and user identity. `requiresConfirmation: true` — agentboard pauses and asks the user to confirm before executing. + +**Before implementing:** Verify your Pylon API base URL and auth format by checking the Pylon dashboard or docs. The tool uses `https://api.usepylon.com` with a Bearer token. If your Pylon instance uses a different URL, set `PYLON_API_URL` in `.env`. + +- [ ] **Step 1: Write failing tests** + +Create `services/chatbot-api/tests/tools/create-pylon-issue.test.ts`: + +```ts +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { createPylonIssueTool } from '../../src/tools/create-pylon-issue.js' +import type { AgentContext } from 'agentboard' + +const MOCK_ISSUE_RESPONSE = { + id: 'issue_abc123', + title: 'Docs gap: passkeys + SAML SSO', + status: 'open', +} + +describe('createPylonIssueTool', () => { + beforeEach(() => { + vi.stubGlobal( + 'fetch', + vi.fn().mockResolvedValue({ + ok: true, + json: async () => MOCK_ISSUE_RESPONSE, + }), + ) + process.env.PYLON_API_TOKEN = 'test-pylon-token' + process.env.PYLON_API_URL = 'https://api.usepylon.com' + }) + + afterEach(() => { + vi.unstubAllGlobals() + delete process.env.PYLON_API_TOKEN + delete process.env.PYLON_API_URL + }) + + it('has correct tool definition', () => { + expect(createPylonIssueTool.definition.name).toBe('create_pylon_issue') + expect(createPylonIssueTool.definition.input_schema.properties).toHaveProperty('question') + expect(createPylonIssueTool.definition.input_schema.properties).toHaveProperty( + 'conversation_summary', + ) + }) + + it('requires confirmation before executing', () => { + expect(createPylonIssueTool.requiresConfirmation).toBe(true) + }) + + it('creates an issue with user context when user is identified', async () => { + const ctx: AgentContext = { + userId: 'jane@acme.com', + orgId: 'org_acme', + isAdmin: false, + } + + const result = (await createPylonIssueTool.execute( + { + question: 'Can passkeys and SAML SSO coexist for the same org?', + conversation_summary: + 'User asked about passkeys + SAML, no confident answer found in docs.', + }, + ctx, + )) as { issueId: string; message: string } + + expect(fetch).toHaveBeenCalledWith( + expect.stringContaining('usepylon.com'), + expect.objectContaining({ + method: 'POST', + headers: expect.objectContaining({ + Authorization: 'Bearer test-pylon-token', + }), + }), + ) + expect(result.issueId).toBe('issue_abc123') + expect(result.message).toContain('issue_abc123') + }) + + it('creates an issue for anonymous users without user context', async () => { + const ctx: AgentContext = { + userId: '', + orgId: '', + isAdmin: false, + } + + await createPylonIssueTool.execute( + { question: 'How does M2M auth work?', conversation_summary: 'No answer found.' }, + ctx, + ) + + expect(fetch).toHaveBeenCalled() + }) + + it('throws with a clear message when PYLON_API_TOKEN is missing', async () => { + delete process.env.PYLON_API_TOKEN + const ctx: AgentContext = { userId: '', orgId: '', isAdmin: false } + + await expect( + createPylonIssueTool.execute({ question: 'test', conversation_summary: 'test' }, ctx), + ).rejects.toThrow('PYLON_API_TOKEN') + }) + + it('throws when Pylon API returns an error', async () => { + ;(fetch as ReturnType).mockResolvedValueOnce({ + ok: false, + status: 401, + text: async () => 'Unauthorized', + }) + const ctx: AgentContext = { userId: '', orgId: '', isAdmin: false } + + await expect( + createPylonIssueTool.execute({ question: 'test', conversation_summary: 'test' }, ctx), + ).rejects.toThrow('Pylon API error 401') + }) +}) +``` + +- [ ] **Step 2: Run tests — verify they fail** + +```bash +cd services/chatbot-api && npm test tests/tools/create-pylon-issue.test.ts +``` + +Expected: FAIL — `Cannot find module '../../src/tools/create-pylon-issue.js'` + +- [ ] **Step 3: Implement create_pylon_issue tool** + +Create `services/chatbot-api/src/tools/create-pylon-issue.ts`: + +```ts +import type { RegistryTool, AgentContext } from 'agentboard' + +interface PylonIssueArgs { + question: string + conversation_summary: string + user_email?: string // provided by widget when anonymous user opts in +} + +export const createPylonIssueTool: RegistryTool = { + definition: { + name: 'create_pylon_issue', + description: + 'Create a support issue in Pylon when the documentation does not contain a confident answer. ' + + 'Only call this tool after the user has explicitly confirmed they want to create an issue. ' + + 'Include the original question and a summary of what was searched.', + input_schema: { + type: 'object', + properties: { + question: { + type: 'string', + description: "The user's original question that could not be answered from docs.", + }, + conversation_summary: { + type: 'string', + description: 'Brief summary of the conversation and what docs were searched.', + }, + user_email: { + type: 'string', + description: 'Optional email address provided by the user for follow-up.', + }, + }, + required: ['question', 'conversation_summary'], + }, + }, + execute: async (args, ctx: AgentContext) => { + const { question, conversation_summary, user_email } = args as PylonIssueArgs + + const token = process.env.PYLON_API_TOKEN + if (!token) throw new Error('PYLON_API_TOKEN environment variable is not set') + + const apiUrl = process.env.PYLON_API_URL ?? 'https://api.usepylon.com' + + const title = `Docs gap: ${question.slice(0, 80)}${question.length > 80 ? '…' : ''}` + + const body: Record = { + title, + body: [ + `**Question:** ${question}`, + '', + `**Context:** ${conversation_summary}`, + '', + `**Source:** docs chatbot`, + ctx.userId ? `**User:** ${ctx.userId}` : '', + ctx.orgId ? `**Org:** ${ctx.orgId}` : '', + user_email ? `**Contact:** ${user_email}` : '', + ] + .filter(Boolean) + .join('\n'), + tags: ['docs-gap'], + } + + if (ctx.userId) body.requester_email = ctx.userId + + const res = await fetch(`${apiUrl}/issues`, { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }) + + if (!res.ok) { + const text = await res.text().catch(() => '') + throw new Error(`Pylon API error ${res.status}: ${text}`) + } + + const issue = (await res.json()) as { id: string } + return { + issueId: issue.id, + message: `Support issue created (${issue.id}). Our team will follow up${ctx.userId ? ` with ${ctx.userId}` : ''}.`, + } + }, + requiresConfirmation: true, +} +``` + +- [ ] **Step 4: Run tests — verify they pass** + +```bash +cd services/chatbot-api && npm test tests/tools/create-pylon-issue.test.ts +``` + +Expected: All tests PASS. + +- [ ] **Step 5: Commit** + +```bash +git add services/chatbot-api/src/tools/create-pylon-issue.ts services/chatbot-api/tests/tools/create-pylon-issue.test.ts +git commit -m "feat(chatbot-api): implement create_pylon_issue tool with confirmation" +``` + +--- + +## Task 6: Configure AgentRunner and wire Express routes + +**Files:** + +- Create: `services/chatbot-api/src/agent.ts` +- Modify: `services/chatbot-api/src/index.ts` +- Create: `services/chatbot-api/tests/agent.test.ts` + +- [ ] **Step 1: Write failing integration test** + +Create `services/chatbot-api/tests/agent.test.ts`: + +```ts +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import Anthropic from '@anthropic-ai/sdk' + +// Mock the Anthropic SDK to avoid real API calls in tests +vi.mock('@anthropic-ai/sdk', () => { + return { + default: vi.fn().mockImplementation(() => ({ + messages: { + create: vi.fn().mockResolvedValue({ + id: 'msg_test', + content: [{ type: 'text', text: 'Based on the docs, here is how FSA sessions work...' }], + stop_reason: 'end_turn', + usage: { input_tokens: 100, output_tokens: 50 }, + }), + }, + })), + } +}) + +vi.stubGlobal( + 'fetch', + vi.fn().mockResolvedValue({ + ok: true, + text: async () => '# FSA Docs\n\nSession management works by...', + }), +) + +describe('createAgent', () => { + afterEach(() => { + vi.clearAllMocks() + }) + + it('creates an agent with search_docs and create_pylon_issue tools', async () => { + process.env.ANTHROPIC_API_KEY = 'test-key' + const { createAgent } = await import('../src/agent.js') + const { runner, tools } = createAgent() + + expect(runner).toBeDefined() + expect(tools.size).toBe(2) + }) + + it('registers search_docs without confirmation', async () => { + process.env.ANTHROPIC_API_KEY = 'test-key' + const { createAgent } = await import('../src/agent.js') + const { tools } = createAgent() + + expect(tools.requiresConfirmation('search_docs')).toBe(false) + expect(tools.requiresConfirmation('create_pylon_issue')).toBe(true) + }) +}) +``` + +- [ ] **Step 2: Run test — verify it fails** + +```bash +cd services/chatbot-api && npm test tests/agent.test.ts +``` + +Expected: FAIL — `Cannot find module '../src/agent.js'` + +- [ ] **Step 3: Implement agent.ts** + +Create `services/chatbot-api/src/agent.ts`: + +```ts +import Anthropic from '@anthropic-ai/sdk' +import { AgentRunner, ToolRegistry, InMemorySessionStore } from 'agentboard' +import { searchDocsTool } from './tools/search-docs.js' +import { createPylonIssueTool } from './tools/create-pylon-issue.js' + +const SYSTEM_PROMPT = `You are the Scalekit docs assistant. + +When answering questions: +1. ALWAYS call search_docs first before answering any product question. +2. Answer ONLY using content returned by search_docs. Do not use prior knowledge. +3. Always cite the source by mentioning the relevant docs section. +4. Keep answers concise and link to the relevant docs page when possible. + +If search_docs does not contain a clear answer to the question: +- Say explicitly: "I don't have a confident answer for this in the docs." +- Offer to create a support issue: "Would you like me to create a support issue so our team can follow up?" +- If the user confirms, call create_pylon_issue with the original question and a summary. + +Never guess or invent information about Scalekit products.` + +export function createAgent() { + const anthropic = new Anthropic({ + apiKey: process.env.ANTHROPIC_API_KEY, + }) + + const tools = new ToolRegistry() + tools.register(searchDocsTool) + tools.register(createPylonIssueTool) + + const runner = new AgentRunner({ + anthropic, + systemPrompt: SYSTEM_PROMPT, + tools, + sessionStore: new InMemorySessionStore(), + model: 'claude-haiku-4-5-20251001', + maxTokens: 1024, + }) + + return { runner, tools } +} +``` + +- [ ] **Step 4: Wire the Express routes using agentboard's Express adapter** + +Update `services/chatbot-api/src/index.ts`: + +```ts +import 'dotenv/config' +import express from 'express' +import { createAgentRouter } from 'agentboard/express' +import { createAgent } from './agent.js' + +const app = express() +app.use(express.json()) + +// CORS for the docs site and any embed origin +app.use((_req, res, next) => { + res.setHeader('Access-Control-Allow-Origin', '*') + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, x-user-id, x-org-id, x-is-admin') + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') + next() +}) + +app.options('*', (_req, res) => res.sendStatus(200)) + +app.get('/health', (_req, res) => { + res.json({ status: 'ok' }) +}) + +const { runner, tools } = createAgent() + +// Mount the agentboard Express router at /api/chat +// It handles POST /api/chat (send message) and POST /api/chat/confirm (tool confirmation) +app.use( + '/api/chat', + createAgentRouter({ + runner, + context: (req) => ({ + userId: (req.headers['x-user-id'] as string) ?? '', + orgId: (req.headers['x-org-id'] as string) ?? '', + isAdmin: req.headers['x-is-admin'] === 'true', + }), + }), +) + +const port = process.env.PORT ?? 3001 +app.listen(port, () => { + console.log(`chatbot-api listening on http://localhost:${port}`) +}) + +export { app } +``` + +- [ ] **Step 5: Run all tests** + +```bash +cd services/chatbot-api && npm test +``` + +Expected: All tests PASS. + +- [ ] **Step 6: Smoke test the running server** + +```bash +cd services/chatbot-api && npm run dev +``` + +In another terminal: + +```bash +curl -X POST http://localhost:3001/api/chat \ + -H "Content-Type: application/json" \ + -d '{"message": "How does RBAC work in FSA?", "session_id": "test-123"}' \ + --no-buffer +``` + +Expected: SSE stream of `data: {"type":"token","data":{"text":"..."}}` events, ending with `data: {"type":"done",...}`. + +- [ ] **Step 7: Commit** + +```bash +git add services/chatbot-api/src/agent.ts services/chatbot-api/src/index.ts services/chatbot-api/tests/agent.test.ts +git commit -m "feat(chatbot-api): wire AgentRunner with Express routes" +``` + +--- + +## Task 7: Integrate widget into Starlight docs site + +**Files:** + +- Create: `src/components/chatbot/ChatbotWidget.astro` +- Modify: `src/components/overrides/Head.astro` + +This task embeds the agentboard widget into the docs site. It uses `AgentTerminal` as a placeholder. When agentboard's `ChatBubble` variant is complete (built in the parallel agentboard session), replace `AgentTerminal` with `AgentChatBubble` — no other changes needed. + +- [ ] **Step 1: Create the ChatbotWidget Astro component** + +Create `src/components/chatbot/ChatbotWidget.astro`: + +```astro +--- +// Chatbot widget component. +// Currently uses AgentTerminal as placeholder. +// Replace with AgentChatBubble once agentboard UI variants are complete. +const chatApiUrl = import.meta.env.PUBLIC_CHATBOT_API_URL ?? 'http://localhost:3001' +--- + + + + + + + + +``` + +- [ ] **Step 2: Add PUBLIC_CHATBOT_API_URL to the docs site env** + +Add to the root `.env` of the docs site (create if it doesn't exist): + +``` +PUBLIC_CHATBOT_API_URL=http://localhost:3001 +``` + +For production, this will be the deployed chatbot-api URL. + +- [ ] **Step 3: Inject the widget into Head.astro** + +Modify `src/components/overrides/Head.astro`: + +```astro +--- +import Default from '@astrojs/starlight/components/Head.astro' +import ChatbotWidget from '../chatbot/ChatbotWidget.astro' +--- + + + + + + +``` + +- [ ] **Step 4: Verify the widget renders in local dev** + +```bash +# Terminal 1 — start chatbot API +cd services/chatbot-api && npm run dev + +# Terminal 2 — start docs site +pnpm dev +``` + +Open `http://localhost:4321` in a browser. Verify: + +- A purple 💬 button appears in the bottom-right corner +- Clicking it opens a chat panel +- Typing a question produces a streamed response +- An unanswerable question produces the "create support issue?" offer + +- [ ] **Step 5: Commit** + +```bash +git add src/components/chatbot/ChatbotWidget.astro src/components/overrides/Head.astro +git commit -m "feat(docs): integrate chatbot widget into Starlight layout" +``` + +--- + +## Task 8: Final wiring check and env documentation + +**Files:** + +- Create: `services/chatbot-api/README.md` + +- [ ] **Step 1: Run the full test suite** + +```bash +cd services/chatbot-api && npm test +``` + +Expected: All tests PASS with no skipped tests. + +- [ ] **Step 2: Verify the confirmation flow end-to-end** + +With the chatbot API running and docs site open: + +1. Ask: "How do I set up SCIM provisioning?" — should get a docs-grounded answer. +2. Ask: "Does Scalekit support biometric authentication on iOS?" — should get the "I don't have a confident answer" response with Yes/No buttons. +3. Click "Yes, create issue" — should trigger the `confirm` flow and create a Pylon issue (check your Pylon dashboard). + +- [ ] **Step 3: Write the service README** + +Create `services/chatbot-api/README.md`: + +````markdown +# chatbot-api + +Node.js Express service powering the Scalekit docs chatbot. + +## Setup + +\```bash +npm install +cp .env.example .env + +# Fill in ANTHROPIC_API_KEY and PYLON_API_TOKEN in .env + +\``` + +## Run + +\```bash +npm run dev # development with hot reload +npm start # production +\``` + +## Environment variables + +| Variable | Required | Description | +| ------------------- | -------- | ------------------------------------------------------------------- | +| `ANTHROPIC_API_KEY` | Yes | Anthropic API key | +| `PYLON_API_TOKEN` | Yes | Pylon API Bearer token | +| `DOCS_BASE_URL` | No | Docs URL for llms.txt fetching (default: https://docs.scalekit.com) | +| `PYLON_API_URL` | No | Pylon API base URL (default: https://api.usepylon.com) | +| `PORT` | No | Port to listen on (default: 3001) | + +## Endpoints + +- `GET /health` — health check +- `POST /api/chat` — send a message (SSE stream) +- `POST /api/chat/confirm` — confirm a pending tool action + +## Passing user context + +Set headers on requests from identified surfaces: + +\``` +x-user-id: jane@acme.com +x-org-id: org_acme +x-is-admin: false +\``` + +## Swapping the widget UI + +The docs site widget (`src/components/chatbot/ChatbotWidget.astro`) currently uses +`AgentTerminal`. Once agentboard's `ChatBubble` variant is complete, replace the +import and component in that file — no changes to this service needed. +```` + +- [ ] **Step 4: Final commit** + +```bash +git add services/chatbot-api/README.md +git commit -m "docs(chatbot-api): add README with setup and env documentation" +``` + +--- + +## Self-review notes + +**Spec coverage check:** + +- ✅ Custom-built with Claude API (agentboard + Anthropic SDK) +- ✅ search_docs tool using llms.txt custom sets (Tasks 2–4) +- ✅ create_pylon_issue with requiresConfirmation (Task 5) +- ✅ AgentRunner configured with Haiku model (Task 6) +- ✅ Anonymous + identified user modes (Task 6 headers, Task 7 ScalekitChat.identify) +- ✅ Widget integrated into Starlight Head.astro (Task 7) +- ✅ Thumbs-down triggering issue offer: handled by system prompt instruction to Claude + confirmation tool flow +- ⚠️ **llms.txt URL paths**: The `SLUG_TO_PATH` map in Task 3 uses assumed paths. Implementer must verify against the live docs site before deployment (step noted in Task 3). +- ⚠️ **Pylon API endpoint format**: Task 5 uses `POST /issues` on `api.usepylon.com`. Implementer must verify against Pylon's actual API docs. + +**Out of scope for Plan A** (covered in Plans B and C): + +- Pylon webhook listener and gap analyzer +- PR drafter agent +- Slack bot From ef4423abbb0da4328a6256e5a9df0c5d91eccb78 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 13:16:30 -0400 Subject: [PATCH 14/40] feat(chatbot-api): bootstrap express service skeleton --- services/chatbot-api/.env.example | 4 + services/chatbot-api/package-lock.json | 3526 ++++++++++++++++++++++++ services/chatbot-api/package.json | 25 + services/chatbot-api/src/index.ts | 16 + services/chatbot-api/tsconfig.json | 14 + services/chatbot-api/vitest.config.ts | 8 + 6 files changed, 3593 insertions(+) create mode 100644 services/chatbot-api/.env.example create mode 100644 services/chatbot-api/package-lock.json create mode 100644 services/chatbot-api/package.json create mode 100644 services/chatbot-api/src/index.ts create mode 100644 services/chatbot-api/tsconfig.json create mode 100644 services/chatbot-api/vitest.config.ts diff --git a/services/chatbot-api/.env.example b/services/chatbot-api/.env.example new file mode 100644 index 000000000..2a4588573 --- /dev/null +++ b/services/chatbot-api/.env.example @@ -0,0 +1,4 @@ +ANTHROPIC_API_KEY=sk-ant-... +PYLON_API_TOKEN=pylon_... +DOCS_BASE_URL=https://docs.scalekit.com +PORT=3001 diff --git a/services/chatbot-api/package-lock.json b/services/chatbot-api/package-lock.json new file mode 100644 index 000000000..da9618d1b --- /dev/null +++ b/services/chatbot-api/package-lock.json @@ -0,0 +1,3526 @@ +{ + "name": "chatbot-api", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "chatbot-api", + "version": "0.1.0", + "dependencies": { + "@scalekit/agentkit": "github:scalekit-inc/agentkit", + "dotenv": "^16.0.0", + "express": "^5.0.0" + }, + "devDependencies": { + "@types/express": "^5.0.0", + "@types/node": "^20.0.0", + "msw": "^2.0.0", + "tsx": "^4.0.0", + "typescript": "^5.0.0", + "vitest": "^2.0.0" + } + }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.80.0", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.80.0.tgz", + "integrity": "sha512-WeXLn7zNVk3yjeshn+xZHvld6AoFUOR3Sep6pSoHho5YbSi6HwcirqgPA5ccFuW8QTVJAAU7N8uQQC6Wa9TG+g==", + "license": "MIT", + "dependencies": { + "json-schema-to-ts": "^3.1.1" + }, + "bin": { + "anthropic-ai-sdk": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "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/@mswjs/interceptors": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", + "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@scalekit/agentkit": { + "version": "0.1.0", + "resolved": "git+ssh://git@github.com/scalekit-inc/agentkit.git#27c225b59966e45f105876c975e22bac49353181", + "license": "MIT", + "dependencies": { + "@anthropic-ai/sdk": "^0.80.0" + }, + "peerDependencies": { + "express": "^4.0.0 || ^5.0.0", + "next": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "express": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "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==", + "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/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/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "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/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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==", + "dev": true, + "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/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/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "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/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "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==", + "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/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/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==", + "dev": true, + "license": "MIT" + }, + "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/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==", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "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-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/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/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/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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/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/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==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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==", + "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==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.7", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz", + "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphql": { + "version": "16.13.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.2.tgz", + "integrity": "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, + "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/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/json-schema-to-ts": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", + "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "ts-algebra": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/msw": { + "version": "2.12.14", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.14.tgz", + "integrity": "sha512-4KXa4nVBIBjbDbd7vfQNuQ25eFxug0aropCQFoI0JdOBuJWamkT1yLVIWReFI8SiTRc+H1hKzaNk+cLk2N9rtQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.41.2", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.10.1", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "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/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, + "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-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/rettime": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.10.1.tgz", + "integrity": "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.0.tgz", + "integrity": "sha512-PuseHIvAnz3bjrM2rGJtSgo1zjgxapTLZ7x2pjhzWwlp4SJQgK3f3iZIQwkpEnBaKz6seKBADpM4B4ySkuYypg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "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.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "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==", + "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==", + "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/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.27.tgz", + "integrity": "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.27" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.27.tgz", + "integrity": "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==", + "dev": true, + "license": "MIT" + }, + "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/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/ts-algebra": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", + "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", + "license": "MIT" + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-fest": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", + "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, + "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/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.9", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "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/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/services/chatbot-api/package.json b/services/chatbot-api/package.json new file mode 100644 index 000000000..7bff98fc4 --- /dev/null +++ b/services/chatbot-api/package.json @@ -0,0 +1,25 @@ +{ + "name": "chatbot-api", + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "tsx watch src/index.ts", + "build": "tsc", + "start": "node dist/index.js", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": { + "@scalekit/agentkit": "github:scalekit-inc/agentkit", + "express": "^5.0.0", + "dotenv": "^16.0.0" + }, + "devDependencies": { + "@types/express": "^5.0.0", + "@types/node": "^20.0.0", + "tsx": "^4.0.0", + "typescript": "^5.0.0", + "vitest": "^2.0.0", + "msw": "^2.0.0" + } +} diff --git a/services/chatbot-api/src/index.ts b/services/chatbot-api/src/index.ts new file mode 100644 index 000000000..d60d228e3 --- /dev/null +++ b/services/chatbot-api/src/index.ts @@ -0,0 +1,16 @@ +import 'dotenv/config' +import express from 'express' + +const app = express() +app.use(express.json()) + +app.get('/health', (_req, res) => { + res.json({ status: 'ok' }) +}) + +const port = process.env.PORT ?? 3001 +app.listen(port, () => { + console.log(`chatbot-api listening on http://localhost:${port}`) +}) + +export { app } diff --git a/services/chatbot-api/tsconfig.json b/services/chatbot-api/tsconfig.json new file mode 100644 index 000000000..0a639d80c --- /dev/null +++ b/services/chatbot-api/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "outDir": "dist", + "rootDir": "src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/services/chatbot-api/vitest.config.ts b/services/chatbot-api/vitest.config.ts new file mode 100644 index 000000000..f1881c183 --- /dev/null +++ b/services/chatbot-api/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + environment: 'node', + globals: true, + }, +}) From 1fdd05966475a724939797ddd04b835ceb2b4c87 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 13:18:00 -0400 Subject: [PATCH 15/40] feat(chatbot-api): implement query topic classifier --- .../chatbot-api/src/lib/classify-query.ts | 36 +++++++++++++ .../tests/lib/classify-query.test.ts | 51 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 services/chatbot-api/src/lib/classify-query.ts create mode 100644 services/chatbot-api/tests/lib/classify-query.test.ts diff --git a/services/chatbot-api/src/lib/classify-query.ts b/services/chatbot-api/src/lib/classify-query.ts new file mode 100644 index 000000000..eee9925d0 --- /dev/null +++ b/services/chatbot-api/src/lib/classify-query.ts @@ -0,0 +1,36 @@ +export type TopicSlug = 'fsa' | 'sso' | 'scim' | 'agent-auth' | 'mcp' | 'm2m' | 'sdk' | 'quickstart' + +const TOPIC_PATTERNS: Array<[TopicSlug, RegExp]> = [ + ['sdk', /\bsdk\b|webhook|api\s*reference|method\s*return|getSession|createUser/i], + [ + 'fsa', + /\bfsa\b|full[\s-]stack\s*auth|\bsession\b|rbac|role.based|\buser.*org\b|\borg.*user\b|login\s*flow|sign[\s-]?in\s*flow/i, + ], + [ + 'sso', + /\bsso\b|saml|oidc(?!\s*vault)|single\s*sign[\s-]on|identity\s*provider|enterprise\s*login/i, + ], + [ + 'scim', + /\bscim\b|directory\s*sync|user\s*sync|provisioning|deprovisioning|group\s*sync|\bsync\b.*\bdirectory\b|\bdirectory\b/i, + ], + [ + 'agent-auth', + /agent\s*auth|ai\s*agent|oauth\s*vault|tool\s*call|mcp\s*connector|agent\s*connector/i, + ], + [ + 'mcp', + /\bmcp\b|model\s*context\s*protocol|dynamic\s*client\s*registration|mcp\s*server|mcp\s*auth/i, + ], + [ + 'm2m', + /m2m|machine[\s-]to[\s-]machine|client\s*credentials|api\s*key|service[\s-]to[\s-]service|service\s*account/i, + ], +] + +export function classifyQuery(query: string): TopicSlug { + for (const [slug, pattern] of TOPIC_PATTERNS) { + if (pattern.test(query)) return slug + } + return 'quickstart' +} diff --git a/services/chatbot-api/tests/lib/classify-query.test.ts b/services/chatbot-api/tests/lib/classify-query.test.ts new file mode 100644 index 000000000..e605abe0c --- /dev/null +++ b/services/chatbot-api/tests/lib/classify-query.test.ts @@ -0,0 +1,51 @@ +import { describe, it, expect } from 'vitest' +import { classifyQuery } from '../../src/lib/classify-query.js' + +describe('classifyQuery', () => { + it('classifies FSA questions', () => { + expect(classifyQuery('How do I manage user sessions in FSA?')).toBe('fsa') + expect(classifyQuery('How does RBAC work?')).toBe('fsa') + expect(classifyQuery('How do I add users to an org?')).toBe('fsa') + }) + + it('classifies SSO questions', () => { + expect(classifyQuery('How do I set up SAML SSO?')).toBe('sso') + expect(classifyQuery('Configure OIDC with Okta')).toBe('sso') + expect(classifyQuery('single sign-on setup')).toBe('sso') + }) + + it('classifies SCIM questions', () => { + expect(classifyQuery('How does SCIM provisioning work?')).toBe('scim') + expect(classifyQuery('Sync users from directory')).toBe('scim') + }) + + it('classifies Agent Auth questions', () => { + expect(classifyQuery('How do AI agents authenticate?')).toBe('agent-auth') + expect(classifyQuery('OAuth vault for tool calling')).toBe('agent-auth') + }) + + it('classifies MCP questions', () => { + expect(classifyQuery('How do I add auth to my MCP server?')).toBe('mcp') + expect(classifyQuery('Dynamic Client Registration')).toBe('mcp') + }) + + it('classifies M2M questions', () => { + expect(classifyQuery('Service to service authentication')).toBe('m2m') + expect(classifyQuery('client credentials flow')).toBe('m2m') + expect(classifyQuery('API key authentication')).toBe('m2m') + }) + + it('classifies SDK/API reference questions', () => { + expect(classifyQuery('What does the getSession() method return?')).toBe('sdk') + expect(classifyQuery('Webhook payload format')).toBe('sdk') + }) + + it('falls back to quickstart for unknown topics', () => { + expect(classifyQuery('How do I get started with Scalekit?')).toBe('quickstart') + expect(classifyQuery('What is Scalekit?')).toBe('quickstart') + }) + + it('is case-insensitive', () => { + expect(classifyQuery('HOW DO I SET UP SAML SSO')).toBe('sso') + }) +}) From 59e56cb610e80f5e73fea5c5aec58a94899a2bc8 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 13:19:28 -0400 Subject: [PATCH 16/40] feat(chatbot-api): implement llms.txt custom set fetcher with fallback --- .../chatbot-api/src/lib/fetch-custom-set.ts | 40 +++++++++++ .../tests/lib/fetch-custom-set.test.ts | 66 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 services/chatbot-api/src/lib/fetch-custom-set.ts create mode 100644 services/chatbot-api/tests/lib/fetch-custom-set.test.ts diff --git a/services/chatbot-api/src/lib/fetch-custom-set.ts b/services/chatbot-api/src/lib/fetch-custom-set.ts new file mode 100644 index 000000000..782ff27e0 --- /dev/null +++ b/services/chatbot-api/src/lib/fetch-custom-set.ts @@ -0,0 +1,40 @@ +import type { TopicSlug } from './classify-query.js' + +const SLUG_TO_PATH: Record = { + fsa: 'full-stack-auth-complete', + sso: 'enterprise-sso--scim', + scim: 'enterprise-sso--scim', + 'agent-auth': 'agent-authentication', + mcp: 'mcp-authentication', + m2m: 'machine-to-machine-auth', + sdk: 'api--sdk-reference', + quickstart: 'quickstart-collection', +} + +export async function fetchCustomSet(topic: TopicSlug): Promise { + const baseUrl = process.env.DOCS_BASE_URL ?? 'https://docs.scalekit.com' + const path = SLUG_TO_PATH[topic] + const customSetUrl = `${baseUrl}/_llms-txt/${path}.txt` + + const customRes = await fetch(customSetUrl, { + headers: { 'User-Agent': 'scalekit-chatbot/1.0' }, + }) + + if (customRes.ok) { + return customRes.text() + } + + const fallbackUrl = `${baseUrl}/llms-small.txt` + const fallbackRes = await fetch(fallbackUrl, { + headers: { 'User-Agent': 'scalekit-chatbot/1.0' }, + }) + + if (fallbackRes.ok) { + return fallbackRes.text() + } + + throw new Error( + `Failed to fetch docs content: custom set ${customSetUrl} returned ${customRes.status}, ` + + `fallback ${fallbackUrl} returned ${fallbackRes.status}`, + ) +} diff --git a/services/chatbot-api/tests/lib/fetch-custom-set.test.ts b/services/chatbot-api/tests/lib/fetch-custom-set.test.ts new file mode 100644 index 000000000..f9db70faa --- /dev/null +++ b/services/chatbot-api/tests/lib/fetch-custom-set.test.ts @@ -0,0 +1,66 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { fetchCustomSet } from '../../src/lib/fetch-custom-set.js' +import type { TopicSlug } from '../../src/lib/classify-query.js' + +const MOCK_DOCS_CONTENT = '# FSA Docs\n\nThis is the full stack auth documentation.' + +describe('fetchCustomSet', () => { + beforeEach(() => { + vi.stubGlobal('fetch', vi.fn()) + process.env.DOCS_BASE_URL = 'https://docs.scalekit.com' + }) + + afterEach(() => { + vi.unstubAllGlobals() + }) + + it('fetches the correct URL for fsa topic', async () => { + ;(fetch as ReturnType).mockResolvedValueOnce({ + ok: true, + text: async () => MOCK_DOCS_CONTENT, + }) + + const result = await fetchCustomSet('fsa') + + expect(fetch).toHaveBeenCalledWith(expect.stringContaining('/_llms-txt/'), expect.any(Object)) + expect(result).toBe(MOCK_DOCS_CONTENT) + }) + + it('falls back to llms-small.txt when custom set fetch fails', async () => { + ;(fetch as ReturnType) + .mockResolvedValueOnce({ ok: false, status: 404 }) + .mockResolvedValueOnce({ ok: true, text: async () => '# Full Docs\n\nAll content.' }) + + const result = await fetchCustomSet('fsa') + expect(result).toBe('# Full Docs\n\nAll content.') + }) + + it('throws when both custom set and fallback fail', async () => { + ;(fetch as ReturnType) + .mockResolvedValueOnce({ ok: false, status: 404 }) + .mockResolvedValueOnce({ ok: false, status: 500 }) + + await expect(fetchCustomSet('fsa')).rejects.toThrow('Failed to fetch docs content') + }) + + it('fetches all topic slugs without throwing', async () => { + const slugs: TopicSlug[] = [ + 'fsa', + 'sso', + 'scim', + 'agent-auth', + 'mcp', + 'm2m', + 'sdk', + 'quickstart', + ] + for (const slug of slugs) { + ;(fetch as ReturnType).mockResolvedValueOnce({ + ok: true, + text: async () => `# ${slug} docs`, + }) + const result = await fetchCustomSet(slug) + expect(result).toContain(slug) + } + }) +}) From dc598e83ca463c7360d9a59bf9d7ca4ea1b26bf0 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 13:21:15 -0400 Subject: [PATCH 17/40] feat(chatbot-api): implement search_docs tool using llms.txt custom sets --- services/chatbot-api/src/tools/search-docs.ts | 37 ++++++++++++++ .../tests/tools/search-docs.test.ts | 51 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 services/chatbot-api/src/tools/search-docs.ts create mode 100644 services/chatbot-api/tests/tools/search-docs.test.ts diff --git a/services/chatbot-api/src/tools/search-docs.ts b/services/chatbot-api/src/tools/search-docs.ts new file mode 100644 index 000000000..cc5ce63da --- /dev/null +++ b/services/chatbot-api/src/tools/search-docs.ts @@ -0,0 +1,37 @@ +import type { RegistryTool } from '@scalekit/agentkit' +import { classifyQuery, type TopicSlug } from '../lib/classify-query.js' +import { fetchCustomSet } from '../lib/fetch-custom-set.js' + +export const searchDocsTool: RegistryTool = { + definition: { + name: 'search_docs', + description: + 'Use this tool to search Scalekit documentation and answer questions. ' + + 'Always call this tool before answering any question about Scalekit products ' + + '(FSA, SSO, SCIM, Agent Auth, MCP, M2M, SDK). ' + + 'Returns the relevant documentation content as context.', + input_schema: { + type: 'object', + properties: { + query: { + type: 'string', + description: 'The user question to search for in the docs', + }, + topic: { + type: 'string', + enum: ['fsa', 'sso', 'scim', 'agent-auth', 'mcp', 'm2m', 'sdk', 'quickstart'], + description: + 'Optional topic override. If omitted, the topic is auto-detected from the query.', + }, + }, + required: ['query'], + }, + }, + execute: async (args) => { + const { query, topic } = args as { query: string; topic?: TopicSlug } + const resolvedTopic = topic ?? classifyQuery(query) + const content = await fetchCustomSet(resolvedTopic) + return content + }, + requiresConfirmation: false, +} diff --git a/services/chatbot-api/tests/tools/search-docs.test.ts b/services/chatbot-api/tests/tools/search-docs.test.ts new file mode 100644 index 000000000..c481bc775 --- /dev/null +++ b/services/chatbot-api/tests/tools/search-docs.test.ts @@ -0,0 +1,51 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { searchDocsTool } from '../../src/tools/search-docs.js' + +const MOCK_FSA_CONTENT = '# Full Stack Auth\n\nScalekit FSA documentation content here.' + +describe('searchDocsTool', () => { + beforeEach(() => { + vi.stubGlobal( + 'fetch', + vi.fn().mockResolvedValue({ + ok: true, + text: async () => MOCK_FSA_CONTENT, + }), + ) + process.env.DOCS_BASE_URL = 'https://docs.scalekit.com' + }) + + afterEach(() => { + vi.unstubAllGlobals() + }) + + it('has correct tool definition for Claude', () => { + expect(searchDocsTool.definition.name).toBe('search_docs') + expect(searchDocsTool.definition.description).toContain('search') + expect(searchDocsTool.definition.input_schema.properties).toHaveProperty('query') + }) + + it('returns docs content for a query', async () => { + const result = await searchDocsTool.execute( + { query: 'How do I set up RBAC?' }, + { userId: 'anon', orgId: '', isAdmin: false }, + ) + expect(result).toContain('Full Stack Auth') + }) + + it('accepts optional topic override', async () => { + const result = await searchDocsTool.execute( + { query: 'How do I set up RBAC?', topic: 'sso' }, + { userId: 'anon', orgId: '', isAdmin: false }, + ) + expect(result).toBeDefined() + expect(fetch).toHaveBeenCalledWith( + expect.stringContaining('enterprise-sso'), + expect.any(Object), + ) + }) + + it('does not require confirmation', () => { + expect(searchDocsTool.requiresConfirmation).toBeFalsy() + }) +}) From cdec179195a17832c19c02245723a8e62bccdde6 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 13:22:43 -0400 Subject: [PATCH 18/40] feat(chatbot-api): implement create_pylon_issue tool with confirmation --- .../src/tools/create-pylon-issue.ts | 85 ++++++++++++++ .../tests/tools/create-pylon-issue.test.ts | 107 ++++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 services/chatbot-api/src/tools/create-pylon-issue.ts create mode 100644 services/chatbot-api/tests/tools/create-pylon-issue.test.ts diff --git a/services/chatbot-api/src/tools/create-pylon-issue.ts b/services/chatbot-api/src/tools/create-pylon-issue.ts new file mode 100644 index 000000000..9e2b766c3 --- /dev/null +++ b/services/chatbot-api/src/tools/create-pylon-issue.ts @@ -0,0 +1,85 @@ +import type { RegistryTool, AgentContext } from '@scalekit/agentkit' + +interface PylonIssueArgs { + question: string + conversation_summary: string + user_email?: string +} + +export const createPylonIssueTool: RegistryTool = { + definition: { + name: 'create_pylon_issue', + description: + 'Create a support issue in Pylon when the documentation does not contain a confident answer. ' + + 'Only call this tool after the user has explicitly confirmed they want to create an issue. ' + + 'Include the original question and a summary of what was searched.', + input_schema: { + type: 'object', + properties: { + question: { + type: 'string', + description: "The user's original question that could not be answered from docs.", + }, + conversation_summary: { + type: 'string', + description: 'Brief summary of the conversation and what docs were searched.', + }, + user_email: { + type: 'string', + description: 'Optional email address provided by the user for follow-up.', + }, + }, + required: ['question', 'conversation_summary'], + }, + }, + execute: async (args, ctx: AgentContext) => { + const { question, conversation_summary, user_email } = args as PylonIssueArgs + + const token = process.env.PYLON_API_TOKEN + if (!token) throw new Error('PYLON_API_TOKEN environment variable is not set') + + const apiUrl = process.env.PYLON_API_URL ?? 'https://api.usepylon.com' + + const title = `Docs gap: ${question.slice(0, 80)}${question.length > 80 ? '…' : ''}` + + const body: Record = { + title, + body: [ + `**Question:** ${question}`, + '', + `**Context:** ${conversation_summary}`, + '', + `**Source:** docs chatbot`, + ctx.userId ? `**User:** ${ctx.userId}` : '', + ctx.orgId ? `**Org:** ${ctx.orgId}` : '', + user_email ? `**Contact:** ${user_email}` : '', + ] + .filter(Boolean) + .join('\n'), + tags: ['docs-gap'], + } + + if (ctx.userId) body.requester_email = ctx.userId + + const res = await fetch(`${apiUrl}/issues`, { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }) + + if (!res.ok) { + const text = await res.text().catch(() => '') + throw new Error(`Pylon API error ${res.status}: ${text}`) + } + + const issue = (await res.json()) as { id: string } + return { + issueId: issue.id, + message: `Support issue created (${issue.id}). Our team will follow up${ctx.userId ? ` with ${ctx.userId}` : ''}.`, + } + }, + requiresConfirmation: true, +} diff --git a/services/chatbot-api/tests/tools/create-pylon-issue.test.ts b/services/chatbot-api/tests/tools/create-pylon-issue.test.ts new file mode 100644 index 000000000..431d1f2fd --- /dev/null +++ b/services/chatbot-api/tests/tools/create-pylon-issue.test.ts @@ -0,0 +1,107 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { createPylonIssueTool } from '../../src/tools/create-pylon-issue.js' +import type { AgentContext } from '@scalekit/agentkit' + +const MOCK_ISSUE_RESPONSE = { + id: 'issue_abc123', + title: 'Docs gap: passkeys + SAML SSO', + status: 'open', +} + +describe('createPylonIssueTool', () => { + beforeEach(() => { + vi.stubGlobal( + 'fetch', + vi.fn().mockResolvedValue({ + ok: true, + json: async () => MOCK_ISSUE_RESPONSE, + }), + ) + process.env.PYLON_API_TOKEN = 'test-pylon-token' + process.env.PYLON_API_URL = 'https://api.usepylon.com' + }) + + afterEach(() => { + vi.unstubAllGlobals() + delete process.env.PYLON_API_TOKEN + delete process.env.PYLON_API_URL + }) + + it('has correct tool definition', () => { + expect(createPylonIssueTool.definition.name).toBe('create_pylon_issue') + expect(createPylonIssueTool.definition.input_schema.properties).toHaveProperty('question') + expect(createPylonIssueTool.definition.input_schema.properties).toHaveProperty( + 'conversation_summary', + ) + }) + + it('requires confirmation before executing', () => { + expect(createPylonIssueTool.requiresConfirmation).toBe(true) + }) + + it('creates an issue with user context when user is identified', async () => { + const ctx: AgentContext = { + userId: 'jane@acme.com', + orgId: 'org_acme', + isAdmin: false, + } + + const result = (await createPylonIssueTool.execute( + { + question: 'Can passkeys and SAML SSO coexist for the same org?', + conversation_summary: + 'User asked about passkeys + SAML, no confident answer found in docs.', + }, + ctx, + )) as { issueId: string; message: string } + + expect(fetch).toHaveBeenCalledWith( + expect.stringContaining('usepylon.com'), + expect.objectContaining({ + method: 'POST', + headers: expect.objectContaining({ + Authorization: 'Bearer test-pylon-token', + }), + }), + ) + expect(result.issueId).toBe('issue_abc123') + expect(result.message).toContain('issue_abc123') + }) + + it('creates an issue for anonymous users without user context', async () => { + const ctx: AgentContext = { + userId: '', + orgId: '', + isAdmin: false, + } + + await createPylonIssueTool.execute( + { question: 'How does M2M auth work?', conversation_summary: 'No answer found.' }, + ctx, + ) + + expect(fetch).toHaveBeenCalled() + }) + + it('throws with a clear message when PYLON_API_TOKEN is missing', async () => { + delete process.env.PYLON_API_TOKEN + const ctx: AgentContext = { userId: '', orgId: '', isAdmin: false } + + await expect( + createPylonIssueTool.execute({ question: 'test', conversation_summary: 'test' }, ctx), + ).rejects.toThrow('PYLON_API_TOKEN') + }) + + it('throws when Pylon API returns an error', async () => { + ;(fetch as ReturnType).mockResolvedValueOnce({ + ok: false, + status: 401, + text: async () => 'Unauthorized', + }) + const ctx: AgentContext = { userId: '', orgId: '', isAdmin: false } + + await expect( + createPylonIssueTool.execute({ question: 'test', conversation_summary: 'test' }, ctx), + ).rejects.toThrow('Pylon API error 401') + }) +}) From 01b8d2f5ed516ed708fbe55c89136c6effae19fb Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 13:24:33 -0400 Subject: [PATCH 19/40] feat(chatbot-api): wire AgentRunner with Express routes --- services/chatbot-api/src/agent.ts | 40 ++++++++++++++++++++ services/chatbot-api/src/index.ts | 28 ++++++++++++++ services/chatbot-api/tests/agent.test.ts | 48 ++++++++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 services/chatbot-api/src/agent.ts create mode 100644 services/chatbot-api/tests/agent.test.ts diff --git a/services/chatbot-api/src/agent.ts b/services/chatbot-api/src/agent.ts new file mode 100644 index 000000000..b7b5268f7 --- /dev/null +++ b/services/chatbot-api/src/agent.ts @@ -0,0 +1,40 @@ +import Anthropic from '@anthropic-ai/sdk' +import { AgentRunner, ToolRegistry, InMemorySessionStore } from '@scalekit/agentkit' +import { searchDocsTool } from './tools/search-docs.js' +import { createPylonIssueTool } from './tools/create-pylon-issue.js' + +export const SYSTEM_PROMPT = `You are the Scalekit docs assistant. + +When answering questions: +1. ALWAYS call search_docs first before answering any product question. +2. Answer ONLY using content returned by search_docs. Do not use prior knowledge. +3. Always cite the source by mentioning the relevant docs section. +4. Keep answers concise and link to the relevant docs page when possible. + +If search_docs does not contain a clear answer to the question: +- Say explicitly: "I don't have a confident answer for this in the docs." +- Offer to create a support issue: "Would you like me to create a support issue so our team can follow up?" +- If the user confirms, call create_pylon_issue with the original question and a summary. + +Never guess or invent information about Scalekit products.` + +export function createAgent() { + const anthropic = new Anthropic({ + apiKey: process.env.ANTHROPIC_API_KEY, + }) + + const tools = new ToolRegistry() + tools.register(searchDocsTool) + tools.register(createPylonIssueTool) + + const runner = new AgentRunner({ + anthropic, + systemPrompt: SYSTEM_PROMPT, + tools, + sessionStore: new InMemorySessionStore(), + model: 'claude-haiku-4-5-20251001', + maxTokens: 1024, + }) + + return { runner, tools } +} diff --git a/services/chatbot-api/src/index.ts b/services/chatbot-api/src/index.ts index d60d228e3..9003dd2ec 100644 --- a/services/chatbot-api/src/index.ts +++ b/services/chatbot-api/src/index.ts @@ -1,13 +1,41 @@ import 'dotenv/config' import express from 'express' +import { createAgentRouter } from '@scalekit/agentkit/express' +import { searchDocsTool } from './tools/search-docs.js' +import { createPylonIssueTool } from './tools/create-pylon-issue.js' +import { SYSTEM_PROMPT } from './agent.js' const app = express() app.use(express.json()) +app.use((_req, res, next) => { + res.setHeader('Access-Control-Allow-Origin', '*') + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, x-user-id, x-org-id, x-is-admin') + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') + next() +}) + +app.options('*', (_req, res) => res.sendStatus(200)) + app.get('/health', (_req, res) => { res.json({ status: 'ok' }) }) +app.use( + '/api/chat', + createAgentRouter({ + systemPrompt: SYSTEM_PROMPT, + tools: [searchDocsTool, createPylonIssueTool], + model: 'claude-haiku-4-5-20251001', + maxTokens: 1024, + context: (req) => ({ + userId: (req.headers['x-user-id'] as string) ?? '', + orgId: (req.headers['x-org-id'] as string) ?? '', + isAdmin: req.headers['x-is-admin'] === 'true', + }), + }), +) + const port = process.env.PORT ?? 3001 app.listen(port, () => { console.log(`chatbot-api listening on http://localhost:${port}`) diff --git a/services/chatbot-api/tests/agent.test.ts b/services/chatbot-api/tests/agent.test.ts new file mode 100644 index 000000000..6038d1880 --- /dev/null +++ b/services/chatbot-api/tests/agent.test.ts @@ -0,0 +1,48 @@ +import { describe, it, expect, vi, afterEach } from 'vitest' + +vi.mock('@anthropic-ai/sdk', () => { + return { + default: vi.fn().mockImplementation(() => ({ + messages: { + create: vi.fn().mockResolvedValue({ + id: 'msg_test', + content: [{ type: 'text', text: 'Based on the docs, here is how FSA sessions work...' }], + stop_reason: 'end_turn', + usage: { input_tokens: 100, output_tokens: 50 }, + }), + }, + })), + } +}) + +vi.stubGlobal( + 'fetch', + vi.fn().mockResolvedValue({ + ok: true, + text: async () => '# FSA Docs\n\nSession management works by...', + }), +) + +describe('createAgent', () => { + afterEach(() => { + vi.clearAllMocks() + }) + + it('creates an agent with search_docs and create_pylon_issue tools', async () => { + process.env.ANTHROPIC_API_KEY = 'test-key' + const { createAgent } = await import('../src/agent.js') + const { runner, tools } = createAgent() + + expect(runner).toBeDefined() + expect(tools.size).toBe(2) + }) + + it('registers search_docs without confirmation and create_pylon_issue with confirmation', async () => { + process.env.ANTHROPIC_API_KEY = 'test-key' + const { createAgent } = await import('../src/agent.js') + const { tools } = createAgent() + + expect(tools.requiresConfirmation('search_docs')).toBe(false) + expect(tools.requiresConfirmation('create_pylon_issue')).toBe(true) + }) +}) From c8dd43670cf07f255a987de4df0c828c1627136f Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 13:29:27 -0400 Subject: [PATCH 20/40] feat(docs): integrate chatbot widget into Starlight layout --- src/components/chatbot/ChatbotWidget.astro | 69 ++++++++++++++++++++++ src/components/overrides/Head.astro | 3 + 2 files changed, 72 insertions(+) create mode 100644 src/components/chatbot/ChatbotWidget.astro diff --git a/src/components/chatbot/ChatbotWidget.astro b/src/components/chatbot/ChatbotWidget.astro new file mode 100644 index 000000000..417dc87d3 --- /dev/null +++ b/src/components/chatbot/ChatbotWidget.astro @@ -0,0 +1,69 @@ +--- +// Chatbot widget component. +// Currently uses AgentTerminal as placeholder. +// Replace with AgentChatBubble once @scalekit/agentkit UI variants are complete. +const chatApiUrl = import.meta.env.PUBLIC_CHATBOT_API_URL ?? 'http://localhost:3001' +--- + + + + + + + + diff --git a/src/components/overrides/Head.astro b/src/components/overrides/Head.astro index 4f694bba7..0706da1ca 100644 --- a/src/components/overrides/Head.astro +++ b/src/components/overrides/Head.astro @@ -1,7 +1,10 @@ --- import Default from '@astrojs/starlight/components/Head.astro' +import ChatbotWidget from '../chatbot/ChatbotWidget.astro' --- + + From b5d165f8f9f624f0e7d905ff5ddec3a371d73fab Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 13:30:18 -0400 Subject: [PATCH 21/40] docs(chatbot-api): add service README --- services/chatbot-api/README.md | 48 ++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 services/chatbot-api/README.md diff --git a/services/chatbot-api/README.md b/services/chatbot-api/README.md new file mode 100644 index 000000000..de56f92c1 --- /dev/null +++ b/services/chatbot-api/README.md @@ -0,0 +1,48 @@ +# chatbot-api + +Node.js Express service powering the Scalekit docs chatbot. Answers questions grounded in the docs llms.txt custom sets, and creates Pylon support issues for questions it can't answer. + +## Setup + +```bash +npm install +cp .env.example .env +# Fill in ANTHROPIC_API_KEY and PYLON_API_TOKEN in .env +``` + +## Run + +```bash +npm run dev # development with hot reload +npm start # production +``` + +## Test + +```bash +npm test +``` + +## Environment variables + +| Variable | Required | Description | +| ------------------- | -------- | --------------------------------------------------------------------- | +| `ANTHROPIC_API_KEY` | Yes | Anthropic API key | +| `PYLON_API_TOKEN` | Yes | Pylon API Bearer token | +| `DOCS_BASE_URL` | No | Docs URL for llms.txt fetching (default: `https://docs.scalekit.com`) | +| `PYLON_API_URL` | No | Pylon API base URL (default: `https://api.usepylon.com`) | +| `PORT` | No | Port to listen on (default: `3001`) | + +## Endpoints + +- `GET /health` — health check +- `POST /api/chat` — send a message, returns SSE stream +- `POST /api/chat/confirm` — confirm or cancel a pending tool action (e.g. create Pylon issue) + +## How it works + +1. User sends a question to `POST /api/chat` +2. The agent calls `search_docs`, which classifies the query topic and fetches the matching llms.txt custom set from docs.scalekit.com +3. Claude answers using only the fetched docs content +4. If the question can't be answered, the agent offers to create a Pylon issue +5. If the user confirms, `create_pylon_issue` fires (requires explicit confirmation via `POST /api/chat/confirm`) From 420d31e6dfd5df09a0d8abc8a2355e63f7e896a1 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 13:47:15 -0400 Subject: [PATCH 22/40] chore: update pnpm lock file --- pnpm-lock.yaml | 97 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 70 insertions(+), 27 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26d29d6a0..b107bdaf9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,7 +170,7 @@ importers: version: 0.2.5(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)) '@tailwindcss/vite': specifier: ^4.2.2 - version: 4.2.2(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) + version: 4.2.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) '@types/react': specifier: ^19.2.14 version: 19.2.14 @@ -233,10 +233,10 @@ importers: version: 0.12.0(@astrojs/starlight@0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3))) starlight-page-actions: specifier: ^0.5.0 - version: 0.5.0(@astrojs/starlight@0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)))(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3))(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) + version: 0.5.0(@astrojs/starlight@0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)))(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) starlight-plugin-icons: specifier: ^1.1.6 - version: 1.1.6(@astrojs/starlight@0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)))(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3))(typescript@5.9.3)(unocss@66.4.2(postcss@8.5.8)(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)))(zod@3.25.76) + version: 1.1.6(@astrojs/starlight@0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)))(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3))(typescript@5.9.3)(unocss@66.4.2(postcss@8.5.8)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)))(zod@4.3.6) starlight-showcases: specifier: ^0.3.2 version: 0.3.2(@astrojs/starlight@0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3))) @@ -267,7 +267,7 @@ importers: version: 0.4.14(typescript@5.9.3) '@vitejs/plugin-vue': specifier: ^6.0.5 - version: 6.0.5(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)) + version: 6.0.5(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)) cross-env: specifier: ^10.1.0 version: 10.1.0 @@ -1395,89 +1395,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -2013,36 +2029,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-wasm@2.5.6': resolution: {integrity: sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA==} @@ -2183,66 +2205,79 @@ packages: resolution: {integrity: sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.0': resolution: {integrity: sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.0': resolution: {integrity: sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.0': resolution: {integrity: sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.0': resolution: {integrity: sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.0': resolution: {integrity: sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.0': resolution: {integrity: sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.0': resolution: {integrity: sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.0': resolution: {integrity: sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.0': resolution: {integrity: sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.0': resolution: {integrity: sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.0': resolution: {integrity: sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.0': resolution: {integrity: sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.60.0': resolution: {integrity: sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==} @@ -2489,24 +2524,28 @@ packages: engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.2.2': resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.2.2': resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.2.2': resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.2.2': resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} @@ -4759,24 +4798,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -9816,12 +9859,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - '@tailwindcss/vite@4.2.2(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))': dependencies: '@tailwindcss/node': 4.2.2 '@tailwindcss/oxide': 4.2.2 tailwindcss: 4.2.2 - vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) '@tanstack/virtual-core@3.13.23': {} @@ -9985,13 +10028,13 @@ snapshots: unhead: 2.1.12 vue: 3.5.31(typescript@5.9.3) - '@unocss/astro@66.4.2(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))': + '@unocss/astro@66.4.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))': dependencies: '@unocss/core': 66.4.2 '@unocss/reset': 66.4.2 - '@unocss/vite': 66.4.2(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) + '@unocss/vite': 66.4.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) optionalDependencies: - vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) '@unocss/cli@66.4.2': dependencies: @@ -10120,7 +10163,7 @@ snapshots: dependencies: '@unocss/core': 66.4.2 - '@unocss/vite@66.4.2(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))': + '@unocss/vite@66.4.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))': dependencies: '@ampproject/remapping': 2.3.0 '@unocss/config': 66.4.2 @@ -10131,7 +10174,7 @@ snapshots: pathe: 2.0.3 tinyglobby: 0.2.15 unplugin-utils: 0.2.5 - vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) '@usesapient/agent-tracker@0.1.1': {} @@ -10203,10 +10246,10 @@ snapshots: vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) vue: 3.5.31(typescript@5.9.3) - '@vitejs/plugin-vue@6.0.5(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.5(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 - vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) vue: 3.5.31(typescript@5.9.3) '@vue/babel-helper-vue-transform-on@1.5.0': {} @@ -14301,16 +14344,16 @@ snapshots: dependencies: '@astrojs/starlight': 0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)) - starlight-page-actions@0.5.0(@astrojs/starlight@0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)))(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3))(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)): + starlight-page-actions@0.5.0(@astrojs/starlight@0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)))(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)): dependencies: '@astrojs/starlight': 0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)) astro: 5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3) - vite-plugin-static-copy: 3.4.0(patch_hash=af70d2811d381cdea319ad374155ad8bf276cf04bf80834dd64bc0800a7cd4a3)(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) - vite-plugin-virtual: 0.5.0(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) + vite-plugin-static-copy: 3.4.0(patch_hash=af70d2811d381cdea319ad374155ad8bf276cf04bf80834dd64bc0800a7cd4a3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) + vite-plugin-virtual: 0.5.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) transitivePeerDependencies: - vite - starlight-plugin-icons@1.1.6(@astrojs/starlight@0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)))(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3))(typescript@5.9.3)(unocss@66.4.2(postcss@8.5.8)(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)))(zod@3.25.76): + starlight-plugin-icons@1.1.6(@astrojs/starlight@0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)))(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3))(typescript@5.9.3)(unocss@66.4.2(postcss@8.5.8)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)))(zod@4.3.6): dependencies: '@astrojs/starlight': 0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)) astro: 5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3) @@ -14321,8 +14364,8 @@ snapshots: rehype: 13.0.2 typescript: 5.9.3 unist-util-visit: 5.1.0 - unocss: 66.4.2(postcss@8.5.8)(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) - zod: 3.25.76 + unocss: 66.4.2(postcss@8.5.8)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) + zod: 4.3.6 starlight-showcases@0.3.2(@astrojs/starlight@0.37.7(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3))): dependencies: @@ -14798,9 +14841,9 @@ snapshots: dependencies: normalize-path: 2.1.1 - unocss@66.4.2(postcss@8.5.8)(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)): + unocss@66.4.2(postcss@8.5.8)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)): dependencies: - '@unocss/astro': 66.4.2(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) + '@unocss/astro': 66.4.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) '@unocss/cli': 66.4.2 '@unocss/core': 66.4.2 '@unocss/postcss': 66.4.2(postcss@8.5.8) @@ -14818,9 +14861,9 @@ snapshots: '@unocss/transformer-compile-class': 66.4.2 '@unocss/transformer-directives': 66.4.2 '@unocss/transformer-variant-group': 66.4.2 - '@unocss/vite': 66.4.2(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) + '@unocss/vite': 66.4.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) optionalDependencies: - vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) transitivePeerDependencies: - postcss - supports-color @@ -14930,17 +14973,17 @@ snapshots: dependencies: monaco-editor: 0.54.0 - vite-plugin-static-copy@3.4.0(patch_hash=af70d2811d381cdea319ad374155ad8bf276cf04bf80834dd64bc0800a7cd4a3)(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)): + vite-plugin-static-copy@3.4.0(patch_hash=af70d2811d381cdea319ad374155ad8bf276cf04bf80834dd64bc0800a7cd4a3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)): dependencies: chokidar: 3.6.0 p-map: 7.0.4 picocolors: 1.1.1 tinyglobby: 0.2.15 - vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) - vite-plugin-virtual@0.5.0(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)): + vite-plugin-virtual@0.5.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)): dependencies: - vite: 6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) + vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) vite-plugin-vue-devtools@7.7.9(rollup@4.60.0)(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)): dependencies: From c869f34741c79c1669596302ec05dd12792c6708 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 15:14:23 -0400 Subject: [PATCH 23/40] fix(chatbot-api): fix TypeScript cast in create-pylon-issue for production build --- services/chatbot-api/src/tools/create-pylon-issue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/chatbot-api/src/tools/create-pylon-issue.ts b/services/chatbot-api/src/tools/create-pylon-issue.ts index 9e2b766c3..df38075ac 100644 --- a/services/chatbot-api/src/tools/create-pylon-issue.ts +++ b/services/chatbot-api/src/tools/create-pylon-issue.ts @@ -33,7 +33,7 @@ export const createPylonIssueTool: RegistryTool = { }, }, execute: async (args, ctx: AgentContext) => { - const { question, conversation_summary, user_email } = args as PylonIssueArgs + const { question, conversation_summary, user_email } = args as unknown as PylonIssueArgs const token = process.env.PYLON_API_TOKEN if (!token) throw new Error('PYLON_API_TOKEN environment variable is not set') From e15c91bd75b7ae130a720fd1f33cfbb3ace1fab6 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 15:14:25 -0400 Subject: [PATCH 24/40] chore: add render.yaml for chatbot-api deployment --- render.yaml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 render.yaml diff --git a/render.yaml b/render.yaml new file mode 100644 index 000000000..6a026d5e1 --- /dev/null +++ b/render.yaml @@ -0,0 +1,21 @@ +services: + - type: web + name: scalekit-chatbot-api + runtime: node + rootDir: services/chatbot-api + buildCommand: npm install && npm run build + startCommand: npm start + healthCheckPath: /health + envVars: + - key: ANTHROPIC_API_KEY + sync: false + - key: PYLON_API_TOKEN + sync: false + - key: DOCS_BASE_URL + value: https://docs.scalekit.com + - key: PYLON_API_URL + value: https://api.usepylon.com + - key: PORT + value: 3001 + - key: NODE_VERSION + value: 20 From fe685940f35a8f9bb87d71b61e32ed891d41f0b0 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 15:53:39 -0400 Subject: [PATCH 25/40] fix(chatbot-api): use (.*) instead of * for Express 5 OPTIONS route --- services/chatbot-api/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/chatbot-api/src/index.ts b/services/chatbot-api/src/index.ts index 9003dd2ec..d2c305994 100644 --- a/services/chatbot-api/src/index.ts +++ b/services/chatbot-api/src/index.ts @@ -15,7 +15,7 @@ app.use((_req, res, next) => { next() }) -app.options('*', (_req, res) => res.sendStatus(200)) +app.options('(.*)', (_req, res) => res.sendStatus(200)) app.get('/health', (_req, res) => { res.json({ status: 'ok' }) From c31c8826bd14915f9b9c01caf84dbd86d87f95f5 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 15:57:47 -0400 Subject: [PATCH 26/40] chore: install @scalekit/agentkit in docs site for widget bundling --- package.json | 4 +++- pnpm-lock.yaml | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1e7e0dc2b..16e5de96e 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "@iconify-json/teenyicons": "^1.2.2", "@scalar/api-reference": "^1.49.5", "@scalar/astro": "^0.2.5", + "@scalekit/agentkit": "github:scalekit-inc/agentkit", "@tailwindcss/vite": "^4.2.2", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", @@ -120,7 +121,8 @@ "onlyBuiltDependencies": [ "sharp", "esbuild", - "@parcel/watcher" + "@parcel/watcher", + "@scalekit/agentkit" ], "overrides": { "@astrojs/starlight-docsearch": "file:./vendor/docsearch", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b107bdaf9..ad7d22836 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -168,6 +168,9 @@ importers: '@scalar/astro': specifier: ^0.2.5 version: 0.2.5(astro@5.18.1(@netlify/blobs@10.7.4)(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.60.0)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)) + '@scalekit/agentkit': + specifier: github:scalekit-inc/agentkit + version: https://codeload.github.com/scalekit-inc/agentkit/tar.gz/27c225b59966e45f105876c975e22bac49353181(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) @@ -336,6 +339,15 @@ packages: '@antfu/utils@0.7.10': resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@anthropic-ai/sdk@0.80.0': + resolution: {integrity: sha512-WeXLn7zNVk3yjeshn+xZHvld6AoFUOR3Sep6pSoHho5YbSi6HwcirqgPA5ccFuW8QTVJAAU7N8uQQC6Wa9TG+g==} + hasBin: true + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + '@aria-ui/core@0.0.22': resolution: {integrity: sha512-N/UC2JJ8fA46WAc5TBNM9NZMcmQ3ghqDt1DNa7XdXHqHhDYkZ7Mn0Yn6KEciiIvlP+yuxLrPO/Q1oB4CNV21kg==} @@ -2422,6 +2434,24 @@ packages: resolution: {integrity: sha512-MveL4M+pmf90YEVxAv1t1xvoZXJztUS/kdv+ACdNV6G6Idpkb2voA+XtA9l5ZP7AW1QatBdUblRq8FxOp7dx1A==} engines: {node: '>=22'} + '@scalekit/agentkit@https://codeload.github.com/scalekit-inc/agentkit/tar.gz/27c225b59966e45f105876c975e22bac49353181': + resolution: {tarball: https://codeload.github.com/scalekit-inc/agentkit/tar.gz/27c225b59966e45f105876c975e22bac49353181} + version: 0.1.0 + peerDependencies: + express: ^4.0.0 || ^5.0.0 + next: ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + express: + optional: true + next: + optional: true + react: + optional: true + react-dom: + optional: true + '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -4677,6 +4707,10 @@ packages: engines: {node: '>=6'} hasBin: true + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -6406,6 +6440,9 @@ packages: resolution: {integrity: sha512-QVsbr1WhGLq2F0oDyYbqtOXcf3gcnL8C9H5EX8bBwAr8ZWvWGJzukpPrDrWgJMrNtgDbo74BIjI4kJu3q2xQWw==} engines: {node: '>=18.18.0'} + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -7080,6 +7117,12 @@ snapshots: '@antfu/utils@0.7.10': {} + '@anthropic-ai/sdk@0.80.0(zod@4.3.6)': + dependencies: + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 4.3.6 + '@aria-ui/core@0.0.22': dependencies: '@ariatype/aria-attributes': 1.0.2 @@ -9713,6 +9756,15 @@ snapshots: - supports-color - typescript + '@scalekit/agentkit@https://codeload.github.com/scalekit-inc/agentkit/tar.gz/27c225b59966e45f105876c975e22bac49353181(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)': + dependencies: + '@anthropic-ai/sdk': 0.80.0(zod@4.3.6) + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + transitivePeerDependencies: + - zod + '@sec-ant/readable-stream@0.4.1': {} '@shikijs/core@3.23.0': @@ -12416,6 +12468,11 @@ snapshots: jsesc@3.1.0: {} + json-schema-to-ts@3.1.1: + dependencies: + '@babel/runtime': 7.29.2 + ts-algebra: 2.0.0 + json-schema-traverse@1.0.0: {} json-schema@0.4.0: {} @@ -14660,6 +14717,8 @@ snapshots: string-byte-length: 3.0.1 string-byte-slice: 3.0.1 + ts-algebra@2.0.0: {} + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 From 442829bbfe2285628fb422d98793a8245a6f56bb Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 16:47:26 -0400 Subject: [PATCH 27/40] fix(docs): remove is:inline so Vite bundles agentkit/react import --- src/components/chatbot/ChatbotWidget.astro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/chatbot/ChatbotWidget.astro b/src/components/chatbot/ChatbotWidget.astro index 417dc87d3..d7b454fad 100644 --- a/src/components/chatbot/ChatbotWidget.astro +++ b/src/components/chatbot/ChatbotWidget.astro @@ -41,9 +41,9 @@ const chatApiUrl = import.meta.env.PUBLIC_CHATBOT_API_URL ?? 'http://localhost:3 } - From f0b14587558f55668f79fdc15e3f1f3a85071fe1 Mon Sep 17 00:00:00 2001 From: Ravi Madabhushi Date: Mon, 30 Mar 2026 17:17:44 -0400 Subject: [PATCH 30/40] feat(docs): replace AgentTerminal with custom styled chat widget UI --- src/components/chatbot/ChatbotWidget.astro | 557 +++++++++++++++++++-- 1 file changed, 505 insertions(+), 52 deletions(-) diff --git a/src/components/chatbot/ChatbotWidget.astro b/src/components/chatbot/ChatbotWidget.astro index eac19cdaa..ea626fb1a 100644 --- a/src/components/chatbot/ChatbotWidget.astro +++ b/src/components/chatbot/ChatbotWidget.astro @@ -1,72 +1,525 @@ --- -// Chatbot widget component. -// Currently uses AgentTerminal as placeholder. -// Replace with AgentChatBubble once @scalekit/agentkit UI variants are complete. +// Docs chatbot widget. +// Talks directly to the chatbot-api SSE endpoint — no React dependency. +// Replace with @scalekit/agentkit ChatBubble variant once UI variants are complete. const chatApiUrl = import.meta.env.PUBLIC_CHATBOT_API_URL ?? 'http://localhost:3001' --- -