From 8d166b47c1549ee74a2a315315c9b4d224bc1ede Mon Sep 17 00:00:00 2001 From: Alex Newman Date: Mon, 20 Apr 2026 12:18:55 -0700 Subject: [PATCH] Revert "revert: roll back v12.3.3 (Issue Blowout 2026)" This reverts commit bfc7de377a88ea3d5168681df209571010ff0209. --- ISSUE-BLOWOUT-TODO.md | 228 ++++++++++++++ docker/claude-mem/run.sh | 2 +- plugin/hooks/hooks.json | 6 +- plugin/scripts/context-generator.cjs | 2 +- plugin/ui/viewer-bundle.js | 20 +- scripts/sync-marketplace.cjs | 14 +- src/cli/handlers/session-init.ts | 30 +- src/cli/handlers/summarize.ts | 28 +- src/integrations/opencode-plugin/index.ts | 8 +- src/services/sqlite/PendingMessageStore.ts | 19 ++ src/services/sqlite/SessionSearch.ts | 31 +- src/services/transcripts/processor.ts | 15 + src/services/worker-service.ts | 28 +- src/services/worker-types.ts | 4 +- src/services/worker/ProcessRegistry.ts | 18 +- src/services/worker/RestartGuard.ts | 70 +++++ src/services/worker/SDKAgent.ts | 4 +- src/services/worker/SearchManager.ts | 287 +++++++++++++----- src/services/worker/SessionManager.ts | 42 ++- .../worker/agents/ResponseProcessor.ts | 2 + src/services/worker/http/middleware.ts | 37 ++- src/services/worker/http/routes/DataRoutes.ts | 49 +++ .../worker/http/routes/SessionRoutes.ts | 24 +- src/shared/SettingsDefaultsManager.ts | 2 +- src/ui/viewer/components/LogsModal.tsx | 5 +- src/ui/viewer/hooks/useContextPreview.ts | 5 +- src/ui/viewer/hooks/usePagination.ts | 3 +- src/ui/viewer/hooks/useSettings.ts | 44 ++- src/ui/viewer/hooks/useStats.ts | 3 +- src/ui/viewer/utils/api.ts | 7 + 30 files changed, 869 insertions(+), 168 deletions(-) create mode 100644 ISSUE-BLOWOUT-TODO.md create mode 100644 src/services/worker/RestartGuard.ts create mode 100644 src/ui/viewer/utils/api.ts diff --git a/ISSUE-BLOWOUT-TODO.md b/ISSUE-BLOWOUT-TODO.md new file mode 100644 index 00000000..b11534cd --- /dev/null +++ b/ISSUE-BLOWOUT-TODO.md @@ -0,0 +1,228 @@ +# Issue Blowout 2026 - Running TODO + +Branch: `issue-blowout-2026` (merged as PR #2079) +Strategy: Cynical dev. Every bug report is suspect — look for overengineered band-aids as root cause. +Test gate: After every build-and-sync, verify observations are flowing. +Released: **v12.3.2** on 2026-04-19 + +## Instructions for Continuation + +### Workflow per issue +1. Use `/make-plan` and `/do` to attack each issue's root cause +2. Be cynical — most bug reports are surface-level; the real issue is usually overengineered band-aids +3. After every `npm run build-and-sync`, verify observations flow: + ```bash + sleep 5 && sqlite3 ~/.claude-mem/claude-mem.db "SELECT COUNT(*) FROM observations WHERE created_at_epoch > (strftime('%s','now') - 120) * 1000" + ``` +4. If observations stop flowing, that's a regression — fix it before continuing + +### Docker isolation +- **Port 37777**: Host's live bun worker (YOUR claude-mem instance — don't touch) +- **Port 37778**: Another agent's docker container (`claude-mem-dev`) — hands off +- **Your docker**: Use tag `claude-mem:blowout`, data dir `.docker-blowout-data/` + ```bash + TAG=claude-mem:blowout docker/claude-mem/build.sh + HOST_MEM_DIR=$(pwd)/.docker-blowout-data TAG=claude-mem:blowout docker/claude-mem/run.sh + ``` +- Check observations in docker DB: + ```bash + sqlite3 .docker-blowout-data/claude-mem.db 'select count(*) from observations' + ``` + +### PR → Review → Merge → Release cycle +1. Create PR from feature branch to main +2. Start review loop: `/loop 2m` to check and resolve review comments + - CodeRabbit and Greptile post inline comments — read, fix, commit, push, reply + - `claude-review` is a CI check — just needs to pass + - CodeRabbit can take 5-10 min to process after each push +3. When all reviews pass: `gh pr merge --repo thedotmack/claude-mem --squash --delete-branch --admin` +4. Close resolved issues: `for issue in ; do gh issue close $issue --repo thedotmack/claude-mem --comment "Fixed in PR #XXXX"; done` +5. Version bump: + ```bash + cd ~/Scripts/claude-mem + git pull origin main + # Run /version-bump patch (or use the skill: claude-mem:version-bump) + # It handles: version files → build → commit → tag → push → gh release → changelog + ``` + +### Key files in the codebase +- **Parser**: `src/sdk/parser.ts` — observation and summary XML parsing +- **Prompts**: `src/sdk/prompts.ts` — LLM prompt templates (observation, summary, continuation) +- **ResponseProcessor**: `src/services/worker/agents/ResponseProcessor.ts` — unified response handler +- **SessionManager**: `src/services/worker/SessionManager.ts` — queue, sessions, circuit breaker +- **SessionSearch**: `src/services/sqlite/SessionSearch.ts` — FTS5 and filter queries +- **SearchManager**: `src/services/worker/SearchManager.ts` — hybrid Chroma+SQLite orchestration +- **Worker service**: `src/services/worker-service.ts` — periodic reapers, startup +- **Summarize hook**: `src/cli/handlers/summarize.ts` — Stop hook entry point +- **SessionRoutes**: `src/services/worker/http/routes/SessionRoutes.ts` — HTTP API +- **ViewerRoutes**: `src/services/worker/http/routes/ViewerRoutes.ts` — /health endpoint +- **Agents**: `src/services/worker/SDKAgent.ts`, `GeminiAgent.ts`, `OpenRouterAgent.ts` +- **Modes**: `plugin/modes/code.json` — prompt field values for the default mode +- **Migrations**: `src/services/sqlite/migrations/runner.ts` +- **PendingMessageStore**: `src/services/sqlite/PendingMessageStore.ts` — queue persistence + +## Completed Phase 2-5 (16 more issues — this session) + +| # | Component | Issue | Resolution | +|---|-----------|-------|------------| +| 2053 | worker | Generator restart guard strands pending messages | FIXED — Time-windowed RestartGuard replaces flat counter (10 restarts/60s window, 5min decay) | +| 1868 | worker | SDK pool deadlock: idle sessions monopolize slots | FIXED — evictIdlestSession() callback in waitForSlot() preempts idle sessions | +| 1876 | worker | MCP loopback self-check fails; crash misclassification | FIXED — process.execPath replaces bare 'node'; removed false "exited unexpectedly" log | +| 1901 | hooks | Summarize stop hook exits code 2 on errors | FIXED — workerHttpRequest wrapped in try/catch, exits gracefully | +| 1907 | hooks | Linux/WSL session-init before worker healthy | FIXED — health-check curl loop added to UserPromptSubmit hook; HTTP call wrapped | +| 1896 | hooks | PreToolUse file-context caps Read to limit:1 | CLOSED — already fixed (mtime comparison at file-context.ts:255-267) | +| 1903 | hooks | PostToolUse/Stop/SessionEnd never fire | CLOSED — no-repro (hooks.json correct; Claude Code 12.0.1 platform bug) | +| 1932 | security | Admin endpoints spoofable requireLocalhost | FIXED — bearer token auth on all API endpoints | +| 1933 | security | Unauthenticated HTTP API exposes 30+ endpoints | FIXED — auto-generated token at ~/.claude-mem/worker-auth-token (mode 0600) | +| 1934 | security | watch.context.path written without validation | FIXED — path traversal protection validates against project root / data dir | +| 1935 | security | Unbounded input, no rate limits | FIXED — 5MB body limit (was 50MB), 300 req/min/IP rate limiter | +| 1936 | security | Multi-user macOS shared port cross-user MCP | FIXED — per-user port derivation from UID (37700 + uid%100) | +| 1911 | search | search()/timeline() cross-project results | FIXED — project filter passed to Chroma queries and timeline anchor searches | +| 1912 | search | /api/search per-type endpoints ignore project | FIXED — project $or clause added to searchObservations/Sessions/UserPrompts | +| 1914 | search | Imported observations invisible to MCP search | FIXED — ChromaSync.syncObservation() called after import | +| 1918 | search | SessionStart "no previous sessions" on fresh sessions | FIXED — session-init cwd fallback matches context.ts (process.cwd()) | + +## Completed (9 issues — PR #2079, v12.3.2) + +| # | Component | Issue | Resolution | +|---|-----------|-------|------------| +| 1908 | summarizer | parseSummary discards output when LLM emits observation tags | CLOSED — already fixed by Gen 3 coercion (coerceObservationToSummary in parser.ts) | +| 1953 | db | Migration 7 rebuilds table every startup | CLOSED — already fixed by commit 59ce0fc5 (origin !== 'pk' filter) | +| 1916 | search | /api/search/by-concept emits malformed SQL | FIXED — concept→concepts remap in SearchManager.normalizeParams() | +| 1913 | search | Text search returns empty when ChromaDB disabled | FIXED — FTS5 keyword fallback in SessionSearch + SearchManager | +| 2048 | search | Text queries should fall back to FTS5 when Chroma disabled | FIXED — same as #1913 | +| 1957 | db | pending_messages: failed rows never purged | FIXED — periodic clearFailed() in stale session reaper (every 2 min) | +| 1956 | db | WAL grows unbounded, no checkpoint schedule | FIXED — journal_size_limit=4MB + periodic wal_checkpoint(PASSIVE) | +| 1874 | worker | processAgentResponse deletes queued messages on non-XML output | FIXED — mark messages failed (with retry) instead of confirming | +| 1867 | worker | Queue processor dies while /health stays green | FIXED — activeSessions count added to /health endpoint | + +Also fixed (not an issue): docker/claude-mem/run.sh nounset-safe TTY_ARGS expansion. +Also fixed (Greptile review): cached isFts5Available() at construction time. + +## Remaining — CRITICAL (5) + +| # | Component | Issue | +|---|-----------|-------| +| 1925 | mcp | chroma-mcp subprocess leak via null-before-close | +| 1926 | mcp | chroma-mcp stdio handshake broken across all versions | +| 1942 | auth | Default model not resolved on Bedrock/Vertex/Azure | +| 1943 | auth | SDK pipeline rejects Bedrock auth | +| 1880 | windows | Ghost LISTEN socket on port 37777 after crash | +| 1887 | windows | Failing worker blocks Claude Code MCP 10+ min in hook-restart loop | + +## Remaining — HIGH (32) + +| # | Component | Issue | +|---|-----------|-------| +| 1869 | worker | No mid-session auto-restart after inner crash | +| 1870 | worker | Stop hook blocks ~110s when SDK pool saturated | +| 1871 | worker | generateContext opens fresh SessionStore per call | +| 1875 | worker | Spawns uvx/node/claude by bare name; silent fail in non-interactive | +| 1877 | worker | Cross-session context bleed in same project dir | +| 1879 | worker | Session completion races in-flight summarize | +| 1890 | sdk-pool | SDK session resume during summarize causes context-overflow | +| 1892 | sdk-pool | Memory agent prompt defeats cache (dynamic before static) | +| 1895 | hooks | Stop hook spins 110s when worker older than v12.1.0 | +| 1897 | hooks | PreToolUse:Read lacks PATH export and cache-path lookup | +| 1899 | hooks | SessionStart additionalContext >10KB truncated to 2KB | +| 1902 | hooks | Stop and PostToolUse hooks synchronously block up to 120s | +| 1904 | hooks | UserPromptSubmit hooks skipped in git worktree sessions | +| 1905 | hooks | Saved_hook_context entries pegs CPU 100% on session load | +| 1906 | hooks | PR #1229 fallback path points to source, not cache | +| 1909 | summarizer | Summarize hook doesn't recognize Gemini transcripts | +| 1921 | mcp | Root .mcp.json is empty, mcp-search never registers | +| 1922 | mcp | MCP server uses 3s timeout for corpus prime/query | +| 1929 | installer | "Update now" fails for cache-only installs | +| 1930 | installer | Windows 11 ships smart-explore without tree-sitter | +| 1937 | observer | JSONL files accumulate indefinitely, tens of GB | +| 1938 | observer | Observer background sessions burn tokens with no budget | +| 1939 | cross-platform | Project key uses basename(cwd), fragmenting worktrees | +| 1941 | cross-platform | Linux worker with live-but-unhealthy PID blocks restart | +| 1944 | auth | ANTHROPIC_AUTH_TOKEN not forwarded to SDK subprocess | +| 1945 | auth | Vertex AI CLI auth fails silently on expired OAuth | +| 1947 | plugin-lifecycle | OpenCode tool args as plain objects not Zod schemas | +| 1948 | plugin-lifecycle | OpenClaw installer "plugin not found" | +| 1949 | plugin-lifecycle | OpenClaw per-agent memory isolation broken | +| 1950 | plugin-lifecycle | OpenClaw missing skills, session drift, workspaceDir loss | +| 1952 | db | ON UPDATE CASCADE rewrites historical session attribution | +| 1954 | db | observation_feedback schema mismatch source vs compiled | +| 1958 | viewer | Settings model dropdown destroys precise model IDs | +| 1881-1888 | windows | 8 Windows-specific bugs (paths, spawning, timeouts) | + +## Remaining — MEDIUM (21) + +| # | Component | Issue | +|---|-----------|-------| +| 1872 | worker | Gemini 400/401 triggers 2-min crash-recovery loop | +| 1873 | worker | worker-service.cjs killed by SIGKILL (unbounded heap) | +| 1878 | worker | Logger caches log file path, never rotates | +| 1891 | sdk-pool | Mode prompts in user messages, not system prompt | +| 1893 | sdk-pool | SDK sub-agents hardcoded permissionMode:"default" | +| 1894 | hooks | SessionStart can't find claude at ~/.local/bin | +| 1898 | hooks | SessionStart health-check uses hardcoded port 37777 | +| 1900 | hooks | Setup hook references non-existent scripts/setup.sh | +| 1910 | summarizer | Summary prompt leaks observation tags, ignores user_prompt | +| 1915 | search | Search results not deduplicated | +| 1917 | search | $CMEM context preview shows oldest instead of newest | +| 1920 | search | Context footer "ID" ambiguous across 3 ID spaces | +| 1923 | mcp | smart_outline empty for .txt files | +| 1924 | mcp | chroma-mcp child not terminated on exit | +| 1927 | mcp | chroma-mcp fails on WSL with ALL_PROXY=socks5 | +| 1928 | installer | BranchManager.pullUpdates() fails on cache-layout | +| 1931 | installer | npm run worker:status ENOENT .claude/package.json | +| 1940 | cross-platform | cmux.app wrapper "Claude executable not found" | +| 1946 | auth | OpenRouter 401 Missing Authentication header | +| 1955 | db | Duplicate observations bypass content-hash dedup | +| 1959 | viewer | SSE new_prompt broadcast dies after /reload-plugins | +| 1961 | misc | Traditional Chinese falls back to Simplified | + +## Remaining — LOW (3) + +| # | Component | Issue | +|---|-----------|-------| +| 1919 | search | Shared jsts tree-sitter query applies TS-only to JS | +| 1951 | plugin-lifecycle | OpenClaw lifecycle events stored as observations | +| 1960 | misc | OpenRouter URL hardcoded | + +## Remaining — NON-LABELED (1) + +| # | Component | Issue | +|---|-----------|-------| +| 2054 | installer | installCLI version-pinned alias can't self-update | + +## Suggested Next Attack Order + +### Phase 2: Worker stability — DONE +### Phase 3: Hooks reliability — DONE +### Phase 4: Security hardening — DONE +### Phase 5: Search remaining — DONE + +### Phase 6: MCP + Auth +- #1925, #1926, #1942, #1943 + +### Phase 7: Windows +- #1880, #1887, #1881-1888 + +### Phase 6: MCP / Chroma +- #1925, #1926, #2046, #1921 + +### Phase 7: Everything else +- Remaining hooks, installer, windows, observer, viewer, auth, plugin-lifecycle + +## Progress Log + +| Time | Action | Result | +|------|--------|--------| +| 9:40p | #1908 analyzed | Already fixed by Gen 3 coercion. Closed. | +| 9:51p | #1916 fixed | concept→concepts remap in normalizeParams | +| 9:53p | #1913/#2048 fixed | FTS5 fallback in SessionSearch + SearchManager | +| 9:57p | #1953 closed | Already fixed by commit 59ce0fc5 | +| 9:57p | #1957 fixed | Periodic clearFailed() in stale session reaper | +| 9:58p | #1956 fixed | journal_size_limit + periodic WAL checkpoint | +| 10:01p | #1874 fixed | Non-XML responses mark messages failed instead of confirming | +| 10:01p | #1867 fixed | Health endpoint includes activeSessions count | +| 10:02p | build-and-sync | Observations flowing. No regression. | +| 10:03p | PR #2079 created | 2 commits pushed | +| 10:06p | Greptile review | 2 comments — cached isFts5Available(). Fixed + pushed. | +| 10:20p | PR #2079 merged | All reviews passed (CodeRabbit, Greptile, claude-review) | +| 10:25p | v12.3.2 released | Tag pushed, GitHub release created, CHANGELOG updated | diff --git a/docker/claude-mem/run.sh b/docker/claude-mem/run.sh index 2d4e2fe2..4d8f62a5 100755 --- a/docker/claude-mem/run.sh +++ b/docker/claude-mem/run.sh @@ -56,7 +56,7 @@ else fi # Pick -it only when a TTY is attached (keeps non-interactive callers working). -# Initialize with a no-op flag so the array is never empty (nounset-safe). +# Initialize empty; expansion below safely omits args when the array is unset/empty. TTY_ARGS=() [[ -t 0 && -t 1 ]] && TTY_ARGS=(-it) diff --git a/plugin/hooks/hooks.json b/plugin/hooks/hooks.json index 9628ad45..045349aa 100644 --- a/plugin/hooks/hooks.json +++ b/plugin/hooks/hooks.json @@ -24,12 +24,12 @@ }, { "type": "command", -"command": "export PATH=\"$($SHELL -lc 'echo $PATH' 2>/dev/null):$PATH\"; _R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/thedotmack/claude-mem/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" start; for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do curl -sf http://localhost:37777/health >/dev/null 2>&1 && break; sleep 1; done; curl -sf http://localhost:37777/health >/dev/null 2>&1 || true; echo '{\"continue\":true,\"suppressOutput\":true}'", +"command": "export PATH=\"$($SHELL -lc 'echo $PATH' 2>/dev/null):$PATH\"; _R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/thedotmack/claude-mem/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" start; for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do curl -sf http://localhost:$((37700 + $(id -u 2>/dev/null || echo 77) % 100))/health >/dev/null 2>&1 && break; sleep 1; done; curl -sf http://localhost:$((37700 + $(id -u 2>/dev/null || echo 77) % 100))/health >/dev/null 2>&1 || true; echo '{\"continue\":true,\"suppressOutput\":true}'", "timeout": 60 }, { "type": "command", -"command": "export PATH=\"$($SHELL -lc 'echo $PATH' 2>/dev/null):$PATH\"; _R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/thedotmack/claude-mem/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do curl -sf http://localhost:37777/health >/dev/null 2>&1 && break; sleep 1; done; if curl -sf http://localhost:37777/health >/dev/null 2>&1; then node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" hook claude-code context || true; fi", +"command": "export PATH=\"$($SHELL -lc 'echo $PATH' 2>/dev/null):$PATH\"; _R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/thedotmack/claude-mem/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do curl -sf http://localhost:$((37700 + $(id -u 2>/dev/null || echo 77) % 100))/health >/dev/null 2>&1 && break; sleep 1; done; if curl -sf http://localhost:$((37700 + $(id -u 2>/dev/null || echo 77) % 100))/health >/dev/null 2>&1; then node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" hook claude-code context || true; fi", "timeout": 60 } ] @@ -40,7 +40,7 @@ "hooks": [ { "type": "command", - "command": "export PATH=\"$($SHELL -lc 'echo $PATH' 2>/dev/null):$PATH\"; _R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/thedotmack/claude-mem/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" hook claude-code session-init", + "command": "export PATH=\"$($SHELL -lc 'echo $PATH' 2>/dev/null):$PATH\"; _R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=$(ls -dt $HOME/.claude/plugins/cache/thedotmack/claude-mem/[0-9]*/ 2>/dev/null | head -1); _R=\"${_R%/}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; _HEALTH=0; curl -sf http://localhost:$((37700 + $(id -u 2>/dev/null || echo 77) % 100))/health >/dev/null 2>&1 && _HEALTH=1 || for i in 1 2 3 4 5 6 7 8 9 10; do sleep 1; curl -sf http://localhost:$((37700 + $(id -u 2>/dev/null || echo 77) % 100))/health >/dev/null 2>&1 && _HEALTH=1 && break; done; [ \"$_HEALTH\" = \"1\" ] && node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" hook claude-code session-init", "timeout": 60 } ] diff --git a/plugin/scripts/context-generator.cjs b/plugin/scripts/context-generator.cjs index ecfa124f..128a3888 100644 --- a/plugin/scripts/context-generator.cjs +++ b/plugin/scripts/context-generator.cjs @@ -657,7 +657,7 @@ ${o.stack}`:` ${o.message}`:this.getLevel()===0&&typeof o=="object"?u=` content_session_id, prompt_number, prompt_text, created_at, created_at_epoch ) VALUES (?, ?, ?, ?, ?) - `).run(e.content_session_id,e.prompt_number,e.prompt_text,e.created_at,e.created_at_epoch).lastInsertRowid}}};var Me=L(require("path"),1),xe=require("os");var C=require("fs"),x=require("path"),ne=require("os"),W=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-sonnet-4-6",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:"37777",CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"cli",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_GEMINI_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_GEMINI_MAX_TOKENS:"100000",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:(0,x.join)((0,ne.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"10",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_FOLDER_USE_LOCAL_MD:"false",CLAUDE_MEM_TRANSCRIPTS_ENABLED:"true",CLAUDE_MEM_TRANSCRIPTS_CONFIG_PATH:(0,x.join)((0,ne.homedir)(),".claude-mem","transcript-watch.json"),CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_SEMANTIC_INJECT:"false",CLAUDE_MEM_SEMANTIC_INJECT_LIMIT:"5",CLAUDE_MEM_TIER_ROUTING_ENABLED:"true",CLAUDE_MEM_TIER_SIMPLE_MODEL:"haiku",CLAUDE_MEM_TIER_SUMMARY_MODEL:"",CLAUDE_MEM_CHROMA_ENABLED:"true",CLAUDE_MEM_CHROMA_MODE:"local",CLAUDE_MEM_CHROMA_HOST:"127.0.0.1",CLAUDE_MEM_CHROMA_PORT:"8000",CLAUDE_MEM_CHROMA_SSL:"false",CLAUDE_MEM_CHROMA_API_KEY:"",CLAUDE_MEM_CHROMA_TENANT:"default_tenant",CLAUDE_MEM_CHROMA_DATABASE:"default_database"};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){return process.env[e]??this.DEFAULTS[e]}static getInt(e){let t=this.get(e);return parseInt(t,10)}static getBool(e){let t=this.get(e);return t==="true"||t===!0}static applyEnvOverrides(e){let t={...e};for(let s of Object.keys(this.DEFAULTS))process.env[s]!==void 0&&(t[s]=process.env[s]);return t}static loadFromFile(e){try{if(!(0,C.existsSync)(e)){let i=this.getAllDefaults();try{let a=(0,x.dirname)(e);(0,C.existsSync)(a)||(0,C.mkdirSync)(a,{recursive:!0}),(0,C.writeFileSync)(e,JSON.stringify(i,null,2),"utf-8"),console.log("[SETTINGS] Created settings file with defaults:",e)}catch(a){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,a instanceof Error?a.message:String(a))}return this.applyEnvOverrides(i)}let t=(0,C.readFileSync)(e,"utf-8"),s=JSON.parse(t),n=s;if(s.env&&typeof s.env=="object"){n=s.env;try{(0,C.writeFileSync)(e,JSON.stringify(n,null,2),"utf-8"),console.log("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(i){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,i instanceof Error?i.message:String(i))}}let o={...this.DEFAULTS};for(let i of Object.keys(this.DEFAULTS))n[i]!==void 0&&(o[i]=n[i]);return this.applyEnvOverrides(o)}catch(t){return console.warn("[SETTINGS] Failed to load settings, using defaults:",e,t instanceof Error?t.message:String(t)),this.applyEnvOverrides(this.getAllDefaults())}}};var U=require("fs"),q=require("path");var A=class r{static instance=null;activeMode=null;modesDir;constructor(){let e=Re(),t=[(0,q.join)(e,"modes"),(0,q.join)(e,"..","plugin","modes")],s=t.find(n=>(0,U.existsSync)(n));this.modesDir=s||t[0]}static getInstance(){return r.instance||(r.instance=new r),r.instance}parseInheritance(e){let t=e.split("--");if(t.length===1)return{hasParent:!1,parentId:"",overrideId:""};if(t.length>2)throw new Error(`Invalid mode inheritance: ${e}. Only one level of inheritance supported (parent--override)`);return{hasParent:!0,parentId:t[0],overrideId:e}}isPlainObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}deepMerge(e,t){let s={...e};for(let n in t){let o=t[n],i=e[n];this.isPlainObject(o)&&this.isPlainObject(i)?s[n]=this.deepMerge(i,o):s[n]=o}return s}loadModeFile(e){let t=(0,q.join)(this.modesDir,`${e}.json`);if(!(0,U.existsSync)(t))throw new Error(`Mode file not found: ${t}`);let s=(0,U.readFileSync)(t,"utf-8");return JSON.parse(s)}loadMode(e){let t=this.parseInheritance(e);if(!t.hasParent)try{let d=this.loadModeFile(e);return this.activeMode=d,_.debug("SYSTEM",`Loaded mode: ${d.name} (${e})`,void 0,{types:d.observation_types.map(m=>m.id),concepts:d.observation_concepts.map(m=>m.id)}),d}catch(d){if(d instanceof Error?_.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{message:d.message}):_.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{error:String(d)}),e==="code")throw new Error("Critical: code.json mode file missing");return this.loadMode("code")}let{parentId:s,overrideId:n}=t,o;try{o=this.loadMode(s)}catch(d){d instanceof Error?_.warn("WORKER",`Parent mode '${s}' not found for ${e}, falling back to 'code'`,{message:d.message}):_.warn("WORKER",`Parent mode '${s}' not found for ${e}, falling back to 'code'`,{error:String(d)}),o=this.loadMode("code")}let i;try{i=this.loadModeFile(n),_.debug("SYSTEM",`Loaded override file: ${n} for parent ${s}`)}catch(d){return d instanceof Error?_.warn("WORKER",`Override file '${n}' not found, using parent mode '${s}' only`,{message:d.message}):_.warn("WORKER",`Override file '${n}' not found, using parent mode '${s}' only`,{error:String(d)}),this.activeMode=o,o}if(!i)return _.warn("SYSTEM",`Invalid override file: ${n}, using parent mode '${s}' only`),this.activeMode=o,o;let a=this.deepMerge(o,i);return this.activeMode=a,_.debug("SYSTEM",`Loaded mode with inheritance: ${a.name} (${e} = ${s} + ${n})`,void 0,{parent:s,override:n,types:a.observation_types.map(d=>d.id),concepts:a.observation_concepts.map(d=>d.id)}),a}getActiveMode(){if(!this.activeMode)throw new Error("No mode loaded. Call loadMode() first.");return this.activeMode}getObservationTypes(){return this.getActiveMode().observation_types}getObservationConcepts(){return this.getActiveMode().observation_concepts}getTypeIcon(e){return this.getObservationTypes().find(s=>s.id===e)?.emoji||"\u{1F4DD}"}getWorkEmoji(e){return this.getObservationTypes().find(s=>s.id===e)?.work_emoji||"\u{1F4DD}"}validateType(e){return this.getObservationTypes().some(t=>t.id===e)}getTypeLabel(e){return this.getObservationTypes().find(s=>s.id===e)?.label||e}};function oe(){let r=Me.default.join((0,xe.homedir)(),".claude-mem","settings.json"),e=W.loadFromFile(r),t=A.getInstance().getActiveMode(),s=new Set(t.observation_types.map(o=>o.id)),n=new Set(t.observation_concepts.map(o=>o.id));return{totalObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_OBSERVATIONS,10),fullObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_FULL_COUNT,10),sessionCount:parseInt(e.CLAUDE_MEM_CONTEXT_SESSION_COUNT,10),showReadTokens:e.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS==="true",showWorkTokens:e.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS==="true",showSavingsAmount:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT==="true",showSavingsPercent:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT==="true",observationTypes:s,observationConcepts:n,fullObservationField:e.CLAUDE_MEM_CONTEXT_FULL_FIELD,showLastSummary:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY==="true",showLastMessage:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE==="true"}}var c={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",cyan:"\x1B[36m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",gray:"\x1B[90m",red:"\x1B[31m"},Ue=4,ie=1;function ae(r){let e=(r.title?.length||0)+(r.subtitle?.length||0)+(r.narrative?.length||0)+JSON.stringify(r.facts||[]).length;return Math.ceil(e/Ue)}function de(r){let e=r.length,t=r.reduce((i,a)=>i+ae(a),0),s=r.reduce((i,a)=>i+(a.discovery_tokens||0),0),n=s-t,o=s>0?Math.round(n/s*100):0;return{totalObservations:e,totalReadTokens:t,totalDiscoveryTokens:s,savings:n,savingsPercent:o}}function Wt(r){return A.getInstance().getWorkEmoji(r)}function k(r,e){let t=ae(r),s=r.discovery_tokens||0,n=Wt(r.type),o=s>0?`${n} ${s.toLocaleString()}`:"-";return{readTokens:t,discoveryTokens:s,discoveryDisplay:o,workEmoji:n}}function V(r){return r.showReadTokens||r.showWorkTokens||r.showSavingsAmount||r.showSavingsPercent}var we=L(require("path"),1),Y=require("fs");var ke=/[\s\S]*?<\/system-reminder>/g;function ce(r,e,t,s){let n=Array.from(t.observationTypes),o=n.map(()=>"?").join(","),i=Array.from(t.observationConcepts),a=i.map(()=>"?").join(",");return r.db.prepare(` + `).run(e.content_session_id,e.prompt_number,e.prompt_text,e.created_at,e.created_at_epoch).lastInsertRowid}}};var Me=L(require("path"),1),xe=require("os");var C=require("fs"),x=require("path"),ne=require("os"),W=class{static DEFAULTS={CLAUDE_MEM_MODEL:"claude-sonnet-4-6",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:String(37700+(process.getuid?.()??77)%100),CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_SKIP_TOOLS:"ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_CLAUDE_AUTH_METHOD:"cli",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_GEMINI_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_GEMINI_MAX_TOKENS:"100000",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_OPENROUTER_MAX_CONTEXT_MESSAGES:"20",CLAUDE_MEM_OPENROUTER_MAX_TOKENS:"100000",CLAUDE_MEM_DATA_DIR:(0,x.join)((0,ne.homedir)(),".claude-mem"),CLAUDE_MEM_LOG_LEVEL:"INFO",CLAUDE_MEM_PYTHON_VERSION:"3.13",CLAUDE_CODE_PATH:"",CLAUDE_MEM_MODE:"code",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"10",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT:"true",CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED:"false",CLAUDE_MEM_FOLDER_USE_LOCAL_MD:"false",CLAUDE_MEM_TRANSCRIPTS_ENABLED:"true",CLAUDE_MEM_TRANSCRIPTS_CONFIG_PATH:(0,x.join)((0,ne.homedir)(),".claude-mem","transcript-watch.json"),CLAUDE_MEM_MAX_CONCURRENT_AGENTS:"2",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]",CLAUDE_MEM_SEMANTIC_INJECT:"false",CLAUDE_MEM_SEMANTIC_INJECT_LIMIT:"5",CLAUDE_MEM_TIER_ROUTING_ENABLED:"true",CLAUDE_MEM_TIER_SIMPLE_MODEL:"haiku",CLAUDE_MEM_TIER_SUMMARY_MODEL:"",CLAUDE_MEM_CHROMA_ENABLED:"true",CLAUDE_MEM_CHROMA_MODE:"local",CLAUDE_MEM_CHROMA_HOST:"127.0.0.1",CLAUDE_MEM_CHROMA_PORT:"8000",CLAUDE_MEM_CHROMA_SSL:"false",CLAUDE_MEM_CHROMA_API_KEY:"",CLAUDE_MEM_CHROMA_TENANT:"default_tenant",CLAUDE_MEM_CHROMA_DATABASE:"default_database"};static getAllDefaults(){return{...this.DEFAULTS}}static get(e){return process.env[e]??this.DEFAULTS[e]}static getInt(e){let t=this.get(e);return parseInt(t,10)}static getBool(e){let t=this.get(e);return t==="true"||t===!0}static applyEnvOverrides(e){let t={...e};for(let s of Object.keys(this.DEFAULTS))process.env[s]!==void 0&&(t[s]=process.env[s]);return t}static loadFromFile(e){try{if(!(0,C.existsSync)(e)){let i=this.getAllDefaults();try{let a=(0,x.dirname)(e);(0,C.existsSync)(a)||(0,C.mkdirSync)(a,{recursive:!0}),(0,C.writeFileSync)(e,JSON.stringify(i,null,2),"utf-8"),console.log("[SETTINGS] Created settings file with defaults:",e)}catch(a){console.warn("[SETTINGS] Failed to create settings file, using in-memory defaults:",e,a instanceof Error?a.message:String(a))}return this.applyEnvOverrides(i)}let t=(0,C.readFileSync)(e,"utf-8"),s=JSON.parse(t),n=s;if(s.env&&typeof s.env=="object"){n=s.env;try{(0,C.writeFileSync)(e,JSON.stringify(n,null,2),"utf-8"),console.log("[SETTINGS] Migrated settings file from nested to flat schema:",e)}catch(i){console.warn("[SETTINGS] Failed to auto-migrate settings file:",e,i instanceof Error?i.message:String(i))}}let o={...this.DEFAULTS};for(let i of Object.keys(this.DEFAULTS))n[i]!==void 0&&(o[i]=n[i]);return this.applyEnvOverrides(o)}catch(t){return console.warn("[SETTINGS] Failed to load settings, using defaults:",e,t instanceof Error?t.message:String(t)),this.applyEnvOverrides(this.getAllDefaults())}}};var U=require("fs"),q=require("path");var A=class r{static instance=null;activeMode=null;modesDir;constructor(){let e=Re(),t=[(0,q.join)(e,"modes"),(0,q.join)(e,"..","plugin","modes")],s=t.find(n=>(0,U.existsSync)(n));this.modesDir=s||t[0]}static getInstance(){return r.instance||(r.instance=new r),r.instance}parseInheritance(e){let t=e.split("--");if(t.length===1)return{hasParent:!1,parentId:"",overrideId:""};if(t.length>2)throw new Error(`Invalid mode inheritance: ${e}. Only one level of inheritance supported (parent--override)`);return{hasParent:!0,parentId:t[0],overrideId:e}}isPlainObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}deepMerge(e,t){let s={...e};for(let n in t){let o=t[n],i=e[n];this.isPlainObject(o)&&this.isPlainObject(i)?s[n]=this.deepMerge(i,o):s[n]=o}return s}loadModeFile(e){let t=(0,q.join)(this.modesDir,`${e}.json`);if(!(0,U.existsSync)(t))throw new Error(`Mode file not found: ${t}`);let s=(0,U.readFileSync)(t,"utf-8");return JSON.parse(s)}loadMode(e){let t=this.parseInheritance(e);if(!t.hasParent)try{let d=this.loadModeFile(e);return this.activeMode=d,_.debug("SYSTEM",`Loaded mode: ${d.name} (${e})`,void 0,{types:d.observation_types.map(m=>m.id),concepts:d.observation_concepts.map(m=>m.id)}),d}catch(d){if(d instanceof Error?_.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{message:d.message}):_.warn("WORKER",`Mode file not found: ${e}, falling back to 'code'`,{error:String(d)}),e==="code")throw new Error("Critical: code.json mode file missing");return this.loadMode("code")}let{parentId:s,overrideId:n}=t,o;try{o=this.loadMode(s)}catch(d){d instanceof Error?_.warn("WORKER",`Parent mode '${s}' not found for ${e}, falling back to 'code'`,{message:d.message}):_.warn("WORKER",`Parent mode '${s}' not found for ${e}, falling back to 'code'`,{error:String(d)}),o=this.loadMode("code")}let i;try{i=this.loadModeFile(n),_.debug("SYSTEM",`Loaded override file: ${n} for parent ${s}`)}catch(d){return d instanceof Error?_.warn("WORKER",`Override file '${n}' not found, using parent mode '${s}' only`,{message:d.message}):_.warn("WORKER",`Override file '${n}' not found, using parent mode '${s}' only`,{error:String(d)}),this.activeMode=o,o}if(!i)return _.warn("SYSTEM",`Invalid override file: ${n}, using parent mode '${s}' only`),this.activeMode=o,o;let a=this.deepMerge(o,i);return this.activeMode=a,_.debug("SYSTEM",`Loaded mode with inheritance: ${a.name} (${e} = ${s} + ${n})`,void 0,{parent:s,override:n,types:a.observation_types.map(d=>d.id),concepts:a.observation_concepts.map(d=>d.id)}),a}getActiveMode(){if(!this.activeMode)throw new Error("No mode loaded. Call loadMode() first.");return this.activeMode}getObservationTypes(){return this.getActiveMode().observation_types}getObservationConcepts(){return this.getActiveMode().observation_concepts}getTypeIcon(e){return this.getObservationTypes().find(s=>s.id===e)?.emoji||"\u{1F4DD}"}getWorkEmoji(e){return this.getObservationTypes().find(s=>s.id===e)?.work_emoji||"\u{1F4DD}"}validateType(e){return this.getObservationTypes().some(t=>t.id===e)}getTypeLabel(e){return this.getObservationTypes().find(s=>s.id===e)?.label||e}};function oe(){let r=Me.default.join((0,xe.homedir)(),".claude-mem","settings.json"),e=W.loadFromFile(r),t=A.getInstance().getActiveMode(),s=new Set(t.observation_types.map(o=>o.id)),n=new Set(t.observation_concepts.map(o=>o.id));return{totalObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_OBSERVATIONS,10),fullObservationCount:parseInt(e.CLAUDE_MEM_CONTEXT_FULL_COUNT,10),sessionCount:parseInt(e.CLAUDE_MEM_CONTEXT_SESSION_COUNT,10),showReadTokens:e.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS==="true",showWorkTokens:e.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS==="true",showSavingsAmount:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT==="true",showSavingsPercent:e.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT==="true",observationTypes:s,observationConcepts:n,fullObservationField:e.CLAUDE_MEM_CONTEXT_FULL_FIELD,showLastSummary:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY==="true",showLastMessage:e.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE==="true"}}var c={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",cyan:"\x1B[36m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",gray:"\x1B[90m",red:"\x1B[31m"},Ue=4,ie=1;function ae(r){let e=(r.title?.length||0)+(r.subtitle?.length||0)+(r.narrative?.length||0)+JSON.stringify(r.facts||[]).length;return Math.ceil(e/Ue)}function de(r){let e=r.length,t=r.reduce((i,a)=>i+ae(a),0),s=r.reduce((i,a)=>i+(a.discovery_tokens||0),0),n=s-t,o=s>0?Math.round(n/s*100):0;return{totalObservations:e,totalReadTokens:t,totalDiscoveryTokens:s,savings:n,savingsPercent:o}}function Wt(r){return A.getInstance().getWorkEmoji(r)}function k(r,e){let t=ae(r),s=r.discovery_tokens||0,n=Wt(r.type),o=s>0?`${n} ${s.toLocaleString()}`:"-";return{readTokens:t,discoveryTokens:s,discoveryDisplay:o,workEmoji:n}}function V(r){return r.showReadTokens||r.showWorkTokens||r.showSavingsAmount||r.showSavingsPercent}var we=L(require("path"),1),Y=require("fs");var ke=/[\s\S]*?<\/system-reminder>/g;function ce(r,e,t,s){let n=Array.from(t.observationTypes),o=n.map(()=>"?").join(","),i=Array.from(t.observationConcepts),a=i.map(()=>"?").join(",");return r.db.prepare(` SELECT o.id, o.memory_session_id, diff --git a/plugin/ui/viewer-bundle.js b/plugin/ui/viewer-bundle.js index 3842fb64..21cca79b 100644 --- a/plugin/ui/viewer-bundle.js +++ b/plugin/ui/viewer-bundle.js @@ -1,17 +1,17 @@ -"use strict";(()=>{var Xm=Object.create;var ju=Object.defineProperty;var $m=Object.getOwnPropertyDescriptor;var Km=Object.getOwnPropertyNames;var Ym=Object.getPrototypeOf,Qm=Object.prototype.hasOwnProperty;var Ne=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Zm=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Km(t))!Qm.call(e,o)&&o!==n&&ju(e,o,{get:()=>t[o],enumerable:!(r=$m(t,o))||r.enumerable});return e};var J=(e,t,n)=>(n=e!=null?Xm(Ym(e)):{},Zm(t||!e||!e.__esModule?ju(n,"default",{value:e,enumerable:!0}):n,e));var Ju=Ne(H=>{"use strict";var Fr=Symbol.for("react.element"),Jm=Symbol.for("react.portal"),eg=Symbol.for("react.fragment"),tg=Symbol.for("react.strict_mode"),ng=Symbol.for("react.profiler"),rg=Symbol.for("react.provider"),og=Symbol.for("react.context"),lg=Symbol.for("react.forward_ref"),ig=Symbol.for("react.suspense"),sg=Symbol.for("react.memo"),ag=Symbol.for("react.lazy"),Bu=Symbol.iterator;function ug(e){return e===null||typeof e!="object"?null:(e=Bu&&e[Bu]||e["@@iterator"],typeof e=="function"?e:null)}var Vu={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Gu=Object.assign,Xu={};function Zn(e,t,n){this.props=e,this.context=t,this.refs=Xu,this.updater=n||Vu}Zn.prototype.isReactComponent={};Zn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Zn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function $u(){}$u.prototype=Zn.prototype;function zi(e,t,n){this.props=e,this.context=t,this.refs=Xu,this.updater=n||Vu}var Hi=zi.prototype=new $u;Hi.constructor=zi;Gu(Hi,Zn.prototype);Hi.isPureReactComponent=!0;var qu=Array.isArray,Ku=Object.prototype.hasOwnProperty,ji={current:null},Yu={key:!0,ref:!0,__self:!0,__source:!0};function Qu(e,t,n){var r,o={},l=null,i=null;if(t!=null)for(r in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(l=""+t.key),t)Ku.call(t,r)&&!Yu.hasOwnProperty(r)&&(o[r]=t[r]);var s=arguments.length-2;if(s===1)o.children=n;else if(1{"use strict";ec.exports=Ju()});var cc=Ne(X=>{"use strict";function Gi(e,t){var n=e.length;e.push(t);e:for(;0>>1,o=e[r];if(0>>1;rKo(s,n))aKo(u,s)?(e[r]=u,e[a]=n,r=a):(e[r]=s,e[i]=n,r=i);else if(aKo(u,n))e[r]=u,e[a]=n,r=a;else break e}}return t}function Ko(e,t){var n=e.sortIndex-t.sortIndex;return n!==0?n:e.id-t.id}typeof performance=="object"&&typeof performance.now=="function"?(tc=performance,X.unstable_now=function(){return tc.now()}):(qi=Date,nc=qi.now(),X.unstable_now=function(){return qi.now()-nc});var tc,qi,nc,Lt=[],Yt=[],mg=1,it=null,Me=3,Zo=!1,Mn=!1,zr=!1,lc=typeof setTimeout=="function"?setTimeout:null,ic=typeof clearTimeout=="function"?clearTimeout:null,rc=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function Xi(e){for(var t=mt(Yt);t!==null;){if(t.callback===null)Qo(Yt);else if(t.startTime<=e)Qo(Yt),t.sortIndex=t.expirationTime,Gi(Lt,t);else break;t=mt(Yt)}}function $i(e){if(zr=!1,Xi(e),!Mn)if(mt(Lt)!==null)Mn=!0,Yi(Ki);else{var t=mt(Yt);t!==null&&Qi($i,t.startTime-e)}}function Ki(e,t){Mn=!1,zr&&(zr=!1,ic(Hr),Hr=-1),Zo=!0;var n=Me;try{for(Xi(t),it=mt(Lt);it!==null&&(!(it.expirationTime>t)||e&&!uc());){var r=it.callback;if(typeof r=="function"){it.callback=null,Me=it.priorityLevel;var o=r(it.expirationTime<=t);t=X.unstable_now(),typeof o=="function"?it.callback=o:it===mt(Lt)&&Qo(Lt),Xi(t)}else Qo(Lt);it=mt(Lt)}if(it!==null)var l=!0;else{var i=mt(Yt);i!==null&&Qi($i,i.startTime-t),l=!1}return l}finally{it=null,Me=n,Zo=!1}}var Jo=!1,Yo=null,Hr=-1,sc=5,ac=-1;function uc(){return!(X.unstable_now()-ace||125r?(e.sortIndex=n,Gi(Yt,e),mt(Lt)===null&&e===mt(Yt)&&(zr?(ic(Hr),Hr=-1):zr=!0,Qi($i,n-r))):(e.sortIndex=o,Gi(Lt,e),Mn||Zo||(Mn=!0,Yi(Ki))),e};X.unstable_shouldYield=uc;X.unstable_wrapCallback=function(e){var t=Me;return function(){var n=Me;Me=t;try{return e.apply(this,arguments)}finally{Me=n}}}});var dc=Ne((A0,fc)=>{"use strict";fc.exports=cc()});var vp=Ne(et=>{"use strict";var gg=ee(),Ze=dc();function T(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Ss=Object.prototype.hasOwnProperty,hg=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,pc={},mc={};function vg(e){return Ss.call(mc,e)?!0:Ss.call(pc,e)?!1:hg.test(e)?mc[e]=!0:(pc[e]=!0,!1)}function yg(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Eg(e,t,n,r){if(t===null||typeof t>"u"||yg(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function Re(e,t,n,r,o,l,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=l,this.removeEmptyString=i}var Ce={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Ce[e]=new Re(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Ce[t]=new Re(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Ce[e]=new Re(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Ce[e]=new Re(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Ce[e]=new Re(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Ce[e]=new Re(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Ce[e]=new Re(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Ce[e]=new Re(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Ce[e]=new Re(e,5,!1,e.toLowerCase(),null,!1,!1)});var da=/[\-:]([a-z])/g;function pa(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(da,pa);Ce[t]=new Re(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(da,pa);Ce[t]=new Re(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(da,pa);Ce[t]=new Re(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Ce[e]=new Re(e,1,!1,e.toLowerCase(),null,!1,!1)});Ce.xlinkHref=new Re("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Ce[e]=new Re(e,1,!1,e.toLowerCase(),null,!0,!0)});function ma(e,t,n,r){var o=Ce.hasOwnProperty(t)?Ce[t]:null;(o!==null?o.type!==0:r||!(2{var Xm=Object.create;var Bu=Object.defineProperty;var Km=Object.getOwnPropertyDescriptor;var Ym=Object.getOwnPropertyNames;var Qm=Object.getPrototypeOf,Zm=Object.prototype.hasOwnProperty;var Ne=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Jm=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ym(t))!Zm.call(e,o)&&o!==n&&Bu(e,o,{get:()=>t[o],enumerable:!(r=Km(t,o))||r.enumerable});return e};var J=(e,t,n)=>(n=e!=null?Xm(Qm(e)):{},Jm(t||!e||!e.__esModule?Bu(n,"default",{value:e,enumerable:!0}):n,e));var ec=Ne(H=>{"use strict";var br=Symbol.for("react.element"),eg=Symbol.for("react.portal"),tg=Symbol.for("react.fragment"),ng=Symbol.for("react.strict_mode"),rg=Symbol.for("react.profiler"),og=Symbol.for("react.provider"),lg=Symbol.for("react.context"),ig=Symbol.for("react.forward_ref"),sg=Symbol.for("react.suspense"),ag=Symbol.for("react.memo"),ug=Symbol.for("react.lazy"),qu=Symbol.iterator;function cg(e){return e===null||typeof e!="object"?null:(e=qu&&e[qu]||e["@@iterator"],typeof e=="function"?e:null)}var Gu={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},$u=Object.assign,Xu={};function Jn(e,t,n){this.props=e,this.context=t,this.refs=Xu,this.updater=n||Gu}Jn.prototype.isReactComponent={};Jn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Jn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Ku(){}Ku.prototype=Jn.prototype;function Hi(e,t,n){this.props=e,this.context=t,this.refs=Xu,this.updater=n||Gu}var ji=Hi.prototype=new Ku;ji.constructor=Hi;$u(ji,Jn.prototype);ji.isPureReactComponent=!0;var Wu=Array.isArray,Yu=Object.prototype.hasOwnProperty,Bi={current:null},Qu={key:!0,ref:!0,__self:!0,__source:!0};function Zu(e,t,n){var r,o={},l=null,i=null;if(t!=null)for(r in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(l=""+t.key),t)Yu.call(t,r)&&!Qu.hasOwnProperty(r)&&(o[r]=t[r]);var s=arguments.length-2;if(s===1)o.children=n;else if(1{"use strict";tc.exports=ec()});var fc=Ne($=>{"use strict";function $i(e,t){var n=e.length;e.push(t);e:for(;0>>1,o=e[r];if(0>>1;rYo(s,n))aYo(u,s)?(e[r]=u,e[a]=n,r=a):(e[r]=s,e[i]=n,r=i);else if(aYo(u,n))e[r]=u,e[a]=n,r=a;else break e}}return t}function Yo(e,t){var n=e.sortIndex-t.sortIndex;return n!==0?n:e.id-t.id}typeof performance=="object"&&typeof performance.now=="function"?(nc=performance,$.unstable_now=function(){return nc.now()}):(Wi=Date,rc=Wi.now(),$.unstable_now=function(){return Wi.now()-rc});var nc,Wi,rc,Nt=[],Qt=[],gg=1,st=null,Ae=3,Jo=!1,Mn=!1,Hr=!1,ic=typeof setTimeout=="function"?setTimeout:null,sc=typeof clearTimeout=="function"?clearTimeout:null,oc=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function Xi(e){for(var t=gt(Qt);t!==null;){if(t.callback===null)Zo(Qt);else if(t.startTime<=e)Zo(Qt),t.sortIndex=t.expirationTime,$i(Nt,t);else break;t=gt(Qt)}}function Ki(e){if(Hr=!1,Xi(e),!Mn)if(gt(Nt)!==null)Mn=!0,Qi(Yi);else{var t=gt(Qt);t!==null&&Zi(Ki,t.startTime-e)}}function Yi(e,t){Mn=!1,Hr&&(Hr=!1,sc(jr),jr=-1),Jo=!0;var n=Ae;try{for(Xi(t),st=gt(Nt);st!==null&&(!(st.expirationTime>t)||e&&!cc());){var r=st.callback;if(typeof r=="function"){st.callback=null,Ae=st.priorityLevel;var o=r(st.expirationTime<=t);t=$.unstable_now(),typeof o=="function"?st.callback=o:st===gt(Nt)&&Zo(Nt),Xi(t)}else Zo(Nt);st=gt(Nt)}if(st!==null)var l=!0;else{var i=gt(Qt);i!==null&&Zi(Ki,i.startTime-t),l=!1}return l}finally{st=null,Ae=n,Jo=!1}}var el=!1,Qo=null,jr=-1,ac=5,uc=-1;function cc(){return!($.unstable_now()-uce||125r?(e.sortIndex=n,$i(Qt,e),gt(Nt)===null&&e===gt(Qt)&&(Hr?(sc(jr),jr=-1):Hr=!0,Zi(Ki,n-r))):(e.sortIndex=o,$i(Nt,e),Mn||Jo||(Mn=!0,Qi(Yi))),e};$.unstable_shouldYield=cc;$.unstable_wrapCallback=function(e){var t=Ae;return function(){var n=Ae;Ae=t;try{return e.apply(this,arguments)}finally{Ae=n}}}});var pc=Ne((x0,dc)=>{"use strict";dc.exports=fc()});var yp=Ne(et=>{"use strict";var hg=ee(),Ze=pc();function T(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),_s=Object.prototype.hasOwnProperty,vg=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,mc={},gc={};function yg(e){return _s.call(gc,e)?!0:_s.call(mc,e)?!1:vg.test(e)?gc[e]=!0:(mc[e]=!0,!1)}function Eg(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Sg(e,t,n,r){if(t===null||typeof t>"u"||Eg(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function Re(e,t,n,r,o,l,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=l,this.removeEmptyString=i}var Ce={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Ce[e]=new Re(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Ce[t]=new Re(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Ce[e]=new Re(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Ce[e]=new Re(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Ce[e]=new Re(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Ce[e]=new Re(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Ce[e]=new Re(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Ce[e]=new Re(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Ce[e]=new Re(e,5,!1,e.toLowerCase(),null,!1,!1)});var pa=/[\-:]([a-z])/g;function ma(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(pa,ma);Ce[t]=new Re(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(pa,ma);Ce[t]=new Re(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(pa,ma);Ce[t]=new Re(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Ce[e]=new Re(e,1,!1,e.toLowerCase(),null,!1,!1)});Ce.xlinkHref=new Re("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Ce[e]=new Re(e,1,!1,e.toLowerCase(),null,!0,!0)});function ga(e,t,n,r){var o=Ce.hasOwnProperty(t)?Ce[t]:null;(o!==null?o.type!==0:r||!(2s||o[i]!==l[s]){var a=` -`+o[i].replace(" at new "," at ");return e.displayName&&a.includes("")&&(a=a.replace("",e.displayName)),a}while(1<=i&&0<=s);break}}}finally{Ji=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Kr(e):""}function Sg(e){switch(e.tag){case 5:return Kr(e.type);case 16:return Kr("Lazy");case 13:return Kr("Suspense");case 19:return Kr("SuspenseList");case 0:case 2:case 15:return e=es(e.type,!1),e;case 11:return e=es(e.type.render,!1),e;case 1:return e=es(e.type,!0),e;default:return""}}function Cs(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case nr:return"Fragment";case tr:return"Portal";case _s:return"Profiler";case ga:return"StrictMode";case ws:return"Suspense";case Ts:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case wf:return(e.displayName||"Context")+".Consumer";case _f:return(e._context.displayName||"Context")+".Provider";case ha:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case va:return t=e.displayName||null,t!==null?t:Cs(e.type)||"Memo";case Zt:t=e._payload,e=e._init;try{return Cs(e(t))}catch{}}return null}function _g(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Cs(t);case 8:return t===ga?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function pn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Cf(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function wg(e){var t=Cf(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,l=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(i){r=""+i,l.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function tl(e){e._valueTracker||(e._valueTracker=wg(e))}function kf(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Cf(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Al(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function ks(e,t){var n=t.checked;return oe({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function hc(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=pn(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Lf(e,t){t=t.checked,t!=null&&ma(e,"checked",t,!1)}function Ls(e,t){Lf(e,t);var n=pn(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ns(e,t.type,n):t.hasOwnProperty("defaultValue")&&Ns(e,t.type,pn(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function vc(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Ns(e,t,n){(t!=="number"||Al(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Yr=Array.isArray;function pr(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o"+t.valueOf().toString()+"",t=nl.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function uo(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Jr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Tg=["Webkit","ms","Moz","O"];Object.keys(Jr).forEach(function(e){Tg.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Jr[t]=Jr[e]})});function xf(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Jr.hasOwnProperty(e)&&Jr[e]?(""+t).trim():t+"px"}function Of(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,o=xf(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}var Cg=oe({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function xs(e,t){if(t){if(Cg[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(T(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(T(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(T(61))}if(t.style!=null&&typeof t.style!="object")throw Error(T(62))}}function Os(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ds=null;function ya(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Ps=null,mr=null,gr=null;function Sc(e){if(e=Mo(e)){if(typeof Ps!="function")throw Error(T(280));var t=e.stateNode;t&&(t=ri(t),Ps(e.stateNode,e.type,t))}}function Df(e){mr?gr?gr.push(e):gr=[e]:mr=e}function Pf(){if(mr){var e=mr,t=gr;if(gr=mr=null,Sc(e),t)for(e=0;e>>=0,e===0?32:31-(Ug(e)/Rg|0)|0}var rl=64,ol=4194304;function Qr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Pl(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.suspendedLanes,l=e.pingedLanes,i=n&268435455;if(i!==0){var s=i&~o;s!==0?r=Qr(s):(l&=i,l!==0&&(r=Qr(l)))}else i=n&~o,i!==0?r=Qr(i):l!==0&&(r=Qr(l));if(r===0)return 0;if(t!==0&&t!==r&&(t&o)===0&&(o=r&-r,l=t&-t,o>=l||o===16&&(l&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Lo(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Et(t),e[t]=n}function Hg(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=to),Ac=" ",xc=!1;function Jf(e,t){switch(e){case"keyup":return mh.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ed(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var rr=!1;function hh(e,t){switch(e){case"compositionend":return ed(t);case"keypress":return t.which!==32?null:(xc=!0,Ac);case"textInput":return e=t.data,e===Ac&&xc?null:e;default:return null}}function vh(e,t){if(rr)return e==="compositionend"||!La&&Jf(e,t)?(e=Qf(),Sl=Ta=nn=null,rr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Pc(n)}}function od(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?od(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function ld(){for(var e=window,t=Al();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Al(e.document)}return t}function Na(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Lh(e){var t=ld(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&od(n.ownerDocument.documentElement,n)){if(r!==null&&Na(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var o=n.textContent.length,l=Math.min(r.start,o);r=r.end===void 0?l:Math.min(r.end,o),!e.extend&&l>r&&(o=r,r=l,l=o),o=Ic(n,l);var i=Ic(n,r);o&&i&&(e.rangeCount!==1||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(o.node,o.offset),e.removeAllRanges(),l>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,or=null,zs=null,ro=null,Hs=!1;function Uc(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Hs||or==null||or!==Al(r)||(r=or,"selectionStart"in r&&Na(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),ro&&ho(ro,r)||(ro=r,r=Rl(zs,"onSelect"),0sr||(e.current=Gs[sr],Gs[sr]=null,sr--)}function $(e,t){sr++,Gs[sr]=e.current,e.current=t}var mn={},De=hn(mn),We=hn(!1),Rn=mn;function Sr(e,t){var n=e.type.contextTypes;if(!n)return mn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o={},l;for(l in n)o[l]=t[l];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Ve(e){return e=e.childContextTypes,e!=null}function bl(){Y(We),Y(De)}function Wc(e,t,n){if(De.current!==mn)throw Error(T(168));$(De,t),$(We,n)}function md(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var o in r)if(!(o in t))throw Error(T(108,_g(e)||"Unknown",o));return oe({},n,r)}function zl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||mn,Rn=De.current,$(De,e),$(We,We.current),!0}function Vc(e,t,n){var r=e.stateNode;if(!r)throw Error(T(169));n?(e=md(e,t,Rn),r.__reactInternalMemoizedMergedChildContext=e,Y(We),Y(De),$(De,e)):Y(We),$(We,n)}var Ht=null,oi=!1,fs=!1;function gd(e){Ht===null?Ht=[e]:Ht.push(e)}function Rh(e){oi=!0,gd(e)}function vn(){if(!fs&&Ht!==null){fs=!0;var e=0,t=V;try{var n=Ht;for(V=1;e>=i,o-=i,jt=1<<32-Et(t)+o|n<D?(G=x,x=null):G=x.sibling;var U=v(f,x,m[D],d);if(U===null){x===null&&(x=G);break}e&&x&&U.alternate===null&&t(f,x),c=l(U,c,D),L===null?w=U:L.sibling=U,L=U,x=G}if(D===m.length)return n(f,x),te&&An(f,D),w;if(x===null){for(;DD?(G=x,x=null):G=x.sibling;var W=v(f,x,U.value,d);if(W===null){x===null&&(x=G);break}e&&x&&W.alternate===null&&t(f,x),c=l(W,c,D),L===null?w=W:L.sibling=W,L=W,x=G}if(U.done)return n(f,x),te&&An(f,D),w;if(x===null){for(;!U.done;D++,U=m.next())U=h(f,U.value,d),U!==null&&(c=l(U,c,D),L===null?w=U:L.sibling=U,L=U);return te&&An(f,D),w}for(x=r(f,x);!U.done;D++,U=m.next())U=E(x,f,D,U.value,d),U!==null&&(e&&U.alternate!==null&&x.delete(U.key===null?D:U.key),c=l(U,c,D),L===null?w=U:L.sibling=U,L=U);return e&&x.forEach(function(rt){return t(f,rt)}),te&&An(f,D),w}function A(f,c,m,d){if(typeof m=="object"&&m!==null&&m.type===nr&&m.key===null&&(m=m.props.children),typeof m=="object"&&m!==null){switch(m.$$typeof){case el:e:{for(var w=m.key,L=c;L!==null;){if(L.key===w){if(w=m.type,w===nr){if(L.tag===7){n(f,L.sibling),c=o(L,m.props.children),c.return=f,f=c;break e}}else if(L.elementType===w||typeof w=="object"&&w!==null&&w.$$typeof===Zt&&$c(w)===L.type){n(f,L.sibling),c=o(L,m.props),c.ref=Vr(f,L,m),c.return=f,f=c;break e}n(f,L);break}else t(f,L);L=L.sibling}m.type===nr?(c=Un(m.props.children,f.mode,d,m.key),c.return=f,f=c):(d=Ml(m.type,m.key,m.props,null,f.mode,d),d.ref=Vr(f,c,m),d.return=f,f=d)}return i(f);case tr:e:{for(L=m.key;c!==null;){if(c.key===L)if(c.tag===4&&c.stateNode.containerInfo===m.containerInfo&&c.stateNode.implementation===m.implementation){n(f,c.sibling),c=o(c,m.children||[]),c.return=f,f=c;break e}else{n(f,c);break}else t(f,c);c=c.sibling}c=Es(m,f.mode,d),c.return=f,f=c}return i(f);case Zt:return L=m._init,A(f,c,L(m._payload),d)}if(Yr(m))return _(f,c,m,d);if(jr(m))return k(f,c,m,d);gl(f,m)}return typeof m=="string"&&m!==""||typeof m=="number"?(m=""+m,c!==null&&c.tag===6?(n(f,c.sibling),c=o(c,m),c.return=f,f=c):(n(f,c),c=ys(m,f.mode,d),c.return=f,f=c),i(f)):n(f,c)}return A}var wr=Ed(!0),Sd=Ed(!1),Bl=hn(null),ql=null,cr=null,Oa=null;function Da(){Oa=cr=ql=null}function Pa(e){var t=Bl.current;Y(Bl),e._currentValue=t}function Ks(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function vr(e,t){ql=e,Oa=cr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(qe=!0),e.firstContext=null)}function ft(e){var t=e._currentValue;if(Oa!==e)if(e={context:e,memoizedValue:t,next:null},cr===null){if(ql===null)throw Error(T(308));cr=e,ql.dependencies={lanes:0,firstContext:e}}else cr=cr.next=e;return t}var Dn=null;function Ia(e){Dn===null?Dn=[e]:Dn.push(e)}function _d(e,t,n,r){var o=t.interleaved;return o===null?(n.next=n,Ia(t)):(n.next=o.next,o.next=n),t.interleaved=n,Gt(e,r)}function Gt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var Jt=!1;function Ua(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function wd(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function qt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function un(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(j&2)!==0){var o=r.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Gt(e,n)}return o=r.interleaved,o===null?(t.next=t,Ia(r)):(t.next=o.next,o.next=t),r.interleaved=t,Gt(e,n)}function wl(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Sa(e,n)}}function Kc(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var o=null,l=null;if(n=n.firstBaseUpdate,n!==null){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};l===null?o=l=i:l=l.next=i,n=n.next}while(n!==null);l===null?o=l=t:l=l.next=t}else o=l=t;n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:l,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Wl(e,t,n,r){var o=e.updateQueue;Jt=!1;var l=o.firstBaseUpdate,i=o.lastBaseUpdate,s=o.shared.pending;if(s!==null){o.shared.pending=null;var a=s,u=a.next;a.next=null,i===null?l=u:i.next=u,i=a;var g=e.alternate;g!==null&&(g=g.updateQueue,s=g.lastBaseUpdate,s!==i&&(s===null?g.firstBaseUpdate=u:s.next=u,g.lastBaseUpdate=a))}if(l!==null){var h=o.baseState;i=0,g=u=a=null,s=l;do{var v=s.lane,E=s.eventTime;if((r&v)===v){g!==null&&(g=g.next={eventTime:E,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var _=e,k=s;switch(v=t,E=n,k.tag){case 1:if(_=k.payload,typeof _=="function"){h=_.call(E,h,v);break e}h=_;break e;case 3:_.flags=_.flags&-65537|128;case 0:if(_=k.payload,v=typeof _=="function"?_.call(E,h,v):_,v==null)break e;h=oe({},h,v);break e;case 2:Jt=!0}}s.callback!==null&&s.lane!==0&&(e.flags|=64,v=o.effects,v===null?o.effects=[s]:v.push(s))}else E={eventTime:E,lane:v,tag:s.tag,payload:s.payload,callback:s.callback,next:null},g===null?(u=g=E,a=h):g=g.next=E,i|=v;if(s=s.next,s===null){if(s=o.shared.pending,s===null)break;v=s,s=v.next,v.next=null,o.lastBaseUpdate=v,o.shared.pending=null}}while(!0);if(g===null&&(a=h),o.baseState=a,o.firstBaseUpdate=u,o.lastBaseUpdate=g,t=o.shared.interleaved,t!==null){o=t;do i|=o.lane,o=o.next;while(o!==t)}else l===null&&(o.shared.lanes=0);zn|=i,e.lanes=i,e.memoizedState=h}}function Yc(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=ps.transition;ps.transition={};try{e(!1),t()}finally{V=n,ps.transition=r}}function zd(){return dt().memoizedState}function Hh(e,t,n){var r=fn(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Hd(e))jd(t,n);else if(n=_d(e,t,n,r),n!==null){var o=Ue();St(n,e,r,o),Bd(n,t,r)}}function jh(e,t,n){var r=fn(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Hd(e))jd(t,o);else{var l=e.alternate;if(e.lanes===0&&(l===null||l.lanes===0)&&(l=t.lastRenderedReducer,l!==null))try{var i=t.lastRenderedState,s=l(i,n);if(o.hasEagerState=!0,o.eagerState=s,_t(s,i)){var a=t.interleaved;a===null?(o.next=o,Ia(t)):(o.next=a.next,a.next=o),t.interleaved=o;return}}catch{}n=_d(e,t,o,r),n!==null&&(o=Ue(),St(n,e,r,o),Bd(n,t,r))}}function Hd(e){var t=e.alternate;return e===re||t!==null&&t===re}function jd(e,t){oo=Gl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Bd(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Sa(e,n)}}var Xl={readContext:ft,useCallback:Ae,useContext:Ae,useEffect:Ae,useImperativeHandle:Ae,useInsertionEffect:Ae,useLayoutEffect:Ae,useMemo:Ae,useReducer:Ae,useRef:Ae,useState:Ae,useDebugValue:Ae,useDeferredValue:Ae,useTransition:Ae,useMutableSource:Ae,useSyncExternalStore:Ae,useId:Ae,unstable_isNewReconciler:!1},Bh={readContext:ft,useCallback:function(e,t){return Mt().memoizedState=[e,t===void 0?null:t],e},useContext:ft,useEffect:Zc,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Cl(4194308,4,Id.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Cl(4194308,4,e,t)},useInsertionEffect:function(e,t){return Cl(4,2,e,t)},useMemo:function(e,t){var n=Mt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Mt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Hh.bind(null,re,e),[r.memoizedState,e]},useRef:function(e){var t=Mt();return e={current:e},t.memoizedState=e},useState:Qc,useDebugValue:qa,useDeferredValue:function(e){return Mt().memoizedState=e},useTransition:function(){var e=Qc(!1),t=e[0];return e=zh.bind(null,e[1]),Mt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=re,o=Mt();if(te){if(n===void 0)throw Error(T(407));n=n()}else{if(n=t(),ye===null)throw Error(T(349));(bn&30)!==0||Ld(r,t,n)}o.memoizedState=n;var l={value:n,getSnapshot:t};return o.queue=l,Zc(Md.bind(null,r,l,e),[e]),r.flags|=2048,Co(9,Nd.bind(null,r,l,n,t),void 0,null),n},useId:function(){var e=Mt(),t=ye.identifierPrefix;if(te){var n=Bt,r=jt;n=(r&~(1<<32-Et(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=wo++,0")&&(a=a.replace("",e.displayName)),a}while(1<=i&&0<=s);break}}}finally{es=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Yr(e):""}function _g(e){switch(e.tag){case 5:return Yr(e.type);case 16:return Yr("Lazy");case 13:return Yr("Suspense");case 19:return Yr("SuspenseList");case 0:case 2:case 15:return e=ts(e.type,!1),e;case 11:return e=ts(e.type.render,!1),e;case 1:return e=ts(e.type,!0),e;default:return""}}function ks(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case rr:return"Fragment";case nr:return"Portal";case ws:return"Profiler";case ha:return"StrictMode";case Ts:return"Suspense";case Cs:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Tf:return(e.displayName||"Context")+".Consumer";case wf:return(e._context.displayName||"Context")+".Provider";case va:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ya:return t=e.displayName||null,t!==null?t:ks(e.type)||"Memo";case Jt:t=e._payload,e=e._init;try{return ks(e(t))}catch{}}return null}function wg(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ks(t);case 8:return t===ha?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function mn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function kf(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Tg(e){var t=kf(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,l=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(i){r=""+i,l.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function nl(e){e._valueTracker||(e._valueTracker=Tg(e))}function Lf(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=kf(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function xl(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ls(e,t){var n=t.checked;return oe({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function vc(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=mn(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Nf(e,t){t=t.checked,t!=null&&ga(e,"checked",t,!1)}function Ns(e,t){Nf(e,t);var n=mn(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?As(e,t.type,n):t.hasOwnProperty("defaultValue")&&As(e,t.type,mn(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function yc(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function As(e,t,n){(t!=="number"||xl(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Qr=Array.isArray;function mr(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o"+t.valueOf().toString()+"",t=rl.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function co(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var eo={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Cg=["Webkit","ms","Moz","O"];Object.keys(eo).forEach(function(e){Cg.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),eo[t]=eo[e]})});function Of(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||eo.hasOwnProperty(e)&&eo[e]?(""+t).trim():t+"px"}function Df(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,o=Of(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}var kg=oe({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Os(e,t){if(t){if(kg[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(T(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(T(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(T(61))}if(t.style!=null&&typeof t.style!="object")throw Error(T(62))}}function Ds(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ps=null;function Ea(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Is=null,gr=null,hr=null;function _c(e){if(e=Mo(e)){if(typeof Is!="function")throw Error(T(280));var t=e.stateNode;t&&(t=oi(t),Is(e.stateNode,e.type,t))}}function Pf(e){gr?hr?hr.push(e):hr=[e]:gr=e}function If(){if(gr){var e=gr,t=hr;if(hr=gr=null,_c(e),t)for(e=0;e>>=0,e===0?32:31-(Rg(e)/Fg|0)|0}var ol=64,ll=4194304;function Zr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Il(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.suspendedLanes,l=e.pingedLanes,i=n&268435455;if(i!==0){var s=i&~o;s!==0?r=Zr(s):(l&=i,l!==0&&(r=Zr(l)))}else i=n&~o,i!==0?r=Zr(i):l!==0&&(r=Zr(l));if(r===0)return 0;if(t!==0&&t!==r&&(t&o)===0&&(o=r&-r,l=t&-t,o>=l||o===16&&(l&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function No(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-St(t),e[t]=n}function jg(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=no),xc=" ",Oc=!1;function ed(e,t){switch(e){case"keyup":return gh.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function td(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var or=!1;function vh(e,t){switch(e){case"compositionend":return td(t);case"keypress":return t.which!==32?null:(Oc=!0,xc);case"textInput":return e=t.data,e===xc&&Oc?null:e;default:return null}}function yh(e,t){if(or)return e==="compositionend"||!Na&&ed(e,t)?(e=Zf(),_l=Ca=rn=null,or=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Ic(n)}}function ld(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ld(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function id(){for(var e=window,t=xl();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=xl(e.document)}return t}function Aa(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Nh(e){var t=id(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&ld(n.ownerDocument.documentElement,n)){if(r!==null&&Aa(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var o=n.textContent.length,l=Math.min(r.start,o);r=r.end===void 0?l:Math.min(r.end,o),!e.extend&&l>r&&(o=r,r=l,l=o),o=Uc(n,l);var i=Uc(n,r);o&&i&&(e.rangeCount!==1||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(o.node,o.offset),e.removeAllRanges(),l>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,lr=null,Hs=null,oo=null,js=!1;function Rc(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;js||lr==null||lr!==xl(r)||(r=lr,"selectionStart"in r&&Aa(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),oo&&vo(oo,r)||(oo=r,r=Fl(Hs,"onSelect"),0ar||(e.current=$s[ar],$s[ar]=null,ar--)}function X(e,t){ar++,$s[ar]=e.current,e.current=t}var gn={},De=vn(gn),We=vn(!1),Fn=gn;function _r(e,t){var n=e.type.contextTypes;if(!n)return gn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o={},l;for(l in n)o[l]=t[l];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Ve(e){return e=e.childContextTypes,e!=null}function zl(){Y(We),Y(De)}function Vc(e,t,n){if(De.current!==gn)throw Error(T(168));X(De,t),X(We,n)}function gd(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var o in r)if(!(o in t))throw Error(T(108,wg(e)||"Unknown",o));return oe({},n,r)}function Hl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||gn,Fn=De.current,X(De,e),X(We,We.current),!0}function Gc(e,t,n){var r=e.stateNode;if(!r)throw Error(T(169));n?(e=gd(e,t,Fn),r.__reactInternalMemoizedMergedChildContext=e,Y(We),Y(De),X(De,e)):Y(We),X(We,n)}var jt=null,li=!1,ds=!1;function hd(e){jt===null?jt=[e]:jt.push(e)}function Fh(e){li=!0,hd(e)}function yn(){if(!ds&&jt!==null){ds=!0;var e=0,t=V;try{var n=jt;for(V=1;e>=i,o-=i,Bt=1<<32-St(t)+o|n<D?(G=x,x=null):G=x.sibling;var U=v(f,x,m[D],d);if(U===null){x===null&&(x=G);break}e&&x&&U.alternate===null&&t(f,x),c=l(U,c,D),L===null?w=U:L.sibling=U,L=U,x=G}if(D===m.length)return n(f,x),te&&xn(f,D),w;if(x===null){for(;DD?(G=x,x=null):G=x.sibling;var W=v(f,x,U.value,d);if(W===null){x===null&&(x=G);break}e&&x&&W.alternate===null&&t(f,x),c=l(W,c,D),L===null?w=W:L.sibling=W,L=W,x=G}if(U.done)return n(f,x),te&&xn(f,D),w;if(x===null){for(;!U.done;D++,U=m.next())U=h(f,U.value,d),U!==null&&(c=l(U,c,D),L===null?w=U:L.sibling=U,L=U);return te&&xn(f,D),w}for(x=r(f,x);!U.done;D++,U=m.next())U=E(x,f,D,U.value,d),U!==null&&(e&&U.alternate!==null&&x.delete(U.key===null?D:U.key),c=l(U,c,D),L===null?w=U:L.sibling=U,L=U);return e&&x.forEach(function(ot){return t(f,ot)}),te&&xn(f,D),w}function M(f,c,m,d){if(typeof m=="object"&&m!==null&&m.type===rr&&m.key===null&&(m=m.props.children),typeof m=="object"&&m!==null){switch(m.$$typeof){case tl:e:{for(var w=m.key,L=c;L!==null;){if(L.key===w){if(w=m.type,w===rr){if(L.tag===7){n(f,L.sibling),c=o(L,m.props.children),c.return=f,f=c;break e}}else if(L.elementType===w||typeof w=="object"&&w!==null&&w.$$typeof===Jt&&Kc(w)===L.type){n(f,L.sibling),c=o(L,m.props),c.ref=Gr(f,L,m),c.return=f,f=c;break e}n(f,L);break}else t(f,L);L=L.sibling}m.type===rr?(c=Rn(m.props.children,f.mode,d,m.key),c.return=f,f=c):(d=Ml(m.type,m.key,m.props,null,f.mode,d),d.ref=Gr(f,c,m),d.return=f,f=d)}return i(f);case nr:e:{for(L=m.key;c!==null;){if(c.key===L)if(c.tag===4&&c.stateNode.containerInfo===m.containerInfo&&c.stateNode.implementation===m.implementation){n(f,c.sibling),c=o(c,m.children||[]),c.return=f,f=c;break e}else{n(f,c);break}else t(f,c);c=c.sibling}c=Ss(m,f.mode,d),c.return=f,f=c}return i(f);case Jt:return L=m._init,M(f,c,L(m._payload),d)}if(Qr(m))return _(f,c,m,d);if(Br(m))return k(f,c,m,d);hl(f,m)}return typeof m=="string"&&m!==""||typeof m=="number"?(m=""+m,c!==null&&c.tag===6?(n(f,c.sibling),c=o(c,m),c.return=f,f=c):(n(f,c),c=Es(m,f.mode,d),c.return=f,f=c),i(f)):n(f,c)}return M}var Tr=Sd(!0),_d=Sd(!1),ql=vn(null),Wl=null,fr=null,Da=null;function Pa(){Da=fr=Wl=null}function Ia(e){var t=ql.current;Y(ql),e._currentValue=t}function Ys(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function yr(e,t){Wl=e,Da=fr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(qe=!0),e.firstContext=null)}function dt(e){var t=e._currentValue;if(Da!==e)if(e={context:e,memoizedValue:t,next:null},fr===null){if(Wl===null)throw Error(T(308));fr=e,Wl.dependencies={lanes:0,firstContext:e}}else fr=fr.next=e;return t}var Pn=null;function Ua(e){Pn===null?Pn=[e]:Pn.push(e)}function wd(e,t,n,r){var o=t.interleaved;return o===null?(n.next=n,Ua(t)):(n.next=o.next,o.next=n),t.interleaved=n,$t(e,r)}function $t(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var en=!1;function Ra(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Td(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Wt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function cn(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(j&2)!==0){var o=r.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),r.pending=t,$t(e,n)}return o=r.interleaved,o===null?(t.next=t,Ua(r)):(t.next=o.next,o.next=t),r.interleaved=t,$t(e,n)}function Tl(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,_a(e,n)}}function Yc(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var o=null,l=null;if(n=n.firstBaseUpdate,n!==null){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};l===null?o=l=i:l=l.next=i,n=n.next}while(n!==null);l===null?o=l=t:l=l.next=t}else o=l=t;n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:l,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Vl(e,t,n,r){var o=e.updateQueue;en=!1;var l=o.firstBaseUpdate,i=o.lastBaseUpdate,s=o.shared.pending;if(s!==null){o.shared.pending=null;var a=s,u=a.next;a.next=null,i===null?l=u:i.next=u,i=a;var g=e.alternate;g!==null&&(g=g.updateQueue,s=g.lastBaseUpdate,s!==i&&(s===null?g.firstBaseUpdate=u:s.next=u,g.lastBaseUpdate=a))}if(l!==null){var h=o.baseState;i=0,g=u=a=null,s=l;do{var v=s.lane,E=s.eventTime;if((r&v)===v){g!==null&&(g=g.next={eventTime:E,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var _=e,k=s;switch(v=t,E=n,k.tag){case 1:if(_=k.payload,typeof _=="function"){h=_.call(E,h,v);break e}h=_;break e;case 3:_.flags=_.flags&-65537|128;case 0:if(_=k.payload,v=typeof _=="function"?_.call(E,h,v):_,v==null)break e;h=oe({},h,v);break e;case 2:en=!0}}s.callback!==null&&s.lane!==0&&(e.flags|=64,v=o.effects,v===null?o.effects=[s]:v.push(s))}else E={eventTime:E,lane:v,tag:s.tag,payload:s.payload,callback:s.callback,next:null},g===null?(u=g=E,a=h):g=g.next=E,i|=v;if(s=s.next,s===null){if(s=o.shared.pending,s===null)break;v=s,s=v.next,v.next=null,o.lastBaseUpdate=v,o.shared.pending=null}}while(!0);if(g===null&&(a=h),o.baseState=a,o.firstBaseUpdate=u,o.lastBaseUpdate=g,t=o.shared.interleaved,t!==null){o=t;do i|=o.lane,o=o.next;while(o!==t)}else l===null&&(o.shared.lanes=0);Hn|=i,e.lanes=i,e.memoizedState=h}}function Qc(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=ms.transition;ms.transition={};try{e(!1),t()}finally{V=n,ms.transition=r}}function Hd(){return pt().memoizedState}function jh(e,t,n){var r=dn(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},jd(e))Bd(t,n);else if(n=wd(e,t,n,r),n!==null){var o=Ue();_t(n,e,r,o),qd(n,t,r)}}function Bh(e,t,n){var r=dn(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(jd(e))Bd(t,o);else{var l=e.alternate;if(e.lanes===0&&(l===null||l.lanes===0)&&(l=t.lastRenderedReducer,l!==null))try{var i=t.lastRenderedState,s=l(i,n);if(o.hasEagerState=!0,o.eagerState=s,wt(s,i)){var a=t.interleaved;a===null?(o.next=o,Ua(t)):(o.next=a.next,a.next=o),t.interleaved=o;return}}catch{}n=wd(e,t,o,r),n!==null&&(o=Ue(),_t(n,e,r,o),qd(n,t,r))}}function jd(e){var t=e.alternate;return e===re||t!==null&&t===re}function Bd(e,t){lo=$l=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function qd(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,_a(e,n)}}var Xl={readContext:dt,useCallback:Me,useContext:Me,useEffect:Me,useImperativeHandle:Me,useInsertionEffect:Me,useLayoutEffect:Me,useMemo:Me,useReducer:Me,useRef:Me,useState:Me,useDebugValue:Me,useDeferredValue:Me,useTransition:Me,useMutableSource:Me,useSyncExternalStore:Me,useId:Me,unstable_isNewReconciler:!1},qh={readContext:dt,useCallback:function(e,t){return Mt().memoizedState=[e,t===void 0?null:t],e},useContext:dt,useEffect:Jc,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,kl(4194308,4,Ud.bind(null,t,e),n)},useLayoutEffect:function(e,t){return kl(4194308,4,e,t)},useInsertionEffect:function(e,t){return kl(4,2,e,t)},useMemo:function(e,t){var n=Mt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Mt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=jh.bind(null,re,e),[r.memoizedState,e]},useRef:function(e){var t=Mt();return e={current:e},t.memoizedState=e},useState:Zc,useDebugValue:Wa,useDeferredValue:function(e){return Mt().memoizedState=e},useTransition:function(){var e=Zc(!1),t=e[0];return e=Hh.bind(null,e[1]),Mt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=re,o=Mt();if(te){if(n===void 0)throw Error(T(407));n=n()}else{if(n=t(),ye===null)throw Error(T(349));(zn&30)!==0||Nd(r,t,n)}o.memoizedState=n;var l={value:n,getSnapshot:t};return o.queue=l,Jc(Md.bind(null,r,l,e),[e]),r.flags|=2048,ko(9,Ad.bind(null,r,l,n,t),void 0,null),n},useId:function(){var e=Mt(),t=ye.identifierPrefix;if(te){var n=qt,r=Bt;n=(r&~(1<<32-St(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=To++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[At]=t,e[Eo]=r,Zd(e,t,!1,!1),t.stateNode=e;e:{switch(i=Os(n,r),n){case"dialog":K("cancel",e),K("close",e),o=r;break;case"iframe":case"object":case"embed":K("load",e),o=r;break;case"video":case"audio":for(o=0;okr&&(t.flags|=128,r=!0,Gr(l,!1),t.lanes=4194304)}else{if(!r)if(e=Vl(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Gr(l,!0),l.tail===null&&l.tailMode==="hidden"&&!i.alternate&&!te)return xe(t),null}else 2*se()-l.renderingStartTime>kr&&n!==1073741824&&(t.flags|=128,r=!0,Gr(l,!1),t.lanes=4194304);l.isBackwards?(i.sibling=t.child,t.child=i):(n=l.last,n!==null?n.sibling=i:t.child=i,l.last=i)}return l.tail!==null?(t=l.tail,l.rendering=t,l.tail=t.sibling,l.renderingStartTime=se(),t.sibling=null,n=ne.current,$(ne,r?n&1|2:n&1),t):(xe(t),null);case 22:case 23:return Ka(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(Ke&1073741824)!==0&&(xe(t),t.subtreeFlags&6&&(t.flags|=8192)):xe(t),null;case 24:return null;case 25:return null}throw Error(T(156,t.tag))}function Yh(e,t){switch(Aa(t),t.tag){case 1:return Ve(t.type)&&bl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Tr(),Y(We),Y(De),ba(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Fa(t),null;case 13:if(Y(ne),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(T(340));_r()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Y(ne),null;case 4:return Tr(),null;case 10:return Pa(t.type._context),null;case 22:case 23:return Ka(),null;case 24:return null;default:return null}}var vl=!1,Oe=!1,Qh=typeof WeakSet=="function"?WeakSet:Set,M=null;function fr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){ie(e,t,r)}else n.current=null}function oa(e,t,n){try{n()}catch(r){ie(e,t,r)}}var cf=!1;function Zh(e,t){if(js=Il,e=ld(),Na(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var o=r.anchorOffset,l=r.focusNode;r=r.focusOffset;try{n.nodeType,l.nodeType}catch{n=null;break e}var i=0,s=-1,a=-1,u=0,g=0,h=e,v=null;t:for(;;){for(var E;h!==n||o!==0&&h.nodeType!==3||(s=i+o),h!==l||r!==0&&h.nodeType!==3||(a=i+r),h.nodeType===3&&(i+=h.nodeValue.length),(E=h.firstChild)!==null;)v=h,h=E;for(;;){if(h===e)break t;if(v===n&&++u===o&&(s=i),v===l&&++g===r&&(a=i),(E=h.nextSibling)!==null)break;h=v,v=h.parentNode}h=E}n=s===-1||a===-1?null:{start:s,end:a}}else n=null}n=n||{start:0,end:0}}else n=null;for(Bs={focusedElem:e,selectionRange:n},Il=!1,M=t;M!==null;)if(t=M,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,M=e;else for(;M!==null;){t=M;try{var _=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(_!==null){var k=_.memoizedProps,A=_.memoizedState,f=t.stateNode,c=f.getSnapshotBeforeUpdate(t.elementType===t.type?k:ht(t.type,k),A);f.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var m=t.stateNode.containerInfo;m.nodeType===1?m.textContent="":m.nodeType===9&&m.documentElement&&m.removeChild(m.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(T(163))}}catch(d){ie(t,t.return,d)}if(e=t.sibling,e!==null){e.return=t.return,M=e;break}M=t.return}return _=cf,cf=!1,_}function lo(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var o=r=r.next;do{if((o.tag&e)===e){var l=o.destroy;o.destroy=void 0,l!==void 0&&oa(t,n,l)}o=o.next}while(o!==r)}}function si(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function la(e){var t=e.ref;if(t!==null){var n=e.stateNode;e.tag,e=n,typeof t=="function"?t(e):t.current=e}}function tp(e){var t=e.alternate;t!==null&&(e.alternate=null,tp(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[At],delete t[Eo],delete t[Vs],delete t[Ih],delete t[Uh])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function np(e){return e.tag===5||e.tag===3||e.tag===4}function ff(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||np(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ia(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Fl));else if(r!==4&&(e=e.child,e!==null))for(ia(e,t,n),e=e.sibling;e!==null;)ia(e,t,n),e=e.sibling}function sa(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(sa(e,t,n),e=e.sibling;e!==null;)sa(e,t,n),e=e.sibling}var we=null,vt=!1;function Qt(e,t,n){for(n=n.child;n!==null;)rp(e,t,n),n=n.sibling}function rp(e,t,n){if(xt&&typeof xt.onCommitFiberUnmount=="function")try{xt.onCommitFiberUnmount(Jl,n)}catch{}switch(n.tag){case 5:Oe||fr(n,t);case 6:var r=we,o=vt;we=null,Qt(e,t,n),we=r,vt=o,we!==null&&(vt?(e=we,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):we.removeChild(n.stateNode));break;case 18:we!==null&&(vt?(e=we,n=n.stateNode,e.nodeType===8?cs(e.parentNode,n):e.nodeType===1&&cs(e,n),mo(e)):cs(we,n.stateNode));break;case 4:r=we,o=vt,we=n.stateNode.containerInfo,vt=!0,Qt(e,t,n),we=r,vt=o;break;case 0:case 11:case 14:case 15:if(!Oe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){o=r=r.next;do{var l=o,i=l.destroy;l=l.tag,i!==void 0&&((l&2)!==0||(l&4)!==0)&&oa(n,t,i),o=o.next}while(o!==r)}Qt(e,t,n);break;case 1:if(!Oe&&(fr(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){ie(n,t,s)}Qt(e,t,n);break;case 21:Qt(e,t,n);break;case 22:n.mode&1?(Oe=(r=Oe)||n.memoizedState!==null,Qt(e,t,n),Oe=r):Qt(e,t,n);break;default:Qt(e,t,n)}}function df(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Qh),t.forEach(function(r){var o=sv.bind(null,e,r);n.has(r)||(n.add(r),r.then(o,o))})}}function gt(e,t){var n=t.deletions;if(n!==null)for(var r=0;ro&&(o=i),r&=~l}if(r=o,r=se()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*ev(r/1960))-r,10e?16:e,rn===null)var r=!1;else{if(e=rn,rn=null,Yl=0,(j&6)!==0)throw Error(T(331));var o=j;for(j|=4,M=e.current;M!==null;){var l=M,i=l.child;if((M.flags&16)!==0){var s=l.deletions;if(s!==null){for(var a=0;ase()-Xa?In(e,0):Ga|=n),Ge(e,t)}function fp(e,t){t===0&&((e.mode&1)===0?t=1:(t=ol,ol<<=1,(ol&130023424)===0&&(ol=4194304)));var n=Ue();e=Gt(e,t),e!==null&&(Lo(e,t,n),Ge(e,n))}function iv(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),fp(e,n)}function sv(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;o!==null&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(T(314))}r!==null&&r.delete(t),fp(e,n)}var dp;dp=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||We.current)qe=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return qe=!1,$h(e,t,n);qe=(e.flags&131072)!==0}else qe=!1,te&&(t.flags&1048576)!==0&&hd(t,jl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;kl(e,t),e=t.pendingProps;var o=Sr(t,De.current);vr(t,n),o=Ha(null,t,r,e,o,n);var l=ja();return t.flags|=1,typeof o=="object"&&o!==null&&typeof o.render=="function"&&o.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Ve(r)?(l=!0,zl(t)):l=!1,t.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,Ua(t),o.updater=ii,t.stateNode=o,o._reactInternals=t,Qs(t,r,e,n),t=ea(null,t,r,!0,l,n)):(t.tag=0,te&&l&&Ma(t),Ie(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(kl(e,t),e=t.pendingProps,o=r._init,r=o(r._payload),t.type=r,o=t.tag=uv(r),e=ht(r,e),o){case 0:t=Js(null,t,r,e,n);break e;case 1:t=sf(null,t,r,e,n);break e;case 11:t=of(null,t,r,e,n);break e;case 14:t=lf(null,t,r,ht(r.type,e),n);break e}throw Error(T(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:ht(r,o),Js(e,t,r,o,n);case 1:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:ht(r,o),sf(e,t,r,o,n);case 3:e:{if(Kd(t),e===null)throw Error(T(387));r=t.pendingProps,l=t.memoizedState,o=l.element,wd(e,t),Wl(t,r,null,n);var i=t.memoizedState;if(r=i.element,l.isDehydrated)if(l={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=l,t.memoizedState=l,t.flags&256){o=Cr(Error(T(423)),t),t=af(e,t,r,n,o);break e}else if(r!==o){o=Cr(Error(T(424)),t),t=af(e,t,r,n,o);break e}else for(Ye=an(t.stateNode.containerInfo.firstChild),Qe=t,te=!0,yt=null,n=Sd(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(_r(),r===o){t=Xt(e,t,n);break e}Ie(e,t,r,n)}t=t.child}return t;case 5:return Td(t),e===null&&$s(t),r=t.type,o=t.pendingProps,l=e!==null?e.memoizedProps:null,i=o.children,qs(r,o)?i=null:l!==null&&qs(r,l)&&(t.flags|=32),$d(e,t),Ie(e,t,i,n),t.child;case 6:return e===null&&$s(t),null;case 13:return Yd(e,t,n);case 4:return Ra(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=wr(t,null,r,n):Ie(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:ht(r,o),of(e,t,r,o,n);case 7:return Ie(e,t,t.pendingProps,n),t.child;case 8:return Ie(e,t,t.pendingProps.children,n),t.child;case 12:return Ie(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,l=t.memoizedProps,i=o.value,$(Bl,r._currentValue),r._currentValue=i,l!==null)if(_t(l.value,i)){if(l.children===o.children&&!We.current){t=Xt(e,t,n);break e}}else for(l=t.child,l!==null&&(l.return=t);l!==null;){var s=l.dependencies;if(s!==null){i=l.child;for(var a=s.firstContext;a!==null;){if(a.context===r){if(l.tag===1){a=qt(-1,n&-n),a.tag=2;var u=l.updateQueue;if(u!==null){u=u.shared;var g=u.pending;g===null?a.next=a:(a.next=g.next,g.next=a),u.pending=a}}l.lanes|=n,a=l.alternate,a!==null&&(a.lanes|=n),Ks(l.return,n,t),s.lanes|=n;break}a=a.next}}else if(l.tag===10)i=l.type===t.type?null:l.child;else if(l.tag===18){if(i=l.return,i===null)throw Error(T(341));i.lanes|=n,s=i.alternate,s!==null&&(s.lanes|=n),Ks(i,n,t),i=l.sibling}else i=l.child;if(i!==null)i.return=l;else for(i=l;i!==null;){if(i===t){i=null;break}if(l=i.sibling,l!==null){l.return=i.return,i=l;break}i=i.return}l=i}Ie(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,vr(t,n),o=ft(o),r=r(o),t.flags|=1,Ie(e,t,r,n),t.child;case 14:return r=t.type,o=ht(r,t.pendingProps),o=ht(r.type,o),lf(e,t,r,o,n);case 15:return Gd(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:ht(r,o),kl(e,t),t.tag=1,Ve(r)?(e=!0,zl(t)):e=!1,vr(t,n),qd(t,r,o),Qs(t,r,o,n),ea(null,t,r,!0,e,n);case 19:return Qd(e,t,n);case 22:return Xd(e,t,n)}throw Error(T(156,t.tag))};function pp(e,t){return Hf(e,t)}function av(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ut(e,t,n,r){return new av(e,t,n,r)}function Qa(e){return e=e.prototype,!(!e||!e.isReactComponent)}function uv(e){if(typeof e=="function")return Qa(e)?1:0;if(e!=null){if(e=e.$$typeof,e===ha)return 11;if(e===va)return 14}return 2}function dn(e,t){var n=e.alternate;return n===null?(n=ut(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Ml(e,t,n,r,o,l){var i=2;if(r=e,typeof e=="function")Qa(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case nr:return Un(n.children,o,l,t);case ga:i=8,o|=8;break;case _s:return e=ut(12,n,t,o|2),e.elementType=_s,e.lanes=l,e;case ws:return e=ut(13,n,t,o),e.elementType=ws,e.lanes=l,e;case Ts:return e=ut(19,n,t,o),e.elementType=Ts,e.lanes=l,e;case Tf:return ui(n,o,l,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case _f:i=10;break e;case wf:i=9;break e;case ha:i=11;break e;case va:i=14;break e;case Zt:i=16,r=null;break e}throw Error(T(130,e==null?e:typeof e,""))}return t=ut(i,n,t,o),t.elementType=e,t.type=r,t.lanes=l,t}function Un(e,t,n,r){return e=ut(7,e,r,t),e.lanes=n,e}function ui(e,t,n,r){return e=ut(22,e,r,t),e.elementType=Tf,e.lanes=n,e.stateNode={isHidden:!1},e}function ys(e,t,n){return e=ut(6,e,null,t),e.lanes=n,e}function Es(e,t,n){return t=ut(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function cv(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=ns(0),this.expirationTimes=ns(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ns(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Za(e,t,n,r,o,l,i,s,a){return e=new cv(e,t,n,s,a),t===1?(t=1,l===!0&&(t|=8)):t=0,l=ut(3,null,null,t),e.current=l,l.stateNode=e,l.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ua(l),e}function fv(e,t,n){var r=3{"use strict";function yp(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(yp)}catch(e){console.error(e)}}yp(),Ep.exports=vp()});var wp=Ne(nu=>{"use strict";var _p=Sp();nu.createRoot=_p.createRoot,nu.hydrateRoot=_p.hydrateRoot;var D0});var ru=Ne((i1,yv)=>{yv.exports={Aacute:"\xC1",aacute:"\xE1",Abreve:"\u0102",abreve:"\u0103",ac:"\u223E",acd:"\u223F",acE:"\u223E\u0333",Acirc:"\xC2",acirc:"\xE2",acute:"\xB4",Acy:"\u0410",acy:"\u0430",AElig:"\xC6",aelig:"\xE6",af:"\u2061",Afr:"\u{1D504}",afr:"\u{1D51E}",Agrave:"\xC0",agrave:"\xE0",alefsym:"\u2135",aleph:"\u2135",Alpha:"\u0391",alpha:"\u03B1",Amacr:"\u0100",amacr:"\u0101",amalg:"\u2A3F",amp:"&",AMP:"&",andand:"\u2A55",And:"\u2A53",and:"\u2227",andd:"\u2A5C",andslope:"\u2A58",andv:"\u2A5A",ang:"\u2220",ange:"\u29A4",angle:"\u2220",angmsdaa:"\u29A8",angmsdab:"\u29A9",angmsdac:"\u29AA",angmsdad:"\u29AB",angmsdae:"\u29AC",angmsdaf:"\u29AD",angmsdag:"\u29AE",angmsdah:"\u29AF",angmsd:"\u2221",angrt:"\u221F",angrtvb:"\u22BE",angrtvbd:"\u299D",angsph:"\u2222",angst:"\xC5",angzarr:"\u237C",Aogon:"\u0104",aogon:"\u0105",Aopf:"\u{1D538}",aopf:"\u{1D552}",apacir:"\u2A6F",ap:"\u2248",apE:"\u2A70",ape:"\u224A",apid:"\u224B",apos:"'",ApplyFunction:"\u2061",approx:"\u2248",approxeq:"\u224A",Aring:"\xC5",aring:"\xE5",Ascr:"\u{1D49C}",ascr:"\u{1D4B6}",Assign:"\u2254",ast:"*",asymp:"\u2248",asympeq:"\u224D",Atilde:"\xC3",atilde:"\xE3",Auml:"\xC4",auml:"\xE4",awconint:"\u2233",awint:"\u2A11",backcong:"\u224C",backepsilon:"\u03F6",backprime:"\u2035",backsim:"\u223D",backsimeq:"\u22CD",Backslash:"\u2216",Barv:"\u2AE7",barvee:"\u22BD",barwed:"\u2305",Barwed:"\u2306",barwedge:"\u2305",bbrk:"\u23B5",bbrktbrk:"\u23B6",bcong:"\u224C",Bcy:"\u0411",bcy:"\u0431",bdquo:"\u201E",becaus:"\u2235",because:"\u2235",Because:"\u2235",bemptyv:"\u29B0",bepsi:"\u03F6",bernou:"\u212C",Bernoullis:"\u212C",Beta:"\u0392",beta:"\u03B2",beth:"\u2136",between:"\u226C",Bfr:"\u{1D505}",bfr:"\u{1D51F}",bigcap:"\u22C2",bigcirc:"\u25EF",bigcup:"\u22C3",bigodot:"\u2A00",bigoplus:"\u2A01",bigotimes:"\u2A02",bigsqcup:"\u2A06",bigstar:"\u2605",bigtriangledown:"\u25BD",bigtriangleup:"\u25B3",biguplus:"\u2A04",bigvee:"\u22C1",bigwedge:"\u22C0",bkarow:"\u290D",blacklozenge:"\u29EB",blacksquare:"\u25AA",blacktriangle:"\u25B4",blacktriangledown:"\u25BE",blacktriangleleft:"\u25C2",blacktriangleright:"\u25B8",blank:"\u2423",blk12:"\u2592",blk14:"\u2591",blk34:"\u2593",block:"\u2588",bne:"=\u20E5",bnequiv:"\u2261\u20E5",bNot:"\u2AED",bnot:"\u2310",Bopf:"\u{1D539}",bopf:"\u{1D553}",bot:"\u22A5",bottom:"\u22A5",bowtie:"\u22C8",boxbox:"\u29C9",boxdl:"\u2510",boxdL:"\u2555",boxDl:"\u2556",boxDL:"\u2557",boxdr:"\u250C",boxdR:"\u2552",boxDr:"\u2553",boxDR:"\u2554",boxh:"\u2500",boxH:"\u2550",boxhd:"\u252C",boxHd:"\u2564",boxhD:"\u2565",boxHD:"\u2566",boxhu:"\u2534",boxHu:"\u2567",boxhU:"\u2568",boxHU:"\u2569",boxminus:"\u229F",boxplus:"\u229E",boxtimes:"\u22A0",boxul:"\u2518",boxuL:"\u255B",boxUl:"\u255C",boxUL:"\u255D",boxur:"\u2514",boxuR:"\u2558",boxUr:"\u2559",boxUR:"\u255A",boxv:"\u2502",boxV:"\u2551",boxvh:"\u253C",boxvH:"\u256A",boxVh:"\u256B",boxVH:"\u256C",boxvl:"\u2524",boxvL:"\u2561",boxVl:"\u2562",boxVL:"\u2563",boxvr:"\u251C",boxvR:"\u255E",boxVr:"\u255F",boxVR:"\u2560",bprime:"\u2035",breve:"\u02D8",Breve:"\u02D8",brvbar:"\xA6",bscr:"\u{1D4B7}",Bscr:"\u212C",bsemi:"\u204F",bsim:"\u223D",bsime:"\u22CD",bsolb:"\u29C5",bsol:"\\",bsolhsub:"\u27C8",bull:"\u2022",bullet:"\u2022",bump:"\u224E",bumpE:"\u2AAE",bumpe:"\u224F",Bumpeq:"\u224E",bumpeq:"\u224F",Cacute:"\u0106",cacute:"\u0107",capand:"\u2A44",capbrcup:"\u2A49",capcap:"\u2A4B",cap:"\u2229",Cap:"\u22D2",capcup:"\u2A47",capdot:"\u2A40",CapitalDifferentialD:"\u2145",caps:"\u2229\uFE00",caret:"\u2041",caron:"\u02C7",Cayleys:"\u212D",ccaps:"\u2A4D",Ccaron:"\u010C",ccaron:"\u010D",Ccedil:"\xC7",ccedil:"\xE7",Ccirc:"\u0108",ccirc:"\u0109",Cconint:"\u2230",ccups:"\u2A4C",ccupssm:"\u2A50",Cdot:"\u010A",cdot:"\u010B",cedil:"\xB8",Cedilla:"\xB8",cemptyv:"\u29B2",cent:"\xA2",centerdot:"\xB7",CenterDot:"\xB7",cfr:"\u{1D520}",Cfr:"\u212D",CHcy:"\u0427",chcy:"\u0447",check:"\u2713",checkmark:"\u2713",Chi:"\u03A7",chi:"\u03C7",circ:"\u02C6",circeq:"\u2257",circlearrowleft:"\u21BA",circlearrowright:"\u21BB",circledast:"\u229B",circledcirc:"\u229A",circleddash:"\u229D",CircleDot:"\u2299",circledR:"\xAE",circledS:"\u24C8",CircleMinus:"\u2296",CirclePlus:"\u2295",CircleTimes:"\u2297",cir:"\u25CB",cirE:"\u29C3",cire:"\u2257",cirfnint:"\u2A10",cirmid:"\u2AEF",cirscir:"\u29C2",ClockwiseContourIntegral:"\u2232",CloseCurlyDoubleQuote:"\u201D",CloseCurlyQuote:"\u2019",clubs:"\u2663",clubsuit:"\u2663",colon:":",Colon:"\u2237",Colone:"\u2A74",colone:"\u2254",coloneq:"\u2254",comma:",",commat:"@",comp:"\u2201",compfn:"\u2218",complement:"\u2201",complexes:"\u2102",cong:"\u2245",congdot:"\u2A6D",Congruent:"\u2261",conint:"\u222E",Conint:"\u222F",ContourIntegral:"\u222E",copf:"\u{1D554}",Copf:"\u2102",coprod:"\u2210",Coproduct:"\u2210",copy:"\xA9",COPY:"\xA9",copysr:"\u2117",CounterClockwiseContourIntegral:"\u2233",crarr:"\u21B5",cross:"\u2717",Cross:"\u2A2F",Cscr:"\u{1D49E}",cscr:"\u{1D4B8}",csub:"\u2ACF",csube:"\u2AD1",csup:"\u2AD0",csupe:"\u2AD2",ctdot:"\u22EF",cudarrl:"\u2938",cudarrr:"\u2935",cuepr:"\u22DE",cuesc:"\u22DF",cularr:"\u21B6",cularrp:"\u293D",cupbrcap:"\u2A48",cupcap:"\u2A46",CupCap:"\u224D",cup:"\u222A",Cup:"\u22D3",cupcup:"\u2A4A",cupdot:"\u228D",cupor:"\u2A45",cups:"\u222A\uFE00",curarr:"\u21B7",curarrm:"\u293C",curlyeqprec:"\u22DE",curlyeqsucc:"\u22DF",curlyvee:"\u22CE",curlywedge:"\u22CF",curren:"\xA4",curvearrowleft:"\u21B6",curvearrowright:"\u21B7",cuvee:"\u22CE",cuwed:"\u22CF",cwconint:"\u2232",cwint:"\u2231",cylcty:"\u232D",dagger:"\u2020",Dagger:"\u2021",daleth:"\u2138",darr:"\u2193",Darr:"\u21A1",dArr:"\u21D3",dash:"\u2010",Dashv:"\u2AE4",dashv:"\u22A3",dbkarow:"\u290F",dblac:"\u02DD",Dcaron:"\u010E",dcaron:"\u010F",Dcy:"\u0414",dcy:"\u0434",ddagger:"\u2021",ddarr:"\u21CA",DD:"\u2145",dd:"\u2146",DDotrahd:"\u2911",ddotseq:"\u2A77",deg:"\xB0",Del:"\u2207",Delta:"\u0394",delta:"\u03B4",demptyv:"\u29B1",dfisht:"\u297F",Dfr:"\u{1D507}",dfr:"\u{1D521}",dHar:"\u2965",dharl:"\u21C3",dharr:"\u21C2",DiacriticalAcute:"\xB4",DiacriticalDot:"\u02D9",DiacriticalDoubleAcute:"\u02DD",DiacriticalGrave:"`",DiacriticalTilde:"\u02DC",diam:"\u22C4",diamond:"\u22C4",Diamond:"\u22C4",diamondsuit:"\u2666",diams:"\u2666",die:"\xA8",DifferentialD:"\u2146",digamma:"\u03DD",disin:"\u22F2",div:"\xF7",divide:"\xF7",divideontimes:"\u22C7",divonx:"\u22C7",DJcy:"\u0402",djcy:"\u0452",dlcorn:"\u231E",dlcrop:"\u230D",dollar:"$",Dopf:"\u{1D53B}",dopf:"\u{1D555}",Dot:"\xA8",dot:"\u02D9",DotDot:"\u20DC",doteq:"\u2250",doteqdot:"\u2251",DotEqual:"\u2250",dotminus:"\u2238",dotplus:"\u2214",dotsquare:"\u22A1",doublebarwedge:"\u2306",DoubleContourIntegral:"\u222F",DoubleDot:"\xA8",DoubleDownArrow:"\u21D3",DoubleLeftArrow:"\u21D0",DoubleLeftRightArrow:"\u21D4",DoubleLeftTee:"\u2AE4",DoubleLongLeftArrow:"\u27F8",DoubleLongLeftRightArrow:"\u27FA",DoubleLongRightArrow:"\u27F9",DoubleRightArrow:"\u21D2",DoubleRightTee:"\u22A8",DoubleUpArrow:"\u21D1",DoubleUpDownArrow:"\u21D5",DoubleVerticalBar:"\u2225",DownArrowBar:"\u2913",downarrow:"\u2193",DownArrow:"\u2193",Downarrow:"\u21D3",DownArrowUpArrow:"\u21F5",DownBreve:"\u0311",downdownarrows:"\u21CA",downharpoonleft:"\u21C3",downharpoonright:"\u21C2",DownLeftRightVector:"\u2950",DownLeftTeeVector:"\u295E",DownLeftVectorBar:"\u2956",DownLeftVector:"\u21BD",DownRightTeeVector:"\u295F",DownRightVectorBar:"\u2957",DownRightVector:"\u21C1",DownTeeArrow:"\u21A7",DownTee:"\u22A4",drbkarow:"\u2910",drcorn:"\u231F",drcrop:"\u230C",Dscr:"\u{1D49F}",dscr:"\u{1D4B9}",DScy:"\u0405",dscy:"\u0455",dsol:"\u29F6",Dstrok:"\u0110",dstrok:"\u0111",dtdot:"\u22F1",dtri:"\u25BF",dtrif:"\u25BE",duarr:"\u21F5",duhar:"\u296F",dwangle:"\u29A6",DZcy:"\u040F",dzcy:"\u045F",dzigrarr:"\u27FF",Eacute:"\xC9",eacute:"\xE9",easter:"\u2A6E",Ecaron:"\u011A",ecaron:"\u011B",Ecirc:"\xCA",ecirc:"\xEA",ecir:"\u2256",ecolon:"\u2255",Ecy:"\u042D",ecy:"\u044D",eDDot:"\u2A77",Edot:"\u0116",edot:"\u0117",eDot:"\u2251",ee:"\u2147",efDot:"\u2252",Efr:"\u{1D508}",efr:"\u{1D522}",eg:"\u2A9A",Egrave:"\xC8",egrave:"\xE8",egs:"\u2A96",egsdot:"\u2A98",el:"\u2A99",Element:"\u2208",elinters:"\u23E7",ell:"\u2113",els:"\u2A95",elsdot:"\u2A97",Emacr:"\u0112",emacr:"\u0113",empty:"\u2205",emptyset:"\u2205",EmptySmallSquare:"\u25FB",emptyv:"\u2205",EmptyVerySmallSquare:"\u25AB",emsp13:"\u2004",emsp14:"\u2005",emsp:"\u2003",ENG:"\u014A",eng:"\u014B",ensp:"\u2002",Eogon:"\u0118",eogon:"\u0119",Eopf:"\u{1D53C}",eopf:"\u{1D556}",epar:"\u22D5",eparsl:"\u29E3",eplus:"\u2A71",epsi:"\u03B5",Epsilon:"\u0395",epsilon:"\u03B5",epsiv:"\u03F5",eqcirc:"\u2256",eqcolon:"\u2255",eqsim:"\u2242",eqslantgtr:"\u2A96",eqslantless:"\u2A95",Equal:"\u2A75",equals:"=",EqualTilde:"\u2242",equest:"\u225F",Equilibrium:"\u21CC",equiv:"\u2261",equivDD:"\u2A78",eqvparsl:"\u29E5",erarr:"\u2971",erDot:"\u2253",escr:"\u212F",Escr:"\u2130",esdot:"\u2250",Esim:"\u2A73",esim:"\u2242",Eta:"\u0397",eta:"\u03B7",ETH:"\xD0",eth:"\xF0",Euml:"\xCB",euml:"\xEB",euro:"\u20AC",excl:"!",exist:"\u2203",Exists:"\u2203",expectation:"\u2130",exponentiale:"\u2147",ExponentialE:"\u2147",fallingdotseq:"\u2252",Fcy:"\u0424",fcy:"\u0444",female:"\u2640",ffilig:"\uFB03",fflig:"\uFB00",ffllig:"\uFB04",Ffr:"\u{1D509}",ffr:"\u{1D523}",filig:"\uFB01",FilledSmallSquare:"\u25FC",FilledVerySmallSquare:"\u25AA",fjlig:"fj",flat:"\u266D",fllig:"\uFB02",fltns:"\u25B1",fnof:"\u0192",Fopf:"\u{1D53D}",fopf:"\u{1D557}",forall:"\u2200",ForAll:"\u2200",fork:"\u22D4",forkv:"\u2AD9",Fouriertrf:"\u2131",fpartint:"\u2A0D",frac12:"\xBD",frac13:"\u2153",frac14:"\xBC",frac15:"\u2155",frac16:"\u2159",frac18:"\u215B",frac23:"\u2154",frac25:"\u2156",frac34:"\xBE",frac35:"\u2157",frac38:"\u215C",frac45:"\u2158",frac56:"\u215A",frac58:"\u215D",frac78:"\u215E",frasl:"\u2044",frown:"\u2322",fscr:"\u{1D4BB}",Fscr:"\u2131",gacute:"\u01F5",Gamma:"\u0393",gamma:"\u03B3",Gammad:"\u03DC",gammad:"\u03DD",gap:"\u2A86",Gbreve:"\u011E",gbreve:"\u011F",Gcedil:"\u0122",Gcirc:"\u011C",gcirc:"\u011D",Gcy:"\u0413",gcy:"\u0433",Gdot:"\u0120",gdot:"\u0121",ge:"\u2265",gE:"\u2267",gEl:"\u2A8C",gel:"\u22DB",geq:"\u2265",geqq:"\u2267",geqslant:"\u2A7E",gescc:"\u2AA9",ges:"\u2A7E",gesdot:"\u2A80",gesdoto:"\u2A82",gesdotol:"\u2A84",gesl:"\u22DB\uFE00",gesles:"\u2A94",Gfr:"\u{1D50A}",gfr:"\u{1D524}",gg:"\u226B",Gg:"\u22D9",ggg:"\u22D9",gimel:"\u2137",GJcy:"\u0403",gjcy:"\u0453",gla:"\u2AA5",gl:"\u2277",glE:"\u2A92",glj:"\u2AA4",gnap:"\u2A8A",gnapprox:"\u2A8A",gne:"\u2A88",gnE:"\u2269",gneq:"\u2A88",gneqq:"\u2269",gnsim:"\u22E7",Gopf:"\u{1D53E}",gopf:"\u{1D558}",grave:"`",GreaterEqual:"\u2265",GreaterEqualLess:"\u22DB",GreaterFullEqual:"\u2267",GreaterGreater:"\u2AA2",GreaterLess:"\u2277",GreaterSlantEqual:"\u2A7E",GreaterTilde:"\u2273",Gscr:"\u{1D4A2}",gscr:"\u210A",gsim:"\u2273",gsime:"\u2A8E",gsiml:"\u2A90",gtcc:"\u2AA7",gtcir:"\u2A7A",gt:">",GT:">",Gt:"\u226B",gtdot:"\u22D7",gtlPar:"\u2995",gtquest:"\u2A7C",gtrapprox:"\u2A86",gtrarr:"\u2978",gtrdot:"\u22D7",gtreqless:"\u22DB",gtreqqless:"\u2A8C",gtrless:"\u2277",gtrsim:"\u2273",gvertneqq:"\u2269\uFE00",gvnE:"\u2269\uFE00",Hacek:"\u02C7",hairsp:"\u200A",half:"\xBD",hamilt:"\u210B",HARDcy:"\u042A",hardcy:"\u044A",harrcir:"\u2948",harr:"\u2194",hArr:"\u21D4",harrw:"\u21AD",Hat:"^",hbar:"\u210F",Hcirc:"\u0124",hcirc:"\u0125",hearts:"\u2665",heartsuit:"\u2665",hellip:"\u2026",hercon:"\u22B9",hfr:"\u{1D525}",Hfr:"\u210C",HilbertSpace:"\u210B",hksearow:"\u2925",hkswarow:"\u2926",hoarr:"\u21FF",homtht:"\u223B",hookleftarrow:"\u21A9",hookrightarrow:"\u21AA",hopf:"\u{1D559}",Hopf:"\u210D",horbar:"\u2015",HorizontalLine:"\u2500",hscr:"\u{1D4BD}",Hscr:"\u210B",hslash:"\u210F",Hstrok:"\u0126",hstrok:"\u0127",HumpDownHump:"\u224E",HumpEqual:"\u224F",hybull:"\u2043",hyphen:"\u2010",Iacute:"\xCD",iacute:"\xED",ic:"\u2063",Icirc:"\xCE",icirc:"\xEE",Icy:"\u0418",icy:"\u0438",Idot:"\u0130",IEcy:"\u0415",iecy:"\u0435",iexcl:"\xA1",iff:"\u21D4",ifr:"\u{1D526}",Ifr:"\u2111",Igrave:"\xCC",igrave:"\xEC",ii:"\u2148",iiiint:"\u2A0C",iiint:"\u222D",iinfin:"\u29DC",iiota:"\u2129",IJlig:"\u0132",ijlig:"\u0133",Imacr:"\u012A",imacr:"\u012B",image:"\u2111",ImaginaryI:"\u2148",imagline:"\u2110",imagpart:"\u2111",imath:"\u0131",Im:"\u2111",imof:"\u22B7",imped:"\u01B5",Implies:"\u21D2",incare:"\u2105",in:"\u2208",infin:"\u221E",infintie:"\u29DD",inodot:"\u0131",intcal:"\u22BA",int:"\u222B",Int:"\u222C",integers:"\u2124",Integral:"\u222B",intercal:"\u22BA",Intersection:"\u22C2",intlarhk:"\u2A17",intprod:"\u2A3C",InvisibleComma:"\u2063",InvisibleTimes:"\u2062",IOcy:"\u0401",iocy:"\u0451",Iogon:"\u012E",iogon:"\u012F",Iopf:"\u{1D540}",iopf:"\u{1D55A}",Iota:"\u0399",iota:"\u03B9",iprod:"\u2A3C",iquest:"\xBF",iscr:"\u{1D4BE}",Iscr:"\u2110",isin:"\u2208",isindot:"\u22F5",isinE:"\u22F9",isins:"\u22F4",isinsv:"\u22F3",isinv:"\u2208",it:"\u2062",Itilde:"\u0128",itilde:"\u0129",Iukcy:"\u0406",iukcy:"\u0456",Iuml:"\xCF",iuml:"\xEF",Jcirc:"\u0134",jcirc:"\u0135",Jcy:"\u0419",jcy:"\u0439",Jfr:"\u{1D50D}",jfr:"\u{1D527}",jmath:"\u0237",Jopf:"\u{1D541}",jopf:"\u{1D55B}",Jscr:"\u{1D4A5}",jscr:"\u{1D4BF}",Jsercy:"\u0408",jsercy:"\u0458",Jukcy:"\u0404",jukcy:"\u0454",Kappa:"\u039A",kappa:"\u03BA",kappav:"\u03F0",Kcedil:"\u0136",kcedil:"\u0137",Kcy:"\u041A",kcy:"\u043A",Kfr:"\u{1D50E}",kfr:"\u{1D528}",kgreen:"\u0138",KHcy:"\u0425",khcy:"\u0445",KJcy:"\u040C",kjcy:"\u045C",Kopf:"\u{1D542}",kopf:"\u{1D55C}",Kscr:"\u{1D4A6}",kscr:"\u{1D4C0}",lAarr:"\u21DA",Lacute:"\u0139",lacute:"\u013A",laemptyv:"\u29B4",lagran:"\u2112",Lambda:"\u039B",lambda:"\u03BB",lang:"\u27E8",Lang:"\u27EA",langd:"\u2991",langle:"\u27E8",lap:"\u2A85",Laplacetrf:"\u2112",laquo:"\xAB",larrb:"\u21E4",larrbfs:"\u291F",larr:"\u2190",Larr:"\u219E",lArr:"\u21D0",larrfs:"\u291D",larrhk:"\u21A9",larrlp:"\u21AB",larrpl:"\u2939",larrsim:"\u2973",larrtl:"\u21A2",latail:"\u2919",lAtail:"\u291B",lat:"\u2AAB",late:"\u2AAD",lates:"\u2AAD\uFE00",lbarr:"\u290C",lBarr:"\u290E",lbbrk:"\u2772",lbrace:"{",lbrack:"[",lbrke:"\u298B",lbrksld:"\u298F",lbrkslu:"\u298D",Lcaron:"\u013D",lcaron:"\u013E",Lcedil:"\u013B",lcedil:"\u013C",lceil:"\u2308",lcub:"{",Lcy:"\u041B",lcy:"\u043B",ldca:"\u2936",ldquo:"\u201C",ldquor:"\u201E",ldrdhar:"\u2967",ldrushar:"\u294B",ldsh:"\u21B2",le:"\u2264",lE:"\u2266",LeftAngleBracket:"\u27E8",LeftArrowBar:"\u21E4",leftarrow:"\u2190",LeftArrow:"\u2190",Leftarrow:"\u21D0",LeftArrowRightArrow:"\u21C6",leftarrowtail:"\u21A2",LeftCeiling:"\u2308",LeftDoubleBracket:"\u27E6",LeftDownTeeVector:"\u2961",LeftDownVectorBar:"\u2959",LeftDownVector:"\u21C3",LeftFloor:"\u230A",leftharpoondown:"\u21BD",leftharpoonup:"\u21BC",leftleftarrows:"\u21C7",leftrightarrow:"\u2194",LeftRightArrow:"\u2194",Leftrightarrow:"\u21D4",leftrightarrows:"\u21C6",leftrightharpoons:"\u21CB",leftrightsquigarrow:"\u21AD",LeftRightVector:"\u294E",LeftTeeArrow:"\u21A4",LeftTee:"\u22A3",LeftTeeVector:"\u295A",leftthreetimes:"\u22CB",LeftTriangleBar:"\u29CF",LeftTriangle:"\u22B2",LeftTriangleEqual:"\u22B4",LeftUpDownVector:"\u2951",LeftUpTeeVector:"\u2960",LeftUpVectorBar:"\u2958",LeftUpVector:"\u21BF",LeftVectorBar:"\u2952",LeftVector:"\u21BC",lEg:"\u2A8B",leg:"\u22DA",leq:"\u2264",leqq:"\u2266",leqslant:"\u2A7D",lescc:"\u2AA8",les:"\u2A7D",lesdot:"\u2A7F",lesdoto:"\u2A81",lesdotor:"\u2A83",lesg:"\u22DA\uFE00",lesges:"\u2A93",lessapprox:"\u2A85",lessdot:"\u22D6",lesseqgtr:"\u22DA",lesseqqgtr:"\u2A8B",LessEqualGreater:"\u22DA",LessFullEqual:"\u2266",LessGreater:"\u2276",lessgtr:"\u2276",LessLess:"\u2AA1",lesssim:"\u2272",LessSlantEqual:"\u2A7D",LessTilde:"\u2272",lfisht:"\u297C",lfloor:"\u230A",Lfr:"\u{1D50F}",lfr:"\u{1D529}",lg:"\u2276",lgE:"\u2A91",lHar:"\u2962",lhard:"\u21BD",lharu:"\u21BC",lharul:"\u296A",lhblk:"\u2584",LJcy:"\u0409",ljcy:"\u0459",llarr:"\u21C7",ll:"\u226A",Ll:"\u22D8",llcorner:"\u231E",Lleftarrow:"\u21DA",llhard:"\u296B",lltri:"\u25FA",Lmidot:"\u013F",lmidot:"\u0140",lmoustache:"\u23B0",lmoust:"\u23B0",lnap:"\u2A89",lnapprox:"\u2A89",lne:"\u2A87",lnE:"\u2268",lneq:"\u2A87",lneqq:"\u2268",lnsim:"\u22E6",loang:"\u27EC",loarr:"\u21FD",lobrk:"\u27E6",longleftarrow:"\u27F5",LongLeftArrow:"\u27F5",Longleftarrow:"\u27F8",longleftrightarrow:"\u27F7",LongLeftRightArrow:"\u27F7",Longleftrightarrow:"\u27FA",longmapsto:"\u27FC",longrightarrow:"\u27F6",LongRightArrow:"\u27F6",Longrightarrow:"\u27F9",looparrowleft:"\u21AB",looparrowright:"\u21AC",lopar:"\u2985",Lopf:"\u{1D543}",lopf:"\u{1D55D}",loplus:"\u2A2D",lotimes:"\u2A34",lowast:"\u2217",lowbar:"_",LowerLeftArrow:"\u2199",LowerRightArrow:"\u2198",loz:"\u25CA",lozenge:"\u25CA",lozf:"\u29EB",lpar:"(",lparlt:"\u2993",lrarr:"\u21C6",lrcorner:"\u231F",lrhar:"\u21CB",lrhard:"\u296D",lrm:"\u200E",lrtri:"\u22BF",lsaquo:"\u2039",lscr:"\u{1D4C1}",Lscr:"\u2112",lsh:"\u21B0",Lsh:"\u21B0",lsim:"\u2272",lsime:"\u2A8D",lsimg:"\u2A8F",lsqb:"[",lsquo:"\u2018",lsquor:"\u201A",Lstrok:"\u0141",lstrok:"\u0142",ltcc:"\u2AA6",ltcir:"\u2A79",lt:"<",LT:"<",Lt:"\u226A",ltdot:"\u22D6",lthree:"\u22CB",ltimes:"\u22C9",ltlarr:"\u2976",ltquest:"\u2A7B",ltri:"\u25C3",ltrie:"\u22B4",ltrif:"\u25C2",ltrPar:"\u2996",lurdshar:"\u294A",luruhar:"\u2966",lvertneqq:"\u2268\uFE00",lvnE:"\u2268\uFE00",macr:"\xAF",male:"\u2642",malt:"\u2720",maltese:"\u2720",Map:"\u2905",map:"\u21A6",mapsto:"\u21A6",mapstodown:"\u21A7",mapstoleft:"\u21A4",mapstoup:"\u21A5",marker:"\u25AE",mcomma:"\u2A29",Mcy:"\u041C",mcy:"\u043C",mdash:"\u2014",mDDot:"\u223A",measuredangle:"\u2221",MediumSpace:"\u205F",Mellintrf:"\u2133",Mfr:"\u{1D510}",mfr:"\u{1D52A}",mho:"\u2127",micro:"\xB5",midast:"*",midcir:"\u2AF0",mid:"\u2223",middot:"\xB7",minusb:"\u229F",minus:"\u2212",minusd:"\u2238",minusdu:"\u2A2A",MinusPlus:"\u2213",mlcp:"\u2ADB",mldr:"\u2026",mnplus:"\u2213",models:"\u22A7",Mopf:"\u{1D544}",mopf:"\u{1D55E}",mp:"\u2213",mscr:"\u{1D4C2}",Mscr:"\u2133",mstpos:"\u223E",Mu:"\u039C",mu:"\u03BC",multimap:"\u22B8",mumap:"\u22B8",nabla:"\u2207",Nacute:"\u0143",nacute:"\u0144",nang:"\u2220\u20D2",nap:"\u2249",napE:"\u2A70\u0338",napid:"\u224B\u0338",napos:"\u0149",napprox:"\u2249",natural:"\u266E",naturals:"\u2115",natur:"\u266E",nbsp:"\xA0",nbump:"\u224E\u0338",nbumpe:"\u224F\u0338",ncap:"\u2A43",Ncaron:"\u0147",ncaron:"\u0148",Ncedil:"\u0145",ncedil:"\u0146",ncong:"\u2247",ncongdot:"\u2A6D\u0338",ncup:"\u2A42",Ncy:"\u041D",ncy:"\u043D",ndash:"\u2013",nearhk:"\u2924",nearr:"\u2197",neArr:"\u21D7",nearrow:"\u2197",ne:"\u2260",nedot:"\u2250\u0338",NegativeMediumSpace:"\u200B",NegativeThickSpace:"\u200B",NegativeThinSpace:"\u200B",NegativeVeryThinSpace:"\u200B",nequiv:"\u2262",nesear:"\u2928",nesim:"\u2242\u0338",NestedGreaterGreater:"\u226B",NestedLessLess:"\u226A",NewLine:` -`,nexist:"\u2204",nexists:"\u2204",Nfr:"\u{1D511}",nfr:"\u{1D52B}",ngE:"\u2267\u0338",nge:"\u2271",ngeq:"\u2271",ngeqq:"\u2267\u0338",ngeqslant:"\u2A7E\u0338",nges:"\u2A7E\u0338",nGg:"\u22D9\u0338",ngsim:"\u2275",nGt:"\u226B\u20D2",ngt:"\u226F",ngtr:"\u226F",nGtv:"\u226B\u0338",nharr:"\u21AE",nhArr:"\u21CE",nhpar:"\u2AF2",ni:"\u220B",nis:"\u22FC",nisd:"\u22FA",niv:"\u220B",NJcy:"\u040A",njcy:"\u045A",nlarr:"\u219A",nlArr:"\u21CD",nldr:"\u2025",nlE:"\u2266\u0338",nle:"\u2270",nleftarrow:"\u219A",nLeftarrow:"\u21CD",nleftrightarrow:"\u21AE",nLeftrightarrow:"\u21CE",nleq:"\u2270",nleqq:"\u2266\u0338",nleqslant:"\u2A7D\u0338",nles:"\u2A7D\u0338",nless:"\u226E",nLl:"\u22D8\u0338",nlsim:"\u2274",nLt:"\u226A\u20D2",nlt:"\u226E",nltri:"\u22EA",nltrie:"\u22EC",nLtv:"\u226A\u0338",nmid:"\u2224",NoBreak:"\u2060",NonBreakingSpace:"\xA0",nopf:"\u{1D55F}",Nopf:"\u2115",Not:"\u2AEC",not:"\xAC",NotCongruent:"\u2262",NotCupCap:"\u226D",NotDoubleVerticalBar:"\u2226",NotElement:"\u2209",NotEqual:"\u2260",NotEqualTilde:"\u2242\u0338",NotExists:"\u2204",NotGreater:"\u226F",NotGreaterEqual:"\u2271",NotGreaterFullEqual:"\u2267\u0338",NotGreaterGreater:"\u226B\u0338",NotGreaterLess:"\u2279",NotGreaterSlantEqual:"\u2A7E\u0338",NotGreaterTilde:"\u2275",NotHumpDownHump:"\u224E\u0338",NotHumpEqual:"\u224F\u0338",notin:"\u2209",notindot:"\u22F5\u0338",notinE:"\u22F9\u0338",notinva:"\u2209",notinvb:"\u22F7",notinvc:"\u22F6",NotLeftTriangleBar:"\u29CF\u0338",NotLeftTriangle:"\u22EA",NotLeftTriangleEqual:"\u22EC",NotLess:"\u226E",NotLessEqual:"\u2270",NotLessGreater:"\u2278",NotLessLess:"\u226A\u0338",NotLessSlantEqual:"\u2A7D\u0338",NotLessTilde:"\u2274",NotNestedGreaterGreater:"\u2AA2\u0338",NotNestedLessLess:"\u2AA1\u0338",notni:"\u220C",notniva:"\u220C",notnivb:"\u22FE",notnivc:"\u22FD",NotPrecedes:"\u2280",NotPrecedesEqual:"\u2AAF\u0338",NotPrecedesSlantEqual:"\u22E0",NotReverseElement:"\u220C",NotRightTriangleBar:"\u29D0\u0338",NotRightTriangle:"\u22EB",NotRightTriangleEqual:"\u22ED",NotSquareSubset:"\u228F\u0338",NotSquareSubsetEqual:"\u22E2",NotSquareSuperset:"\u2290\u0338",NotSquareSupersetEqual:"\u22E3",NotSubset:"\u2282\u20D2",NotSubsetEqual:"\u2288",NotSucceeds:"\u2281",NotSucceedsEqual:"\u2AB0\u0338",NotSucceedsSlantEqual:"\u22E1",NotSucceedsTilde:"\u227F\u0338",NotSuperset:"\u2283\u20D2",NotSupersetEqual:"\u2289",NotTilde:"\u2241",NotTildeEqual:"\u2244",NotTildeFullEqual:"\u2247",NotTildeTilde:"\u2249",NotVerticalBar:"\u2224",nparallel:"\u2226",npar:"\u2226",nparsl:"\u2AFD\u20E5",npart:"\u2202\u0338",npolint:"\u2A14",npr:"\u2280",nprcue:"\u22E0",nprec:"\u2280",npreceq:"\u2AAF\u0338",npre:"\u2AAF\u0338",nrarrc:"\u2933\u0338",nrarr:"\u219B",nrArr:"\u21CF",nrarrw:"\u219D\u0338",nrightarrow:"\u219B",nRightarrow:"\u21CF",nrtri:"\u22EB",nrtrie:"\u22ED",nsc:"\u2281",nsccue:"\u22E1",nsce:"\u2AB0\u0338",Nscr:"\u{1D4A9}",nscr:"\u{1D4C3}",nshortmid:"\u2224",nshortparallel:"\u2226",nsim:"\u2241",nsime:"\u2244",nsimeq:"\u2244",nsmid:"\u2224",nspar:"\u2226",nsqsube:"\u22E2",nsqsupe:"\u22E3",nsub:"\u2284",nsubE:"\u2AC5\u0338",nsube:"\u2288",nsubset:"\u2282\u20D2",nsubseteq:"\u2288",nsubseteqq:"\u2AC5\u0338",nsucc:"\u2281",nsucceq:"\u2AB0\u0338",nsup:"\u2285",nsupE:"\u2AC6\u0338",nsupe:"\u2289",nsupset:"\u2283\u20D2",nsupseteq:"\u2289",nsupseteqq:"\u2AC6\u0338",ntgl:"\u2279",Ntilde:"\xD1",ntilde:"\xF1",ntlg:"\u2278",ntriangleleft:"\u22EA",ntrianglelefteq:"\u22EC",ntriangleright:"\u22EB",ntrianglerighteq:"\u22ED",Nu:"\u039D",nu:"\u03BD",num:"#",numero:"\u2116",numsp:"\u2007",nvap:"\u224D\u20D2",nvdash:"\u22AC",nvDash:"\u22AD",nVdash:"\u22AE",nVDash:"\u22AF",nvge:"\u2265\u20D2",nvgt:">\u20D2",nvHarr:"\u2904",nvinfin:"\u29DE",nvlArr:"\u2902",nvle:"\u2264\u20D2",nvlt:"<\u20D2",nvltrie:"\u22B4\u20D2",nvrArr:"\u2903",nvrtrie:"\u22B5\u20D2",nvsim:"\u223C\u20D2",nwarhk:"\u2923",nwarr:"\u2196",nwArr:"\u21D6",nwarrow:"\u2196",nwnear:"\u2927",Oacute:"\xD3",oacute:"\xF3",oast:"\u229B",Ocirc:"\xD4",ocirc:"\xF4",ocir:"\u229A",Ocy:"\u041E",ocy:"\u043E",odash:"\u229D",Odblac:"\u0150",odblac:"\u0151",odiv:"\u2A38",odot:"\u2299",odsold:"\u29BC",OElig:"\u0152",oelig:"\u0153",ofcir:"\u29BF",Ofr:"\u{1D512}",ofr:"\u{1D52C}",ogon:"\u02DB",Ograve:"\xD2",ograve:"\xF2",ogt:"\u29C1",ohbar:"\u29B5",ohm:"\u03A9",oint:"\u222E",olarr:"\u21BA",olcir:"\u29BE",olcross:"\u29BB",oline:"\u203E",olt:"\u29C0",Omacr:"\u014C",omacr:"\u014D",Omega:"\u03A9",omega:"\u03C9",Omicron:"\u039F",omicron:"\u03BF",omid:"\u29B6",ominus:"\u2296",Oopf:"\u{1D546}",oopf:"\u{1D560}",opar:"\u29B7",OpenCurlyDoubleQuote:"\u201C",OpenCurlyQuote:"\u2018",operp:"\u29B9",oplus:"\u2295",orarr:"\u21BB",Or:"\u2A54",or:"\u2228",ord:"\u2A5D",order:"\u2134",orderof:"\u2134",ordf:"\xAA",ordm:"\xBA",origof:"\u22B6",oror:"\u2A56",orslope:"\u2A57",orv:"\u2A5B",oS:"\u24C8",Oscr:"\u{1D4AA}",oscr:"\u2134",Oslash:"\xD8",oslash:"\xF8",osol:"\u2298",Otilde:"\xD5",otilde:"\xF5",otimesas:"\u2A36",Otimes:"\u2A37",otimes:"\u2297",Ouml:"\xD6",ouml:"\xF6",ovbar:"\u233D",OverBar:"\u203E",OverBrace:"\u23DE",OverBracket:"\u23B4",OverParenthesis:"\u23DC",para:"\xB6",parallel:"\u2225",par:"\u2225",parsim:"\u2AF3",parsl:"\u2AFD",part:"\u2202",PartialD:"\u2202",Pcy:"\u041F",pcy:"\u043F",percnt:"%",period:".",permil:"\u2030",perp:"\u22A5",pertenk:"\u2031",Pfr:"\u{1D513}",pfr:"\u{1D52D}",Phi:"\u03A6",phi:"\u03C6",phiv:"\u03D5",phmmat:"\u2133",phone:"\u260E",Pi:"\u03A0",pi:"\u03C0",pitchfork:"\u22D4",piv:"\u03D6",planck:"\u210F",planckh:"\u210E",plankv:"\u210F",plusacir:"\u2A23",plusb:"\u229E",pluscir:"\u2A22",plus:"+",plusdo:"\u2214",plusdu:"\u2A25",pluse:"\u2A72",PlusMinus:"\xB1",plusmn:"\xB1",plussim:"\u2A26",plustwo:"\u2A27",pm:"\xB1",Poincareplane:"\u210C",pointint:"\u2A15",popf:"\u{1D561}",Popf:"\u2119",pound:"\xA3",prap:"\u2AB7",Pr:"\u2ABB",pr:"\u227A",prcue:"\u227C",precapprox:"\u2AB7",prec:"\u227A",preccurlyeq:"\u227C",Precedes:"\u227A",PrecedesEqual:"\u2AAF",PrecedesSlantEqual:"\u227C",PrecedesTilde:"\u227E",preceq:"\u2AAF",precnapprox:"\u2AB9",precneqq:"\u2AB5",precnsim:"\u22E8",pre:"\u2AAF",prE:"\u2AB3",precsim:"\u227E",prime:"\u2032",Prime:"\u2033",primes:"\u2119",prnap:"\u2AB9",prnE:"\u2AB5",prnsim:"\u22E8",prod:"\u220F",Product:"\u220F",profalar:"\u232E",profline:"\u2312",profsurf:"\u2313",prop:"\u221D",Proportional:"\u221D",Proportion:"\u2237",propto:"\u221D",prsim:"\u227E",prurel:"\u22B0",Pscr:"\u{1D4AB}",pscr:"\u{1D4C5}",Psi:"\u03A8",psi:"\u03C8",puncsp:"\u2008",Qfr:"\u{1D514}",qfr:"\u{1D52E}",qint:"\u2A0C",qopf:"\u{1D562}",Qopf:"\u211A",qprime:"\u2057",Qscr:"\u{1D4AC}",qscr:"\u{1D4C6}",quaternions:"\u210D",quatint:"\u2A16",quest:"?",questeq:"\u225F",quot:'"',QUOT:'"',rAarr:"\u21DB",race:"\u223D\u0331",Racute:"\u0154",racute:"\u0155",radic:"\u221A",raemptyv:"\u29B3",rang:"\u27E9",Rang:"\u27EB",rangd:"\u2992",range:"\u29A5",rangle:"\u27E9",raquo:"\xBB",rarrap:"\u2975",rarrb:"\u21E5",rarrbfs:"\u2920",rarrc:"\u2933",rarr:"\u2192",Rarr:"\u21A0",rArr:"\u21D2",rarrfs:"\u291E",rarrhk:"\u21AA",rarrlp:"\u21AC",rarrpl:"\u2945",rarrsim:"\u2974",Rarrtl:"\u2916",rarrtl:"\u21A3",rarrw:"\u219D",ratail:"\u291A",rAtail:"\u291C",ratio:"\u2236",rationals:"\u211A",rbarr:"\u290D",rBarr:"\u290F",RBarr:"\u2910",rbbrk:"\u2773",rbrace:"}",rbrack:"]",rbrke:"\u298C",rbrksld:"\u298E",rbrkslu:"\u2990",Rcaron:"\u0158",rcaron:"\u0159",Rcedil:"\u0156",rcedil:"\u0157",rceil:"\u2309",rcub:"}",Rcy:"\u0420",rcy:"\u0440",rdca:"\u2937",rdldhar:"\u2969",rdquo:"\u201D",rdquor:"\u201D",rdsh:"\u21B3",real:"\u211C",realine:"\u211B",realpart:"\u211C",reals:"\u211D",Re:"\u211C",rect:"\u25AD",reg:"\xAE",REG:"\xAE",ReverseElement:"\u220B",ReverseEquilibrium:"\u21CB",ReverseUpEquilibrium:"\u296F",rfisht:"\u297D",rfloor:"\u230B",rfr:"\u{1D52F}",Rfr:"\u211C",rHar:"\u2964",rhard:"\u21C1",rharu:"\u21C0",rharul:"\u296C",Rho:"\u03A1",rho:"\u03C1",rhov:"\u03F1",RightAngleBracket:"\u27E9",RightArrowBar:"\u21E5",rightarrow:"\u2192",RightArrow:"\u2192",Rightarrow:"\u21D2",RightArrowLeftArrow:"\u21C4",rightarrowtail:"\u21A3",RightCeiling:"\u2309",RightDoubleBracket:"\u27E7",RightDownTeeVector:"\u295D",RightDownVectorBar:"\u2955",RightDownVector:"\u21C2",RightFloor:"\u230B",rightharpoondown:"\u21C1",rightharpoonup:"\u21C0",rightleftarrows:"\u21C4",rightleftharpoons:"\u21CC",rightrightarrows:"\u21C9",rightsquigarrow:"\u219D",RightTeeArrow:"\u21A6",RightTee:"\u22A2",RightTeeVector:"\u295B",rightthreetimes:"\u22CC",RightTriangleBar:"\u29D0",RightTriangle:"\u22B3",RightTriangleEqual:"\u22B5",RightUpDownVector:"\u294F",RightUpTeeVector:"\u295C",RightUpVectorBar:"\u2954",RightUpVector:"\u21BE",RightVectorBar:"\u2953",RightVector:"\u21C0",ring:"\u02DA",risingdotseq:"\u2253",rlarr:"\u21C4",rlhar:"\u21CC",rlm:"\u200F",rmoustache:"\u23B1",rmoust:"\u23B1",rnmid:"\u2AEE",roang:"\u27ED",roarr:"\u21FE",robrk:"\u27E7",ropar:"\u2986",ropf:"\u{1D563}",Ropf:"\u211D",roplus:"\u2A2E",rotimes:"\u2A35",RoundImplies:"\u2970",rpar:")",rpargt:"\u2994",rppolint:"\u2A12",rrarr:"\u21C9",Rrightarrow:"\u21DB",rsaquo:"\u203A",rscr:"\u{1D4C7}",Rscr:"\u211B",rsh:"\u21B1",Rsh:"\u21B1",rsqb:"]",rsquo:"\u2019",rsquor:"\u2019",rthree:"\u22CC",rtimes:"\u22CA",rtri:"\u25B9",rtrie:"\u22B5",rtrif:"\u25B8",rtriltri:"\u29CE",RuleDelayed:"\u29F4",ruluhar:"\u2968",rx:"\u211E",Sacute:"\u015A",sacute:"\u015B",sbquo:"\u201A",scap:"\u2AB8",Scaron:"\u0160",scaron:"\u0161",Sc:"\u2ABC",sc:"\u227B",sccue:"\u227D",sce:"\u2AB0",scE:"\u2AB4",Scedil:"\u015E",scedil:"\u015F",Scirc:"\u015C",scirc:"\u015D",scnap:"\u2ABA",scnE:"\u2AB6",scnsim:"\u22E9",scpolint:"\u2A13",scsim:"\u227F",Scy:"\u0421",scy:"\u0441",sdotb:"\u22A1",sdot:"\u22C5",sdote:"\u2A66",searhk:"\u2925",searr:"\u2198",seArr:"\u21D8",searrow:"\u2198",sect:"\xA7",semi:";",seswar:"\u2929",setminus:"\u2216",setmn:"\u2216",sext:"\u2736",Sfr:"\u{1D516}",sfr:"\u{1D530}",sfrown:"\u2322",sharp:"\u266F",SHCHcy:"\u0429",shchcy:"\u0449",SHcy:"\u0428",shcy:"\u0448",ShortDownArrow:"\u2193",ShortLeftArrow:"\u2190",shortmid:"\u2223",shortparallel:"\u2225",ShortRightArrow:"\u2192",ShortUpArrow:"\u2191",shy:"\xAD",Sigma:"\u03A3",sigma:"\u03C3",sigmaf:"\u03C2",sigmav:"\u03C2",sim:"\u223C",simdot:"\u2A6A",sime:"\u2243",simeq:"\u2243",simg:"\u2A9E",simgE:"\u2AA0",siml:"\u2A9D",simlE:"\u2A9F",simne:"\u2246",simplus:"\u2A24",simrarr:"\u2972",slarr:"\u2190",SmallCircle:"\u2218",smallsetminus:"\u2216",smashp:"\u2A33",smeparsl:"\u29E4",smid:"\u2223",smile:"\u2323",smt:"\u2AAA",smte:"\u2AAC",smtes:"\u2AAC\uFE00",SOFTcy:"\u042C",softcy:"\u044C",solbar:"\u233F",solb:"\u29C4",sol:"/",Sopf:"\u{1D54A}",sopf:"\u{1D564}",spades:"\u2660",spadesuit:"\u2660",spar:"\u2225",sqcap:"\u2293",sqcaps:"\u2293\uFE00",sqcup:"\u2294",sqcups:"\u2294\uFE00",Sqrt:"\u221A",sqsub:"\u228F",sqsube:"\u2291",sqsubset:"\u228F",sqsubseteq:"\u2291",sqsup:"\u2290",sqsupe:"\u2292",sqsupset:"\u2290",sqsupseteq:"\u2292",square:"\u25A1",Square:"\u25A1",SquareIntersection:"\u2293",SquareSubset:"\u228F",SquareSubsetEqual:"\u2291",SquareSuperset:"\u2290",SquareSupersetEqual:"\u2292",SquareUnion:"\u2294",squarf:"\u25AA",squ:"\u25A1",squf:"\u25AA",srarr:"\u2192",Sscr:"\u{1D4AE}",sscr:"\u{1D4C8}",ssetmn:"\u2216",ssmile:"\u2323",sstarf:"\u22C6",Star:"\u22C6",star:"\u2606",starf:"\u2605",straightepsilon:"\u03F5",straightphi:"\u03D5",strns:"\xAF",sub:"\u2282",Sub:"\u22D0",subdot:"\u2ABD",subE:"\u2AC5",sube:"\u2286",subedot:"\u2AC3",submult:"\u2AC1",subnE:"\u2ACB",subne:"\u228A",subplus:"\u2ABF",subrarr:"\u2979",subset:"\u2282",Subset:"\u22D0",subseteq:"\u2286",subseteqq:"\u2AC5",SubsetEqual:"\u2286",subsetneq:"\u228A",subsetneqq:"\u2ACB",subsim:"\u2AC7",subsub:"\u2AD5",subsup:"\u2AD3",succapprox:"\u2AB8",succ:"\u227B",succcurlyeq:"\u227D",Succeeds:"\u227B",SucceedsEqual:"\u2AB0",SucceedsSlantEqual:"\u227D",SucceedsTilde:"\u227F",succeq:"\u2AB0",succnapprox:"\u2ABA",succneqq:"\u2AB6",succnsim:"\u22E9",succsim:"\u227F",SuchThat:"\u220B",sum:"\u2211",Sum:"\u2211",sung:"\u266A",sup1:"\xB9",sup2:"\xB2",sup3:"\xB3",sup:"\u2283",Sup:"\u22D1",supdot:"\u2ABE",supdsub:"\u2AD8",supE:"\u2AC6",supe:"\u2287",supedot:"\u2AC4",Superset:"\u2283",SupersetEqual:"\u2287",suphsol:"\u27C9",suphsub:"\u2AD7",suplarr:"\u297B",supmult:"\u2AC2",supnE:"\u2ACC",supne:"\u228B",supplus:"\u2AC0",supset:"\u2283",Supset:"\u22D1",supseteq:"\u2287",supseteqq:"\u2AC6",supsetneq:"\u228B",supsetneqq:"\u2ACC",supsim:"\u2AC8",supsub:"\u2AD4",supsup:"\u2AD6",swarhk:"\u2926",swarr:"\u2199",swArr:"\u21D9",swarrow:"\u2199",swnwar:"\u292A",szlig:"\xDF",Tab:" ",target:"\u2316",Tau:"\u03A4",tau:"\u03C4",tbrk:"\u23B4",Tcaron:"\u0164",tcaron:"\u0165",Tcedil:"\u0162",tcedil:"\u0163",Tcy:"\u0422",tcy:"\u0442",tdot:"\u20DB",telrec:"\u2315",Tfr:"\u{1D517}",tfr:"\u{1D531}",there4:"\u2234",therefore:"\u2234",Therefore:"\u2234",Theta:"\u0398",theta:"\u03B8",thetasym:"\u03D1",thetav:"\u03D1",thickapprox:"\u2248",thicksim:"\u223C",ThickSpace:"\u205F\u200A",ThinSpace:"\u2009",thinsp:"\u2009",thkap:"\u2248",thksim:"\u223C",THORN:"\xDE",thorn:"\xFE",tilde:"\u02DC",Tilde:"\u223C",TildeEqual:"\u2243",TildeFullEqual:"\u2245",TildeTilde:"\u2248",timesbar:"\u2A31",timesb:"\u22A0",times:"\xD7",timesd:"\u2A30",tint:"\u222D",toea:"\u2928",topbot:"\u2336",topcir:"\u2AF1",top:"\u22A4",Topf:"\u{1D54B}",topf:"\u{1D565}",topfork:"\u2ADA",tosa:"\u2929",tprime:"\u2034",trade:"\u2122",TRADE:"\u2122",triangle:"\u25B5",triangledown:"\u25BF",triangleleft:"\u25C3",trianglelefteq:"\u22B4",triangleq:"\u225C",triangleright:"\u25B9",trianglerighteq:"\u22B5",tridot:"\u25EC",trie:"\u225C",triminus:"\u2A3A",TripleDot:"\u20DB",triplus:"\u2A39",trisb:"\u29CD",tritime:"\u2A3B",trpezium:"\u23E2",Tscr:"\u{1D4AF}",tscr:"\u{1D4C9}",TScy:"\u0426",tscy:"\u0446",TSHcy:"\u040B",tshcy:"\u045B",Tstrok:"\u0166",tstrok:"\u0167",twixt:"\u226C",twoheadleftarrow:"\u219E",twoheadrightarrow:"\u21A0",Uacute:"\xDA",uacute:"\xFA",uarr:"\u2191",Uarr:"\u219F",uArr:"\u21D1",Uarrocir:"\u2949",Ubrcy:"\u040E",ubrcy:"\u045E",Ubreve:"\u016C",ubreve:"\u016D",Ucirc:"\xDB",ucirc:"\xFB",Ucy:"\u0423",ucy:"\u0443",udarr:"\u21C5",Udblac:"\u0170",udblac:"\u0171",udhar:"\u296E",ufisht:"\u297E",Ufr:"\u{1D518}",ufr:"\u{1D532}",Ugrave:"\xD9",ugrave:"\xF9",uHar:"\u2963",uharl:"\u21BF",uharr:"\u21BE",uhblk:"\u2580",ulcorn:"\u231C",ulcorner:"\u231C",ulcrop:"\u230F",ultri:"\u25F8",Umacr:"\u016A",umacr:"\u016B",uml:"\xA8",UnderBar:"_",UnderBrace:"\u23DF",UnderBracket:"\u23B5",UnderParenthesis:"\u23DD",Union:"\u22C3",UnionPlus:"\u228E",Uogon:"\u0172",uogon:"\u0173",Uopf:"\u{1D54C}",uopf:"\u{1D566}",UpArrowBar:"\u2912",uparrow:"\u2191",UpArrow:"\u2191",Uparrow:"\u21D1",UpArrowDownArrow:"\u21C5",updownarrow:"\u2195",UpDownArrow:"\u2195",Updownarrow:"\u21D5",UpEquilibrium:"\u296E",upharpoonleft:"\u21BF",upharpoonright:"\u21BE",uplus:"\u228E",UpperLeftArrow:"\u2196",UpperRightArrow:"\u2197",upsi:"\u03C5",Upsi:"\u03D2",upsih:"\u03D2",Upsilon:"\u03A5",upsilon:"\u03C5",UpTeeArrow:"\u21A5",UpTee:"\u22A5",upuparrows:"\u21C8",urcorn:"\u231D",urcorner:"\u231D",urcrop:"\u230E",Uring:"\u016E",uring:"\u016F",urtri:"\u25F9",Uscr:"\u{1D4B0}",uscr:"\u{1D4CA}",utdot:"\u22F0",Utilde:"\u0168",utilde:"\u0169",utri:"\u25B5",utrif:"\u25B4",uuarr:"\u21C8",Uuml:"\xDC",uuml:"\xFC",uwangle:"\u29A7",vangrt:"\u299C",varepsilon:"\u03F5",varkappa:"\u03F0",varnothing:"\u2205",varphi:"\u03D5",varpi:"\u03D6",varpropto:"\u221D",varr:"\u2195",vArr:"\u21D5",varrho:"\u03F1",varsigma:"\u03C2",varsubsetneq:"\u228A\uFE00",varsubsetneqq:"\u2ACB\uFE00",varsupsetneq:"\u228B\uFE00",varsupsetneqq:"\u2ACC\uFE00",vartheta:"\u03D1",vartriangleleft:"\u22B2",vartriangleright:"\u22B3",vBar:"\u2AE8",Vbar:"\u2AEB",vBarv:"\u2AE9",Vcy:"\u0412",vcy:"\u0432",vdash:"\u22A2",vDash:"\u22A8",Vdash:"\u22A9",VDash:"\u22AB",Vdashl:"\u2AE6",veebar:"\u22BB",vee:"\u2228",Vee:"\u22C1",veeeq:"\u225A",vellip:"\u22EE",verbar:"|",Verbar:"\u2016",vert:"|",Vert:"\u2016",VerticalBar:"\u2223",VerticalLine:"|",VerticalSeparator:"\u2758",VerticalTilde:"\u2240",VeryThinSpace:"\u200A",Vfr:"\u{1D519}",vfr:"\u{1D533}",vltri:"\u22B2",vnsub:"\u2282\u20D2",vnsup:"\u2283\u20D2",Vopf:"\u{1D54D}",vopf:"\u{1D567}",vprop:"\u221D",vrtri:"\u22B3",Vscr:"\u{1D4B1}",vscr:"\u{1D4CB}",vsubnE:"\u2ACB\uFE00",vsubne:"\u228A\uFE00",vsupnE:"\u2ACC\uFE00",vsupne:"\u228B\uFE00",Vvdash:"\u22AA",vzigzag:"\u299A",Wcirc:"\u0174",wcirc:"\u0175",wedbar:"\u2A5F",wedge:"\u2227",Wedge:"\u22C0",wedgeq:"\u2259",weierp:"\u2118",Wfr:"\u{1D51A}",wfr:"\u{1D534}",Wopf:"\u{1D54E}",wopf:"\u{1D568}",wp:"\u2118",wr:"\u2240",wreath:"\u2240",Wscr:"\u{1D4B2}",wscr:"\u{1D4CC}",xcap:"\u22C2",xcirc:"\u25EF",xcup:"\u22C3",xdtri:"\u25BD",Xfr:"\u{1D51B}",xfr:"\u{1D535}",xharr:"\u27F7",xhArr:"\u27FA",Xi:"\u039E",xi:"\u03BE",xlarr:"\u27F5",xlArr:"\u27F8",xmap:"\u27FC",xnis:"\u22FB",xodot:"\u2A00",Xopf:"\u{1D54F}",xopf:"\u{1D569}",xoplus:"\u2A01",xotime:"\u2A02",xrarr:"\u27F6",xrArr:"\u27F9",Xscr:"\u{1D4B3}",xscr:"\u{1D4CD}",xsqcup:"\u2A06",xuplus:"\u2A04",xutri:"\u25B3",xvee:"\u22C1",xwedge:"\u22C0",Yacute:"\xDD",yacute:"\xFD",YAcy:"\u042F",yacy:"\u044F",Ycirc:"\u0176",ycirc:"\u0177",Ycy:"\u042B",ycy:"\u044B",yen:"\xA5",Yfr:"\u{1D51C}",yfr:"\u{1D536}",YIcy:"\u0407",yicy:"\u0457",Yopf:"\u{1D550}",yopf:"\u{1D56A}",Yscr:"\u{1D4B4}",yscr:"\u{1D4CE}",YUcy:"\u042E",yucy:"\u044E",yuml:"\xFF",Yuml:"\u0178",Zacute:"\u0179",zacute:"\u017A",Zcaron:"\u017D",zcaron:"\u017E",Zcy:"\u0417",zcy:"\u0437",Zdot:"\u017B",zdot:"\u017C",zeetrf:"\u2128",ZeroWidthSpace:"\u200B",Zeta:"\u0396",zeta:"\u03B6",zfr:"\u{1D537}",Zfr:"\u2128",ZHcy:"\u0416",zhcy:"\u0436",zigrarr:"\u21DD",zopf:"\u{1D56B}",Zopf:"\u2124",Zscr:"\u{1D4B5}",zscr:"\u{1D4CF}",zwj:"\u200D",zwnj:"\u200C"}});var Up=Ne((s1,Ev)=>{Ev.exports={Aacute:"\xC1",aacute:"\xE1",Acirc:"\xC2",acirc:"\xE2",acute:"\xB4",AElig:"\xC6",aelig:"\xE6",Agrave:"\xC0",agrave:"\xE0",amp:"&",AMP:"&",Aring:"\xC5",aring:"\xE5",Atilde:"\xC3",atilde:"\xE3",Auml:"\xC4",auml:"\xE4",brvbar:"\xA6",Ccedil:"\xC7",ccedil:"\xE7",cedil:"\xB8",cent:"\xA2",copy:"\xA9",COPY:"\xA9",curren:"\xA4",deg:"\xB0",divide:"\xF7",Eacute:"\xC9",eacute:"\xE9",Ecirc:"\xCA",ecirc:"\xEA",Egrave:"\xC8",egrave:"\xE8",ETH:"\xD0",eth:"\xF0",Euml:"\xCB",euml:"\xEB",frac12:"\xBD",frac14:"\xBC",frac34:"\xBE",gt:">",GT:">",Iacute:"\xCD",iacute:"\xED",Icirc:"\xCE",icirc:"\xEE",iexcl:"\xA1",Igrave:"\xCC",igrave:"\xEC",iquest:"\xBF",Iuml:"\xCF",iuml:"\xEF",laquo:"\xAB",lt:"<",LT:"<",macr:"\xAF",micro:"\xB5",middot:"\xB7",nbsp:"\xA0",not:"\xAC",Ntilde:"\xD1",ntilde:"\xF1",Oacute:"\xD3",oacute:"\xF3",Ocirc:"\xD4",ocirc:"\xF4",Ograve:"\xD2",ograve:"\xF2",ordf:"\xAA",ordm:"\xBA",Oslash:"\xD8",oslash:"\xF8",Otilde:"\xD5",otilde:"\xF5",Ouml:"\xD6",ouml:"\xF6",para:"\xB6",plusmn:"\xB1",pound:"\xA3",quot:'"',QUOT:'"',raquo:"\xBB",reg:"\xAE",REG:"\xAE",sect:"\xA7",shy:"\xAD",sup1:"\xB9",sup2:"\xB2",sup3:"\xB3",szlig:"\xDF",THORN:"\xDE",thorn:"\xFE",times:"\xD7",Uacute:"\xDA",uacute:"\xFA",Ucirc:"\xDB",ucirc:"\xFB",Ugrave:"\xD9",ugrave:"\xF9",uml:"\xA8",Uuml:"\xDC",uuml:"\xFC",Yacute:"\xDD",yacute:"\xFD",yen:"\xA5",yuml:"\xFF"}});var ou=Ne((a1,Sv)=>{Sv.exports={amp:"&",apos:"'",gt:">",lt:"<",quot:'"'}});var Rp=Ne((u1,_v)=>{_v.exports={"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}});var bp=Ne(Oo=>{"use strict";var wv=Oo&&Oo.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Oo,"__esModule",{value:!0});var Fp=wv(Rp()),Tv=String.fromCodePoint||function(e){var t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|e&1023),t+=String.fromCharCode(e),t};function Cv(e){return e>=55296&&e<=57343||e>1114111?"\uFFFD":(e in Fp.default&&(e=Fp.default[e]),Tv(e))}Oo.default=Cv});var iu=Ne(It=>{"use strict";var mi=It&&It.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(It,"__esModule",{value:!0});It.decodeHTML=It.decodeHTMLStrict=It.decodeXML=void 0;var lu=mi(ru()),kv=mi(Up()),Lv=mi(ou()),zp=mi(bp()),Nv=/&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g;It.decodeXML=jp(Lv.default);It.decodeHTMLStrict=jp(lu.default);function jp(e){var t=Bp(e);return function(n){return String(n).replace(Nv,t)}}var Hp=function(e,t){return e{"use strict";var qp=Xe&&Xe.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Xe,"__esModule",{value:!0});Xe.escapeUTF8=Xe.escape=Xe.encodeNonAsciiHTML=Xe.encodeHTML=Xe.encodeXML=void 0;var Mv=qp(ou()),Wp=Gp(Mv.default),Vp=Xp(Wp);Xe.encodeXML=Yp(Wp);var Av=qp(ru()),su=Gp(Av.default),xv=Xp(su);Xe.encodeHTML=Dv(su,xv);Xe.encodeNonAsciiHTML=Yp(su);function Gp(e){return Object.keys(e).sort().reduce(function(t,n){return t[e[n]]="&"+n+";",t},{})}function Xp(e){for(var t=[],n=[],r=0,o=Object.keys(e);r1?Ov(e):e.charCodeAt(0)).toString(16).toUpperCase()+";"}function Dv(e,t){return function(n){return n.replace(t,function(r){return e[r]}).replace($p,gi)}}var Kp=new RegExp(Vp.source+"|"+$p.source,"g");function Pv(e){return e.replace(Kp,gi)}Xe.escape=Pv;function Iv(e){return e.replace(Vp,gi)}Xe.escapeUTF8=Iv;function Yp(e){return function(t){return t.replace(Kp,function(n){return e[n]||gi(n)})}}});var Zp=Ne(b=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});b.decodeXMLStrict=b.decodeHTML5Strict=b.decodeHTML4Strict=b.decodeHTML5=b.decodeHTML4=b.decodeHTMLStrict=b.decodeHTML=b.decodeXML=b.encodeHTML5=b.encodeHTML4=b.escapeUTF8=b.escape=b.encodeNonAsciiHTML=b.encodeHTML=b.encodeXML=b.encode=b.decodeStrict=b.decode=void 0;var hi=iu(),Qp=au();function Uv(e,t){return(!t||t<=0?hi.decodeXML:hi.decodeHTML)(e)}b.decode=Uv;function Rv(e,t){return(!t||t<=0?hi.decodeXML:hi.decodeHTMLStrict)(e)}b.decodeStrict=Rv;function Fv(e,t){return(!t||t<=0?Qp.encodeXML:Qp.encodeHTML)(e)}b.encode=Fv;var qn=au();Object.defineProperty(b,"encodeXML",{enumerable:!0,get:function(){return qn.encodeXML}});Object.defineProperty(b,"encodeHTML",{enumerable:!0,get:function(){return qn.encodeHTML}});Object.defineProperty(b,"encodeNonAsciiHTML",{enumerable:!0,get:function(){return qn.encodeNonAsciiHTML}});Object.defineProperty(b,"escape",{enumerable:!0,get:function(){return qn.escape}});Object.defineProperty(b,"escapeUTF8",{enumerable:!0,get:function(){return qn.escapeUTF8}});Object.defineProperty(b,"encodeHTML4",{enumerable:!0,get:function(){return qn.encodeHTML}});Object.defineProperty(b,"encodeHTML5",{enumerable:!0,get:function(){return qn.encodeHTML}});var _n=iu();Object.defineProperty(b,"decodeXML",{enumerable:!0,get:function(){return _n.decodeXML}});Object.defineProperty(b,"decodeHTML",{enumerable:!0,get:function(){return _n.decodeHTML}});Object.defineProperty(b,"decodeHTMLStrict",{enumerable:!0,get:function(){return _n.decodeHTMLStrict}});Object.defineProperty(b,"decodeHTML4",{enumerable:!0,get:function(){return _n.decodeHTML}});Object.defineProperty(b,"decodeHTML5",{enumerable:!0,get:function(){return _n.decodeHTML}});Object.defineProperty(b,"decodeHTML4Strict",{enumerable:!0,get:function(){return _n.decodeHTMLStrict}});Object.defineProperty(b,"decodeHTML5Strict",{enumerable:!0,get:function(){return _n.decodeHTMLStrict}});Object.defineProperty(b,"decodeXMLStrict",{enumerable:!0,get:function(){return _n.decodeXML}})});var um=Ne((m1,am)=>{"use strict";function bv(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Jp(e,t){for(var n=0;n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(u){throw u},f:o}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var l=!0,i=!1,s;return{s:function(){n=n.call(e)},n:function(){var u=n.next();return l=u.done,u},e:function(u){i=!0,s=u},f:function(){try{!l&&n.return!=null&&n.return()}finally{if(i)throw s}}}}function Hv(e,t){if(e){if(typeof e=="string")return em(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return em(e,t)}}function em(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0?e*40+55:0,i=t>0?t*40+55:0,s=n>0?n*40+55:0;r[o]=Wv([l,i,s])}function im(e){for(var t=e.toString(16);t.length<2;)t="0"+t;return t}function Wv(e){var t=[],n=lm(e),r;try{for(n.s();!(r=n.n()).done;){var o=r.value;t.push(im(o))}}catch(l){n.e(l)}finally{n.f()}return"#"+t.join("")}function nm(e,t,n,r){var o;return t==="text"?o=$v(n,r):t==="display"?o=Gv(e,n,r):t==="xterm256Foreground"?o=Ei(e,r.colors[n]):t==="xterm256Background"?o=Si(e,r.colors[n]):t==="rgb"&&(o=Vv(e,n)),o}function Vv(e,t){t=t.substring(2).slice(0,-1);var n=+t.substr(0,2),r=t.substring(5).split(";"),o=r.map(function(l){return("0"+Number(l).toString(16)).substr(-2)}).join("");return yi(e,(n===38?"color:#":"background-color:#")+o)}function Gv(e,t,n){t=parseInt(t,10);var r={"-1":function(){return"
"},0:function(){return e.length&&sm(e)},1:function(){return wn(e,"b")},3:function(){return wn(e,"i")},4:function(){return wn(e,"u")},8:function(){return yi(e,"display:none")},9:function(){return wn(e,"strike")},22:function(){return yi(e,"font-weight:normal;text-decoration:none;font-style:normal")},23:function(){return om(e,"i")},24:function(){return om(e,"u")},39:function(){return Ei(e,n.fg)},49:function(){return Si(e,n.bg)},53:function(){return yi(e,"text-decoration:overline")}},o;return r[t]?o=r[t]():4"}).join("")}function vi(e,t){for(var n=[],r=e;r<=t;r++)n.push(r);return n}function Xv(e){return function(t){return(e===null||t.category!==e)&&e!=="all"}}function rm(e){e=parseInt(e,10);var t=null;return e===0?t="all":e===1?t="bold":2")}function yi(e,t){return wn(e,"span",t)}function Ei(e,t){return wn(e,"span","color:"+t)}function Si(e,t){return wn(e,"span","background-color:"+t)}function om(e,t){var n;if(e.slice(-1)[0]===t&&(n=e.pop()),n)return""}function Kv(e,t,n){var r=!1,o=3;function l(){return""}function i(w,L){return n("xterm256Foreground",L),""}function s(w,L){return n("xterm256Background",L),""}function a(w){return t.newline?n("display",-1):n("text",w),""}function u(w,L){r=!0,L.trim().length===0&&(L="0"),L=L.trimRight(";").split(";");var x=lm(L),D;try{for(x.s();!(D=x.n()).done;){var G=D.value;n("display",G)}}catch(U){x.e(U)}finally{x.f()}return""}function g(w){return n("text",w),""}function h(w){return n("rgb",w),""}var v=[{pattern:/^\x08+/,sub:l},{pattern:/^\x1b\[[012]?K/,sub:l},{pattern:/^\x1b\[\(B/,sub:l},{pattern:/^\x1b\[[34]8;2;\d+;\d+;\d+m/,sub:h},{pattern:/^\x1b\[38;5;(\d+)m/,sub:i},{pattern:/^\x1b\[48;5;(\d+)m/,sub:s},{pattern:/^\n/,sub:a},{pattern:/^\r+\n/,sub:a},{pattern:/^\r/,sub:a},{pattern:/^\x1b\[((?:\d{1,3};?)+|)m/,sub:u},{pattern:/^\x1b\[\d?J/,sub:l},{pattern:/^\x1b\[\d{0,3};\d{0,3}f/,sub:l},{pattern:/^\x1b\[?[\d;]{0,3}/,sub:l},{pattern:/^(([^\x1b\x08\r\n])+)/,sub:g}];function E(w,L){L>o&&r||(r=!1,e=e.replace(w.pattern,w.sub))}var _=[],k=e,A=k.length;e:for(;A>0;){for(var f=0,c=0,m=v.length;c{let l=["system","light","dark"],s=(l.indexOf(e)+1)%l.length;t(l[s])},r=()=>{switch(e){case"light":return Ee.default.createElement("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Ee.default.createElement("circle",{cx:"12",cy:"12",r:"5"}),Ee.default.createElement("line",{x1:"12",y1:"1",x2:"12",y2:"3"}),Ee.default.createElement("line",{x1:"12",y1:"21",x2:"12",y2:"23"}),Ee.default.createElement("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"}),Ee.default.createElement("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"}),Ee.default.createElement("line",{x1:"1",y1:"12",x2:"3",y2:"12"}),Ee.default.createElement("line",{x1:"21",y1:"12",x2:"23",y2:"12"}),Ee.default.createElement("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"}),Ee.default.createElement("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"}));case"dark":return Ee.default.createElement("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Ee.default.createElement("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"}));default:return Ee.default.createElement("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Ee.default.createElement("rect",{x:"2",y:"3",width:"20",height:"14",rx:"2",ry:"2"}),Ee.default.createElement("line",{x1:"8",y1:"21",x2:"16",y2:"21"}),Ee.default.createElement("line",{x1:"12",y1:"17",x2:"12",y2:"21"}))}},o=()=>{switch(e){case"light":return"Theme: Light (click for Dark)";case"dark":return"Theme: Dark (click for System)";default:return"Theme: System (click for Light)"}};return Ee.default.createElement("button",{className:"theme-toggle-btn",onClick:n,title:o(),"aria-label":o()},r())}var Dt=J(ee(),1);var yn=J(ee(),1);function Cp(e,t){let[n,r]=(0,yn.useState)(null),[o,l]=(0,yn.useState)(!0),[i,s]=(0,yn.useState)(null),a=(0,yn.useCallback)(async()=>{try{l(!0),s(null);let u=await fetch(`https://api.github.com/repos/${e}/${t}`);if(!u.ok)throw new Error(`GitHub API error: ${u.status}`);let g=await u.json();r(g.stargazers_count)}catch(u){console.error("Failed to fetch GitHub stars:",u),s(u instanceof Error?u:new Error("Unknown error"))}finally{l(!1)}},[e,t]);return(0,yn.useEffect)(()=>{a()},[a]),{stars:n,isLoading:o,error:i}}function kp(e){return e<1e3?e.toString():e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}M`}function Lp({username:e,repo:t,className:n=""}){let{stars:r,isLoading:o,error:l}=Cp(e,t),i=`https://github.com/${e}/${t}`;return l?Dt.default.createElement("a",{href:i,target:"_blank",rel:"noopener noreferrer",title:"GitHub",className:"icon-link"},Dt.default.createElement("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor"},Dt.default.createElement("path",{d:"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"}))):Dt.default.createElement("a",{href:i,target:"_blank",rel:"noopener noreferrer",className:`github-stars-btn ${n}`,title:`Star us on GitHub${r!==null?` (${r.toLocaleString()} stars)`:""}`},Dt.default.createElement("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor",style:{marginRight:"6px"}},Dt.default.createElement("path",{d:"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"})),Dt.default.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"currentColor",style:{marginRight:"4px"}},Dt.default.createElement("path",{d:"M12 .587l3.668 7.431 8.2 1.192-5.934 5.787 1.4 8.166L12 18.896l-7.334 3.867 1.4-8.166-5.934-5.787 8.2-1.192z"})),Dt.default.createElement("span",{className:o?"stars-loading":"stars-count"},o?"...":r!==null?kp(r):"\u2014"))}var En=J(ee(),1);function Np(e){let t=(0,En.useRef)(null),n=(0,En.useRef)(null),r=(0,En.useRef)(null),o=(0,En.useRef)(0),l=(0,En.useRef)(null);(0,En.useEffect)(()=>{if(n.current||(n.current=document.createElement("canvas"),n.current.width=32,n.current.height=32),r.current||(r.current=new Image,r.current.src="claude-mem-logomark.webp"),!l.current){let h=document.querySelector('link[rel="icon"]');h&&(l.current=h.href)}let i=n.current,s=i.getContext("2d"),a=r.current;if(!s)return;let u=h=>{let v=document.querySelector('link[rel="icon"]');v||(v=document.createElement("link"),v.rel="icon",document.head.appendChild(v)),v.href=h},g=()=>{if(!a.complete){t.current=requestAnimationFrame(g);return}o.current+=2*Math.PI/90,s.clearRect(0,0,32,32),s.save(),s.translate(16,16),s.rotate(o.current),s.drawImage(a,-16,-16,32,32),s.restore(),u(i.toDataURL("image/png")),t.current=requestAnimationFrame(g)};return e?(o.current=0,g()):(t.current&&(cancelAnimationFrame(t.current),t.current=null),l.current&&u(l.current)),()=>{t.current&&(cancelAnimationFrame(t.current),t.current=null)}},[e])}function hv(e){return e==="all"?"All":e==="claude"?"Claude":e==="codex"?"Codex":e.charAt(0).toUpperCase()+e.slice(1)}function vv(e){let t=["all","claude","codex",...e];return Array.from(new Set(t.filter(Boolean)))}function Mp({isConnected:e,projects:t,sources:n,currentFilter:r,currentSource:o,onFilterChange:l,onSourceChange:i,isProcessing:s,queueDepth:a,themePreference:u,onThemeChange:g,onContextPreviewToggle:h}){Np(s);let v=vv(n);return q.default.createElement("div",{className:"header"},q.default.createElement("div",{className:"header-main"},q.default.createElement("h1",null,q.default.createElement("div",{style:{position:"relative",display:"inline-block"}},q.default.createElement("img",{src:"claude-mem-logomark.webp",alt:"",className:`logomark ${s?"spinning":""}`}),a>0&&q.default.createElement("div",{className:"queue-bubble"},a)),q.default.createElement("span",{className:"logo-text"},"claude-mem")),q.default.createElement("div",{className:"source-tabs",role:"tablist","aria-label":"Context source tabs"},v.map(E=>q.default.createElement("button",{key:E,type:"button",className:`source-tab ${o===E?"active":""}`,onClick:()=>i(E),"aria-pressed":o===E},hv(E))))),q.default.createElement("div",{className:"status"},q.default.createElement("a",{href:"https://docs.claude-mem.ai",target:"_blank",rel:"noopener noreferrer",className:"icon-link",title:"Documentation"},q.default.createElement("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},q.default.createElement("path",{d:"M4 19.5A2.5 2.5 0 0 1 6.5 17H20"}),q.default.createElement("path",{d:"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"}))),q.default.createElement("a",{href:"https://x.com/Claude_Memory",target:"_blank",rel:"noopener noreferrer",className:"icon-link",title:"Follow us on X"},q.default.createElement("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"currentColor"},q.default.createElement("path",{d:"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"}))),q.default.createElement("a",{href:"https://discord.gg/J4wttp9vDu",target:"_blank",rel:"noopener noreferrer",className:"icon-link",title:"Join our Discord community"},q.default.createElement("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"currentColor"},q.default.createElement("path",{d:"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"}))),q.default.createElement(Lp,{username:"thedotmack",repo:"claude-mem"}),q.default.createElement("select",{value:r,onChange:E=>l(E.target.value)},q.default.createElement("option",{value:""},"All Projects"),t.map(E=>q.default.createElement("option",{key:E,value:E},E))),q.default.createElement(Tp,{preference:u,onThemeChange:g}),q.default.createElement("button",{className:"settings-btn",onClick:h,title:"Settings"},q.default.createElement("svg",{className:"settings-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},q.default.createElement("path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"}),q.default.createElement("circle",{cx:"12",cy:"12",r:"3"})))))}var ae=J(ee(),1);var F=J(ee(),1);function Mr(e){return new Date(e).toLocaleString()}function Ap(e){let t=["/Scripts/","/src/","/plugin/","/docs/"];for(let o of t){let l=e.indexOf(o);if(l!==-1)return e.substring(l+1)}let n=e.indexOf("claude-mem/");if(n!==-1)return e.substring(n+11);let r=e.split("/");return r.length>3?r.slice(-3).join("/"):e}function xp({observation:e}){let[t,n]=(0,F.useState)(!1),[r,o]=(0,F.useState)(!1),l=Mr(e.created_at_epoch),i=e.facts?JSON.parse(e.facts):[],s=e.concepts?JSON.parse(e.concepts):[],a=e.files_read?JSON.parse(e.files_read).map(Ap):[],u=e.files_modified?JSON.parse(e.files_modified).map(Ap):[],g=i.length>0||s.length>0||a.length>0||u.length>0;return F.default.createElement("div",{className:"card"},F.default.createElement("div",{className:"card-header"},F.default.createElement("div",{className:"card-header-left"},F.default.createElement("span",{className:`card-type type-${e.type}`},e.type),F.default.createElement("span",{className:`card-source source-${e.platform_source||"claude"}`},e.platform_source||"claude"),F.default.createElement("span",{className:"card-project"},e.project),e.merged_into_project&&F.default.createElement("span",{className:"card-merged-badge",title:`Merged into ${e.merged_into_project}`},"merged \u2192 ",e.merged_into_project)),F.default.createElement("div",{className:"view-mode-toggles"},g&&F.default.createElement("button",{className:`view-mode-toggle ${t?"active":""}`,onClick:()=>{n(!t),t||o(!1)}},F.default.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},F.default.createElement("polyline",{points:"9 11 12 14 22 4"}),F.default.createElement("path",{d:"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"})),F.default.createElement("span",null,"facts")),e.narrative&&F.default.createElement("button",{className:`view-mode-toggle ${r?"active":""}`,onClick:()=>{o(!r),r||n(!1)}},F.default.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},F.default.createElement("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),F.default.createElement("polyline",{points:"14 2 14 8 20 8"}),F.default.createElement("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),F.default.createElement("line",{x1:"16",y1:"17",x2:"8",y2:"17"})),F.default.createElement("span",null,"narrative")))),F.default.createElement("div",{className:"card-title"},e.title||"Untitled"),F.default.createElement("div",{className:"view-mode-content"},!t&&!r&&e.subtitle&&F.default.createElement("div",{className:"card-subtitle"},e.subtitle),t&&i.length>0&&F.default.createElement("ul",{className:"facts-list"},i.map((h,v)=>F.default.createElement("li",{key:v},h))),r&&e.narrative&&F.default.createElement("div",{className:"narrative"},e.narrative)),F.default.createElement("div",{className:"card-meta"},F.default.createElement("span",{className:"meta-date"},"#",e.id," \u2022 ",l),t&&(s.length>0||a.length>0||u.length>0)&&F.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px",alignItems:"center"}},s.map((h,v)=>F.default.createElement("span",{key:v,style:{padding:"2px 8px",background:"var(--color-type-badge-bg)",color:"var(--color-type-badge-text)",borderRadius:"3px",fontWeight:"500",fontSize:"10px"}},h)),a.length>0&&F.default.createElement("span",{className:"meta-files"},F.default.createElement("span",{className:"file-label"},"read:")," ",a.join(", ")),u.length>0&&F.default.createElement("span",{className:"meta-files"},F.default.createElement("span",{className:"file-label"},"modified:")," ",u.join(", ")))))}var Se=J(ee(),1);function Op({summary:e}){let t=Mr(e.created_at_epoch),n=[{key:"investigated",label:"Investigated",content:e.investigated,icon:"/icon-thick-investigated.svg"},{key:"learned",label:"Learned",content:e.learned,icon:"/icon-thick-learned.svg"},{key:"completed",label:"Completed",content:e.completed,icon:"/icon-thick-completed.svg"},{key:"next_steps",label:"Next Steps",content:e.next_steps,icon:"/icon-thick-next-steps.svg"}].filter(r=>r.content);return Se.default.createElement("article",{className:"card summary-card"},Se.default.createElement("header",{className:"summary-card-header"},Se.default.createElement("div",{className:"summary-badge-row"},Se.default.createElement("span",{className:"card-type summary-badge"},"Session Summary"),Se.default.createElement("span",{className:`card-source source-${e.platform_source||"claude"}`},e.platform_source||"claude"),Se.default.createElement("span",{className:"summary-project-badge"},e.project)),e.request&&Se.default.createElement("h2",{className:"summary-title"},e.request)),Se.default.createElement("div",{className:"summary-sections"},n.map((r,o)=>Se.default.createElement("section",{key:r.key,className:"summary-section",style:{animationDelay:`${o*50}ms`}},Se.default.createElement("div",{className:"summary-section-header"},Se.default.createElement("img",{src:r.icon,alt:r.label,className:`summary-section-icon summary-section-icon--${r.key}`}),Se.default.createElement("h3",{className:"summary-section-label"},r.label)),Se.default.createElement("div",{className:"summary-section-content"},r.content)))),Se.default.createElement("footer",{className:"summary-card-footer"},Se.default.createElement("span",{className:"summary-meta-id"},"Session #",e.id),Se.default.createElement("span",{className:"summary-meta-divider"},"\u2022"),Se.default.createElement("time",{className:"summary-meta-date",dateTime:new Date(e.created_at_epoch).toISOString()},t)))}var Pt=J(ee(),1);function Dp({prompt:e}){let t=Mr(e.created_at_epoch);return Pt.default.createElement("div",{className:"card prompt-card"},Pt.default.createElement("div",{className:"card-header"},Pt.default.createElement("div",{className:"card-header-left"},Pt.default.createElement("span",{className:"card-type"},"Prompt"),Pt.default.createElement("span",{className:`card-source source-${e.platform_source||"claude"}`},e.platform_source||"claude"),Pt.default.createElement("span",{className:"card-project"},e.project))),Pt.default.createElement("div",{className:"card-content"},e.prompt_text),Pt.default.createElement("div",{className:"card-meta"},Pt.default.createElement("span",{className:"meta-date"},"#",e.id," \u2022 ",t)))}var Sn=J(ee(),1);function Pp({targetRef:e}){let[t,n]=(0,Sn.useState)(!1);(0,Sn.useEffect)(()=>{let o=()=>{let i=e.current;i&&n(i.scrollTop>300)},l=e.current;if(l)return l.addEventListener("scroll",o),()=>l.removeEventListener("scroll",o)},[]);let r=()=>{let o=e.current;o&&o.scrollTo({top:0,behavior:"smooth"})};return t?Sn.default.createElement("button",{onClick:r,className:"scroll-to-top","aria-label":"Scroll to top"},Sn.default.createElement("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Sn.default.createElement("polyline",{points:"18 15 12 9 6 15"}))):null}var xo={PAGINATION_PAGE_SIZE:50,LOAD_MORE_THRESHOLD:.1};function Ip({observations:e,summaries:t,prompts:n,onLoadMore:r,isLoading:o,hasMore:l}){let i=(0,ae.useRef)(null),s=(0,ae.useRef)(null),a=(0,ae.useRef)(r);(0,ae.useEffect)(()=>{a.current=r},[r]),(0,ae.useEffect)(()=>{let g=i.current;if(!g)return;let h=new IntersectionObserver(v=>{v[0].isIntersecting&&l&&!o&&a.current?.()},{threshold:xo.LOAD_MORE_THRESHOLD});return h.observe(g),()=>{g&&h.unobserve(g),h.disconnect()}},[l,o]);let u=(0,ae.useMemo)(()=>[...e.map(h=>({...h,itemType:"observation"})),...t.map(h=>({...h,itemType:"summary"})),...n.map(h=>({...h,itemType:"prompt"}))].sort((h,v)=>v.created_at_epoch-h.created_at_epoch),[e,t,n]);return ae.default.createElement("div",{className:"feed",ref:s},ae.default.createElement(Pp,{targetRef:s}),ae.default.createElement("div",{className:"feed-content"},u.map(g=>{let h=`${g.itemType}-${g.id}`;return g.itemType==="observation"?ae.default.createElement(xp,{key:h,observation:g}):g.itemType==="summary"?ae.default.createElement(Op,{key:h,summary:g}):ae.default.createElement(Dp,{key:h,prompt:g})}),u.length===0&&!o&&ae.default.createElement("div",{style:{textAlign:"center",padding:"40px",color:"#8b949e"}},"No items to display"),o&&ae.default.createElement("div",{style:{textAlign:"center",padding:"20px",color:"#8b949e"}},ae.default.createElement("div",{className:"spinner",style:{display:"inline-block",marginRight:"10px"}}),"Loading more..."),l&&!o&&u.length>0&&ae.default.createElement("div",{ref:i,style:{height:"20px",margin:"10px 0"}}),!l&&u.length>0&&ae.default.createElement("div",{style:{textAlign:"center",padding:"20px",color:"#8b949e",fontSize:"14px"}},"No more items to load")))}var y=J(ee(),1);var ge=J(ee(),1),Tm=J(um(),1);var{entries:ym,setPrototypeOf:cm,isFrozen:Zv,getPrototypeOf:Jv,getOwnPropertyDescriptor:e0}=Object,{freeze:be,seal:pt,create:gu}=Object,{apply:hu,construct:vu}=typeof Reflect<"u"&&Reflect;be||(be=function(t){return t});pt||(pt=function(t){return t});hu||(hu=function(t,n){for(var r=arguments.length,o=new Array(r>2?r-2:0),l=2;l1?n-1:0),o=1;o1?n-1:0),o=1;o2&&arguments[2]!==void 0?arguments[2]:Ti;cm&&cm(e,null);let r=t.length;for(;r--;){let o=t[r];if(typeof o=="string"){let l=n(o);l!==o&&(Zv(t)||(t[r]=l),o=l)}e[o]=!0}return e}function i0(e){for(let t=0;t/gm),f0=pt(/\$\{[\w\W]*/gm),d0=pt(/^data-[\-\w.\u00B7-\uFFFF]+$/),p0=pt(/^aria-[\-\w]+$/),Em=pt(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),m0=pt(/^(?:\w+script|data):/i),g0=pt(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Sm=pt(/^html$/i),h0=pt(/^[a-z][.\w]*(-[.\w]+)+$/i),hm=Object.freeze({__proto__:null,ARIA_ATTR:p0,ATTR_WHITESPACE:g0,CUSTOM_ELEMENT:h0,DATA_ATTR:d0,DOCTYPE_NAME:Sm,ERB_EXPR:c0,IS_ALLOWED_URI:Em,IS_SCRIPT_OR_DATA:m0,MUSTACHE_EXPR:u0,TMPLIT_EXPR:f0}),Ro={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},v0=function(){return typeof window>"u"?null:window},y0=function(t,n){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let r=null,o="data-tt-policy-suffix";n&&n.hasAttribute(o)&&(r=n.getAttribute(o));let l="dompurify"+(r?"#"+r:"");try{return t.createPolicy(l,{createHTML(i){return i},createScriptURL(i){return i}})}catch{return console.warn("TrustedTypes policy "+l+" could not be created."),null}},vm=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function _m(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:v0(),t=P=>_m(P);if(t.version="3.3.1",t.removed=[],!e||!e.document||e.document.nodeType!==Ro.document||!e.Element)return t.isSupported=!1,t;let{document:n}=e,r=n,o=r.currentScript,{DocumentFragment:l,HTMLTemplateElement:i,Node:s,Element:a,NodeFilter:u,NamedNodeMap:g=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:h,DOMParser:v,trustedTypes:E}=e,_=a.prototype,k=Uo(_,"cloneNode"),A=Uo(_,"remove"),f=Uo(_,"nextSibling"),c=Uo(_,"childNodes"),m=Uo(_,"parentNode");if(typeof i=="function"){let P=n.createElement("template");P.content&&P.content.ownerDocument&&(n=P.content.ownerDocument)}let d,w="",{implementation:L,createNodeIterator:x,createDocumentFragment:D,getElementsByTagName:G}=n,{importNode:U}=r,W=vm();t.isSupported=typeof ym=="function"&&typeof m=="function"&&L&&L.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:rt,ERB_EXPR:Cn,TMPLIT_EXPR:Wn,DATA_ATTR:Pr,ARIA_ATTR:ke,IS_SCRIPT_OR_DATA:kn,ATTR_WHITESPACE:He,CUSTOM_ELEMENT:Ir}=hm,{IS_ALLOWED_URI:Vn}=hm,S=null,Q=z({},[...dm,...fu,...du,...pu,...pm]),R=null,he=z({},[...mm,...mu,...gm,...wi]),I=Object.seal(gu(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ue=null,ot=null,lt=Object.seal(gu(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),_u=!0,Ni=!0,wu=!1,Tu=!0,Gn=!1,zo=!0,Ln=!1,Mi=!1,Ai=!1,Xn=!1,Ho=!1,jo=!1,Cu=!0,ku=!1,zm="user-content-",xi=!0,Ur=!1,$n={},Ct=null,Oi=z({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Lu=null,Nu=z({},["audio","video","img","source","image","track"]),Di=null,Mu=z({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Bo="http://www.w3.org/1998/Math/MathML",qo="http://www.w3.org/2000/svg",Rt="http://www.w3.org/1999/xhtml",Kn=Rt,Pi=!1,Ii=null,Hm=z({},[Bo,qo,Rt],uu),Wo=z({},["mi","mo","mn","ms","mtext"]),Vo=z({},["annotation-xml"]),jm=z({},["title","style","font","a","script"]),Rr=null,Bm=["application/xhtml+xml","text/html"],qm="text/html",de=null,Yn=null,Wm=n.createElement("form"),Au=function(p){return p instanceof RegExp||p instanceof Function},Ui=function(){let p=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(Yn&&Yn===p)){if((!p||typeof p!="object")&&(p={}),p=Ut(p),Rr=Bm.indexOf(p.PARSER_MEDIA_TYPE)===-1?qm:p.PARSER_MEDIA_TYPE,de=Rr==="application/xhtml+xml"?uu:Ti,S=wt(p,"ALLOWED_TAGS")?z({},p.ALLOWED_TAGS,de):Q,R=wt(p,"ALLOWED_ATTR")?z({},p.ALLOWED_ATTR,de):he,Ii=wt(p,"ALLOWED_NAMESPACES")?z({},p.ALLOWED_NAMESPACES,uu):Hm,Di=wt(p,"ADD_URI_SAFE_ATTR")?z(Ut(Mu),p.ADD_URI_SAFE_ATTR,de):Mu,Lu=wt(p,"ADD_DATA_URI_TAGS")?z(Ut(Nu),p.ADD_DATA_URI_TAGS,de):Nu,Ct=wt(p,"FORBID_CONTENTS")?z({},p.FORBID_CONTENTS,de):Oi,ue=wt(p,"FORBID_TAGS")?z({},p.FORBID_TAGS,de):Ut({}),ot=wt(p,"FORBID_ATTR")?z({},p.FORBID_ATTR,de):Ut({}),$n=wt(p,"USE_PROFILES")?p.USE_PROFILES:!1,_u=p.ALLOW_ARIA_ATTR!==!1,Ni=p.ALLOW_DATA_ATTR!==!1,wu=p.ALLOW_UNKNOWN_PROTOCOLS||!1,Tu=p.ALLOW_SELF_CLOSE_IN_ATTR!==!1,Gn=p.SAFE_FOR_TEMPLATES||!1,zo=p.SAFE_FOR_XML!==!1,Ln=p.WHOLE_DOCUMENT||!1,Xn=p.RETURN_DOM||!1,Ho=p.RETURN_DOM_FRAGMENT||!1,jo=p.RETURN_TRUSTED_TYPE||!1,Ai=p.FORCE_BODY||!1,Cu=p.SANITIZE_DOM!==!1,ku=p.SANITIZE_NAMED_PROPS||!1,xi=p.KEEP_CONTENT!==!1,Ur=p.IN_PLACE||!1,Vn=p.ALLOWED_URI_REGEXP||Em,Kn=p.NAMESPACE||Rt,Wo=p.MATHML_TEXT_INTEGRATION_POINTS||Wo,Vo=p.HTML_INTEGRATION_POINTS||Vo,I=p.CUSTOM_ELEMENT_HANDLING||{},p.CUSTOM_ELEMENT_HANDLING&&Au(p.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(I.tagNameCheck=p.CUSTOM_ELEMENT_HANDLING.tagNameCheck),p.CUSTOM_ELEMENT_HANDLING&&Au(p.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(I.attributeNameCheck=p.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),p.CUSTOM_ELEMENT_HANDLING&&typeof p.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(I.allowCustomizedBuiltInElements=p.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Gn&&(Ni=!1),Ho&&(Xn=!0),$n&&(S=z({},pm),R=[],$n.html===!0&&(z(S,dm),z(R,mm)),$n.svg===!0&&(z(S,fu),z(R,mu),z(R,wi)),$n.svgFilters===!0&&(z(S,du),z(R,mu),z(R,wi)),$n.mathMl===!0&&(z(S,pu),z(R,gm),z(R,wi))),p.ADD_TAGS&&(typeof p.ADD_TAGS=="function"?lt.tagCheck=p.ADD_TAGS:(S===Q&&(S=Ut(S)),z(S,p.ADD_TAGS,de))),p.ADD_ATTR&&(typeof p.ADD_ATTR=="function"?lt.attributeCheck=p.ADD_ATTR:(R===he&&(R=Ut(R)),z(R,p.ADD_ATTR,de))),p.ADD_URI_SAFE_ATTR&&z(Di,p.ADD_URI_SAFE_ATTR,de),p.FORBID_CONTENTS&&(Ct===Oi&&(Ct=Ut(Ct)),z(Ct,p.FORBID_CONTENTS,de)),p.ADD_FORBID_CONTENTS&&(Ct===Oi&&(Ct=Ut(Ct)),z(Ct,p.ADD_FORBID_CONTENTS,de)),xi&&(S["#text"]=!0),Ln&&z(S,["html","head","body"]),S.table&&(z(S,["tbody"]),delete ue.tbody),p.TRUSTED_TYPES_POLICY){if(typeof p.TRUSTED_TYPES_POLICY.createHTML!="function")throw Io('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof p.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw Io('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');d=p.TRUSTED_TYPES_POLICY,w=d.createHTML("")}else d===void 0&&(d=y0(E,o)),d!==null&&typeof w=="string"&&(w=d.createHTML(""));be&&be(p),Yn=p}},xu=z({},[...fu,...du,...s0]),Ou=z({},[...pu,...a0]),Vm=function(p){let C=m(p);(!C||!C.tagName)&&(C={namespaceURI:Kn,tagName:"template"});let O=Ti(p.tagName),Z=Ti(C.tagName);return Ii[p.namespaceURI]?p.namespaceURI===qo?C.namespaceURI===Rt?O==="svg":C.namespaceURI===Bo?O==="svg"&&(Z==="annotation-xml"||Wo[Z]):!!xu[O]:p.namespaceURI===Bo?C.namespaceURI===Rt?O==="math":C.namespaceURI===qo?O==="math"&&Vo[Z]:!!Ou[O]:p.namespaceURI===Rt?C.namespaceURI===qo&&!Vo[Z]||C.namespaceURI===Bo&&!Wo[Z]?!1:!Ou[O]&&(jm[O]||!xu[O]):!!(Rr==="application/xhtml+xml"&&Ii[p.namespaceURI]):!1},kt=function(p){Do(t.removed,{element:p});try{m(p).removeChild(p)}catch{A(p)}},Nn=function(p,C){try{Do(t.removed,{attribute:C.getAttributeNode(p),from:C})}catch{Do(t.removed,{attribute:null,from:C})}if(C.removeAttribute(p),p==="is")if(Xn||Ho)try{kt(C)}catch{}else try{C.setAttribute(p,"")}catch{}},Du=function(p){let C=null,O=null;if(Ai)p=""+p;else{let ce=cu(p,/^[\r\n\t ]+/);O=ce&&ce[0]}Rr==="application/xhtml+xml"&&Kn===Rt&&(p=''+p+"");let Z=d?d.createHTML(p):p;if(Kn===Rt)try{C=new v().parseFromString(Z,Rr)}catch{}if(!C||!C.documentElement){C=L.createDocument(Kn,"template",null);try{C.documentElement.innerHTML=Pi?w:Z}catch{}}let Le=C.body||C.documentElement;return p&&O&&Le.insertBefore(n.createTextNode(O),Le.childNodes[0]||null),Kn===Rt?G.call(C,Ln?"html":"body")[0]:Ln?C.documentElement:Le},Pu=function(p){return x.call(p.ownerDocument||p,p,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT|u.SHOW_PROCESSING_INSTRUCTION|u.SHOW_CDATA_SECTION,null)},Ri=function(p){return p instanceof h&&(typeof p.nodeName!="string"||typeof p.textContent!="string"||typeof p.removeChild!="function"||!(p.attributes instanceof g)||typeof p.removeAttribute!="function"||typeof p.setAttribute!="function"||typeof p.namespaceURI!="string"||typeof p.insertBefore!="function"||typeof p.hasChildNodes!="function")},Iu=function(p){return typeof s=="function"&&p instanceof s};function Ft(P,p,C){_i(P,O=>{O.call(t,p,C,Yn)})}let Uu=function(p){let C=null;if(Ft(W.beforeSanitizeElements,p,null),Ri(p))return kt(p),!0;let O=de(p.nodeName);if(Ft(W.uponSanitizeElement,p,{tagName:O,allowedTags:S}),zo&&p.hasChildNodes()&&!Iu(p.firstElementChild)&&Fe(/<[/\w!]/g,p.innerHTML)&&Fe(/<[/\w!]/g,p.textContent)||p.nodeType===Ro.progressingInstruction||zo&&p.nodeType===Ro.comment&&Fe(/<[/\w]/g,p.data))return kt(p),!0;if(!(lt.tagCheck instanceof Function&<.tagCheck(O))&&(!S[O]||ue[O])){if(!ue[O]&&Fu(O)&&(I.tagNameCheck instanceof RegExp&&Fe(I.tagNameCheck,O)||I.tagNameCheck instanceof Function&&I.tagNameCheck(O)))return!1;if(xi&&!Ct[O]){let Z=m(p)||p.parentNode,Le=c(p)||p.childNodes;if(Le&&Z){let ce=Le.length;for(let je=ce-1;je>=0;--je){let bt=k(Le[je],!0);bt.__removalCount=(p.__removalCount||0)+1,Z.insertBefore(bt,f(p))}}}return kt(p),!0}return p instanceof a&&!Vm(p)||(O==="noscript"||O==="noembed"||O==="noframes")&&Fe(/<\/no(script|embed|frames)/i,p.innerHTML)?(kt(p),!0):(Gn&&p.nodeType===Ro.text&&(C=p.textContent,_i([rt,Cn,Wn],Z=>{C=Po(C,Z," ")}),p.textContent!==C&&(Do(t.removed,{element:p.cloneNode()}),p.textContent=C)),Ft(W.afterSanitizeElements,p,null),!1)},Ru=function(p,C,O){if(Cu&&(C==="id"||C==="name")&&(O in n||O in Wm))return!1;if(!(Ni&&!ot[C]&&Fe(Pr,C))){if(!(_u&&Fe(ke,C))){if(!(lt.attributeCheck instanceof Function&<.attributeCheck(C,p))){if(!R[C]||ot[C]){if(!(Fu(p)&&(I.tagNameCheck instanceof RegExp&&Fe(I.tagNameCheck,p)||I.tagNameCheck instanceof Function&&I.tagNameCheck(p))&&(I.attributeNameCheck instanceof RegExp&&Fe(I.attributeNameCheck,C)||I.attributeNameCheck instanceof Function&&I.attributeNameCheck(C,p))||C==="is"&&I.allowCustomizedBuiltInElements&&(I.tagNameCheck instanceof RegExp&&Fe(I.tagNameCheck,O)||I.tagNameCheck instanceof Function&&I.tagNameCheck(O))))return!1}else if(!Di[C]){if(!Fe(Vn,Po(O,He,""))){if(!((C==="src"||C==="xlink:href"||C==="href")&&p!=="script"&&r0(O,"data:")===0&&Lu[p])){if(!(wu&&!Fe(kn,Po(O,He,"")))){if(O)return!1}}}}}}}return!0},Fu=function(p){return p!=="annotation-xml"&&cu(p,Ir)},bu=function(p){Ft(W.beforeSanitizeAttributes,p,null);let{attributes:C}=p;if(!C||Ri(p))return;let O={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:R,forceKeepAttr:void 0},Z=C.length;for(;Z--;){let Le=C[Z],{name:ce,namespaceURI:je,value:bt}=Le,Qn=de(ce),Fi=bt,_e=ce==="value"?Fi:o0(Fi);if(O.attrName=Qn,O.attrValue=_e,O.keepAttr=!0,O.forceKeepAttr=void 0,Ft(W.uponSanitizeAttribute,p,O),_e=O.attrValue,ku&&(Qn==="id"||Qn==="name")&&(Nn(ce,p),_e=zm+_e),zo&&Fe(/((--!?|])>)|<\/(style|title|textarea)/i,_e)){Nn(ce,p);continue}if(Qn==="attributename"&&cu(_e,"href")){Nn(ce,p);continue}if(O.forceKeepAttr)continue;if(!O.keepAttr){Nn(ce,p);continue}if(!Tu&&Fe(/\/>/i,_e)){Nn(ce,p);continue}Gn&&_i([rt,Cn,Wn],Hu=>{_e=Po(_e,Hu," ")});let zu=de(p.nodeName);if(!Ru(zu,Qn,_e)){Nn(ce,p);continue}if(d&&typeof E=="object"&&typeof E.getAttributeType=="function"&&!je)switch(E.getAttributeType(zu,Qn)){case"TrustedHTML":{_e=d.createHTML(_e);break}case"TrustedScriptURL":{_e=d.createScriptURL(_e);break}}if(_e!==Fi)try{je?p.setAttributeNS(je,ce,_e):p.setAttribute(ce,_e),Ri(p)?kt(p):fm(t.removed)}catch{Nn(ce,p)}}Ft(W.afterSanitizeAttributes,p,null)},Gm=function P(p){let C=null,O=Pu(p);for(Ft(W.beforeSanitizeShadowDOM,p,null);C=O.nextNode();)Ft(W.uponSanitizeShadowNode,C,null),Uu(C),bu(C),C.content instanceof l&&P(C.content);Ft(W.afterSanitizeShadowDOM,p,null)};return t.sanitize=function(P){let p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},C=null,O=null,Z=null,Le=null;if(Pi=!P,Pi&&(P=""),typeof P!="string"&&!Iu(P))if(typeof P.toString=="function"){if(P=P.toString(),typeof P!="string")throw Io("dirty is not a string, aborting")}else throw Io("toString is not a function");if(!t.isSupported)return P;if(Mi||Ui(p),t.removed=[],typeof P=="string"&&(Ur=!1),Ur){if(P.nodeName){let bt=de(P.nodeName);if(!S[bt]||ue[bt])throw Io("root node is forbidden and cannot be sanitized in-place")}}else if(P instanceof s)C=Du(""),O=C.ownerDocument.importNode(P,!0),O.nodeType===Ro.element&&O.nodeName==="BODY"||O.nodeName==="HTML"?C=O:C.appendChild(O);else{if(!Xn&&!Gn&&!Ln&&P.indexOf("<")===-1)return d&&jo?d.createHTML(P):P;if(C=Du(P),!C)return Xn?null:jo?w:""}C&&Ai&&kt(C.firstChild);let ce=Pu(Ur?P:C);for(;Z=ce.nextNode();)Uu(Z),bu(Z),Z.content instanceof l&&Gm(Z.content);if(Ur)return P;if(Xn){if(Ho)for(Le=D.call(C.ownerDocument);C.firstChild;)Le.appendChild(C.firstChild);else Le=C;return(R.shadowroot||R.shadowrootmode)&&(Le=U.call(r,Le,!0)),Le}let je=Ln?C.outerHTML:C.innerHTML;return Ln&&S["!doctype"]&&C.ownerDocument&&C.ownerDocument.doctype&&C.ownerDocument.doctype.name&&Fe(Sm,C.ownerDocument.doctype.name)&&(je=" -`+je),Gn&&_i([rt,Cn,Wn],bt=>{je=Po(je,bt," ")}),d&&jo?d.createHTML(je):je},t.setConfig=function(){let P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Ui(P),Mi=!0},t.clearConfig=function(){Yn=null,Mi=!1},t.isValidAttribute=function(P,p,C){Yn||Ui({});let O=de(P),Z=de(p);return Ru(O,Z,C)},t.addHook=function(P,p){typeof p=="function"&&Do(W[P],p)},t.removeHook=function(P,p){if(p!==void 0){let C=t0(W[P],p);return C===-1?void 0:n0(W[P],C,1)[0]}return fm(W[P])},t.removeHooks=function(P){W[P]=[]},t.removeAllHooks=function(){W=vm()},t}var wm=_m();var E0=new Tm.default({fg:"#dcd6cc",bg:"#252320",newline:!1,escapeXML:!0,stream:!1});function Cm({content:e,isLoading:t=!1,className:n=""}){let r=(0,ge.useRef)(null),o=(0,ge.useRef)(0),[l,i]=(0,ge.useState)(!0),s=(0,ge.useMemo)(()=>{if(r.current&&(o.current=r.current.scrollTop),!e)return"";let u=E0.toHtml(e);return wm.sanitize(u,{ALLOWED_TAGS:["span","div","br"],ALLOWED_ATTR:["style","class"],ALLOW_DATA_ATTR:!1})},[e]);return(0,ge.useLayoutEffect)(()=>{r.current&&o.current>0&&(r.current.scrollTop=o.current)},[s]),ge.default.createElement("div",{className:n,style:{backgroundColor:"var(--color-bg-card)",border:"1px solid var(--color-border-primary)",borderRadius:"8px",overflow:"hidden",height:"100%",display:"flex",flexDirection:"column",boxShadow:"0 10px 40px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.3)"}},ge.default.createElement("div",{style:{padding:"12px",borderBottom:"1px solid var(--color-border-primary)",display:"flex",gap:"6px",alignItems:"center",backgroundColor:"var(--color-bg-header)"}},ge.default.createElement("div",{style:{width:"12px",height:"12px",borderRadius:"50%",backgroundColor:"#ff5f57"}}),ge.default.createElement("div",{style:{width:"12px",height:"12px",borderRadius:"50%",backgroundColor:"#ffbd2e"}}),ge.default.createElement("div",{style:{width:"12px",height:"12px",borderRadius:"50%",backgroundColor:"#28c840"}}),ge.default.createElement("button",{onClick:()=>i(!l),style:{marginLeft:"auto",padding:"4px 8px",fontSize:"11px",fontWeight:500,color:l?"var(--color-text-secondary)":"var(--color-accent-primary)",backgroundColor:"transparent",border:"1px solid",borderColor:l?"var(--color-border-primary)":"var(--color-accent-primary)",borderRadius:"4px",cursor:"pointer",transition:"all 0.2s",whiteSpace:"nowrap"},onMouseEnter:u=>{u.currentTarget.style.borderColor="var(--color-accent-primary)",u.currentTarget.style.color="var(--color-accent-primary)"},onMouseLeave:u=>{u.currentTarget.style.borderColor=l?"var(--color-border-primary)":"var(--color-accent-primary)",u.currentTarget.style.color=l?"var(--color-text-secondary)":"var(--color-accent-primary)"},title:l?"Disable word wrap (scroll horizontally)":"Enable word wrap"},l?"\u2922 Wrap":"\u21C4 Scroll")),t?ge.default.createElement("div",{style:{padding:"16px",fontFamily:"var(--font-terminal)",fontSize:"12px",color:"var(--color-text-secondary)"}},"Loading preview..."):ge.default.createElement("div",{style:{position:"relative",flex:1,overflow:"hidden"}},ge.default.createElement("pre",{ref:r,style:{padding:"16px",margin:0,fontFamily:"var(--font-terminal)",fontSize:"12px",lineHeight:"1.6",overflow:"auto",color:"var(--color-text-primary)",backgroundColor:"var(--color-bg-card)",whiteSpace:l?"pre-wrap":"pre",wordBreak:l?"break-word":"normal",position:"absolute",inset:0},dangerouslySetInnerHTML:{__html:s}})))}var $e=J(ee(),1);function S0(e){return e.includes("claude")?"claude":e.includes("codex")?"codex":e[0]||null}function _0(e){let t=["claude","codex",...e];return Array.from(new Set(t))}function km(e){let[t,n]=(0,$e.useState)(""),[r,o]=(0,$e.useState)(!1),[l,i]=(0,$e.useState)(null),[s,a]=(0,$e.useState)({projects:[],sources:[],projectsBySource:{}}),[u,g]=(0,$e.useState)([]),[h,v]=(0,$e.useState)(null),[E,_]=(0,$e.useState)(null);(0,$e.useEffect)(()=>{async function A(){let f;try{f=await(await fetch("/api/projects")).json()}catch(d){console.error("Failed to fetch projects:",d instanceof Error?d.message:String(d));return}let c={projects:f.projects||[],sources:_0(f.sources||[]),projectsBySource:f.projectsBySource||{}};a(c);let m=S0(c.sources);if(v(m),m){let d=c.projectsBySource[m]||[];g(d),_(d[0]||null);return}g(c.projects),_(c.projects[0]||null)}A()},[]),(0,$e.useEffect)(()=>{if(!h){g(s.projects),_(f=>f&&s.projects.includes(f)?f:s.projects[0]||null);return}let A=s.projectsBySource[h]||[];g(A),_(f=>f&&A.includes(f)?f:A[0]||null)},[s,h]);let k=(0,$e.useCallback)(async()=>{if(!E){n("No project selected");return}o(!0),i(null);let A=new URLSearchParams({project:E});h&&A.append("platformSource",h);try{let f=await fetch(`/api/context/preview?${A}`),c=await f.text();f.ok?n(c):i("Failed to load preview")}catch(f){console.error("Failed to load context preview:",f instanceof Error?f.message:String(f)),i("Failed to load preview")}o(!1)},[E,h]);return(0,$e.useEffect)(()=>{let A=setTimeout(()=>{k()},300);return()=>clearTimeout(A)},[e,k]),{preview:t,isLoading:r,error:l,refresh:k,projects:u,sources:s.sources,selectedSource:h,setSelectedSource:v,selectedProject:E,setSelectedProject:_}}function yu({title:e,description:t,children:n,defaultOpen:r=!0}){let[o,l]=(0,y.useState)(r);return y.default.createElement("div",{className:`settings-section-collapsible ${o?"open":""}`},y.default.createElement("button",{className:"section-header-btn",onClick:()=>l(!o),type:"button"},y.default.createElement("div",{className:"section-header-content"},y.default.createElement("span",{className:"section-title"},e),t&&y.default.createElement("span",{className:"section-description"},t)),y.default.createElement("svg",{className:`chevron-icon ${o?"rotated":""}`,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2"},y.default.createElement("polyline",{points:"6 9 12 15 18 9"}))),o&&y.default.createElement("div",{className:"section-content"},n))}function tt({label:e,tooltip:t,children:n}){return y.default.createElement("div",{className:"form-field"},y.default.createElement("label",{className:"form-field-label"},e,t&&y.default.createElement("span",{className:"tooltip-trigger",title:t},y.default.createElement("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2"},y.default.createElement("circle",{cx:"12",cy:"12",r:"10"}),y.default.createElement("path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"}),y.default.createElement("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})))),n)}function Ar({id:e,label:t,description:n,checked:r,onChange:o,disabled:l}){return y.default.createElement("div",{className:"toggle-row"},y.default.createElement("div",{className:"toggle-info"},y.default.createElement("label",{htmlFor:e,className:"toggle-label"},t),n&&y.default.createElement("span",{className:"toggle-description"},n)),y.default.createElement("button",{type:"button",id:e,role:"switch","aria-checked":r,className:`toggle-switch ${r?"on":""} ${l?"disabled":""}`,onClick:()=>!l&&o(!r),disabled:l},y.default.createElement("span",{className:"toggle-knob"})))}function Lm({isOpen:e,onClose:t,settings:n,onSave:r,isSaving:o,saveStatus:l}){let[i,s]=(0,y.useState)(n);(0,y.useEffect)(()=>{s(n)},[n]);let{preview:a,isLoading:u,error:g,projects:h,sources:v,selectedSource:E,setSelectedSource:_,selectedProject:k,setSelectedProject:A}=km(i),f=(0,y.useCallback)((d,w)=>{let L={...i,[d]:w};s(L)},[i]),c=(0,y.useCallback)(()=>{r(i)},[i,r]),m=(0,y.useCallback)(d=>{let L=i[d]==="true"?"false":"true";f(d,L)},[i,f]);return(0,y.useEffect)(()=>{let d=w=>{w.key==="Escape"&&t()};if(e)return window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)},[e,t]),e?y.default.createElement("div",{className:"modal-backdrop",onClick:t},y.default.createElement("div",{className:"context-settings-modal",onClick:d=>d.stopPropagation()},y.default.createElement("div",{className:"modal-header"},y.default.createElement("h2",null,"Settings"),y.default.createElement("div",{className:"header-controls"},y.default.createElement("label",{className:"preview-selector"},"Source:",y.default.createElement("select",{value:E||"",onChange:d=>_(d.target.value),disabled:v.length===0},v.map(d=>y.default.createElement("option",{key:d,value:d},d)))),y.default.createElement("label",{className:"preview-selector"},"Project:",y.default.createElement("select",{value:k||"",onChange:d=>A(d.target.value),disabled:h.length===0},h.map(d=>y.default.createElement("option",{key:d,value:d},d)))),y.default.createElement("button",{onClick:t,className:"modal-close-btn",title:"Close (Esc)"},y.default.createElement("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2"},y.default.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),y.default.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"}))))),y.default.createElement("div",{className:"modal-body"},y.default.createElement("div",{className:"preview-column"},y.default.createElement("div",{className:"preview-content"},g?y.default.createElement("div",{style:{color:"#ff6b6b"}},"Error loading preview: ",g):y.default.createElement(Cm,{content:a,isLoading:u}))),y.default.createElement("div",{className:"settings-column"},y.default.createElement(yu,{title:"Loading",description:"How many observations to inject"},y.default.createElement(tt,{label:"Observations",tooltip:"Number of recent observations to include in context (1-200)"},y.default.createElement("input",{type:"number",min:"1",max:"200",value:i.CLAUDE_MEM_CONTEXT_OBSERVATIONS||"50",onChange:d=>f("CLAUDE_MEM_CONTEXT_OBSERVATIONS",d.target.value)})),y.default.createElement(tt,{label:"Sessions",tooltip:"Number of recent sessions to pull observations from (1-50)"},y.default.createElement("input",{type:"number",min:"1",max:"50",value:i.CLAUDE_MEM_CONTEXT_SESSION_COUNT||"10",onChange:d=>f("CLAUDE_MEM_CONTEXT_SESSION_COUNT",d.target.value)}))),y.default.createElement(yu,{title:"Display",description:"What to show in context tables"},y.default.createElement("div",{className:"display-subsection"},y.default.createElement("span",{className:"subsection-label"},"Full Observations"),y.default.createElement(tt,{label:"Count",tooltip:"How many observations show expanded details (0-20)"},y.default.createElement("input",{type:"number",min:"0",max:"20",value:i.CLAUDE_MEM_CONTEXT_FULL_COUNT||"5",onChange:d=>f("CLAUDE_MEM_CONTEXT_FULL_COUNT",d.target.value)})),y.default.createElement(tt,{label:"Field",tooltip:"Which field to expand for full observations"},y.default.createElement("select",{value:i.CLAUDE_MEM_CONTEXT_FULL_FIELD||"narrative",onChange:d=>f("CLAUDE_MEM_CONTEXT_FULL_FIELD",d.target.value)},y.default.createElement("option",{value:"narrative"},"Narrative"),y.default.createElement("option",{value:"facts"},"Facts")))),y.default.createElement("div",{className:"display-subsection"},y.default.createElement("span",{className:"subsection-label"},"Token Economics"),y.default.createElement("div",{className:"toggle-group"},y.default.createElement(Ar,{id:"show-read-tokens",label:"Read cost",description:"Tokens to read this observation",checked:i.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS==="true",onChange:()=>m("CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS")}),y.default.createElement(Ar,{id:"show-work-tokens",label:"Work investment",description:"Tokens spent creating this observation",checked:i.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS==="true",onChange:()=>m("CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS")}),y.default.createElement(Ar,{id:"show-savings-amount",label:"Savings",description:"Total tokens saved by reusing context",checked:i.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT==="true",onChange:()=>m("CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT")})))),y.default.createElement(yu,{title:"Advanced",description:"AI provider and model selection",defaultOpen:!1},y.default.createElement(tt,{label:"AI Provider",tooltip:"Choose between Claude (via Agent SDK) or Gemini (via REST API)"},y.default.createElement("select",{value:i.CLAUDE_MEM_PROVIDER||"claude",onChange:d=>f("CLAUDE_MEM_PROVIDER",d.target.value)},y.default.createElement("option",{value:"claude"},"Claude (uses your Claude account)"),y.default.createElement("option",{value:"gemini"},"Gemini (uses API key)"),y.default.createElement("option",{value:"openrouter"},"OpenRouter (multi-model)"))),i.CLAUDE_MEM_PROVIDER==="claude"&&y.default.createElement(tt,{label:"Claude Model",tooltip:"Claude model used for generating observations"},y.default.createElement("select",{value:i.CLAUDE_MEM_MODEL||"haiku",onChange:d=>f("CLAUDE_MEM_MODEL",d.target.value)},y.default.createElement("option",{value:"haiku"},"haiku (fastest)"),y.default.createElement("option",{value:"sonnet"},"sonnet (balanced)"),y.default.createElement("option",{value:"opus"},"opus (highest quality)"))),i.CLAUDE_MEM_PROVIDER==="gemini"&&y.default.createElement(y.default.Fragment,null,y.default.createElement(tt,{label:"Gemini API Key",tooltip:"Your Google AI Studio API key (or set GEMINI_API_KEY env var)"},y.default.createElement("input",{type:"password",value:i.CLAUDE_MEM_GEMINI_API_KEY||"",onChange:d=>f("CLAUDE_MEM_GEMINI_API_KEY",d.target.value),placeholder:"Enter Gemini API key..."})),y.default.createElement(tt,{label:"Gemini Model",tooltip:"Gemini model used for generating observations"},y.default.createElement("select",{value:i.CLAUDE_MEM_GEMINI_MODEL||"gemini-2.5-flash-lite",onChange:d=>f("CLAUDE_MEM_GEMINI_MODEL",d.target.value)},y.default.createElement("option",{value:"gemini-2.5-flash-lite"},"gemini-2.5-flash-lite (10 RPM free)"),y.default.createElement("option",{value:"gemini-2.5-flash"},"gemini-2.5-flash (5 RPM free)"),y.default.createElement("option",{value:"gemini-3-flash-preview"},"gemini-3-flash-preview (5 RPM free)"))),y.default.createElement("div",{className:"toggle-group",style:{marginTop:"8px"}},y.default.createElement(Ar,{id:"gemini-rate-limiting",label:"Rate Limiting",description:"Enable for free tier (10-30 RPM). Disable if you have billing set up (1000+ RPM).",checked:i.CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED==="true",onChange:d=>f("CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED",d?"true":"false")}))),i.CLAUDE_MEM_PROVIDER==="openrouter"&&y.default.createElement(y.default.Fragment,null,y.default.createElement(tt,{label:"OpenRouter API Key",tooltip:"Your OpenRouter API key from openrouter.ai (or set OPENROUTER_API_KEY env var)"},y.default.createElement("input",{type:"password",value:i.CLAUDE_MEM_OPENROUTER_API_KEY||"",onChange:d=>f("CLAUDE_MEM_OPENROUTER_API_KEY",d.target.value),placeholder:"Enter OpenRouter API key..."})),y.default.createElement(tt,{label:"OpenRouter Model",tooltip:"Model identifier from OpenRouter (e.g., anthropic/claude-3.5-sonnet, google/gemini-2.0-flash-thinking-exp)"},y.default.createElement("input",{type:"text",value:i.CLAUDE_MEM_OPENROUTER_MODEL||"xiaomi/mimo-v2-flash:free",onChange:d=>f("CLAUDE_MEM_OPENROUTER_MODEL",d.target.value),placeholder:"e.g., xiaomi/mimo-v2-flash:free"})),y.default.createElement(tt,{label:"Site URL (Optional)",tooltip:"Your site URL for OpenRouter analytics (optional)"},y.default.createElement("input",{type:"text",value:i.CLAUDE_MEM_OPENROUTER_SITE_URL||"",onChange:d=>f("CLAUDE_MEM_OPENROUTER_SITE_URL",d.target.value),placeholder:"https://yoursite.com"})),y.default.createElement(tt,{label:"App Name (Optional)",tooltip:"Your app name for OpenRouter analytics (optional)"},y.default.createElement("input",{type:"text",value:i.CLAUDE_MEM_OPENROUTER_APP_NAME||"claude-mem",onChange:d=>f("CLAUDE_MEM_OPENROUTER_APP_NAME",d.target.value),placeholder:"claude-mem"}))),y.default.createElement(tt,{label:"Worker Port",tooltip:"Port for the background worker service"},y.default.createElement("input",{type:"number",min:"1024",max:"65535",value:i.CLAUDE_MEM_WORKER_PORT||"37777",onChange:d=>f("CLAUDE_MEM_WORKER_PORT",d.target.value)})),y.default.createElement("div",{className:"toggle-group",style:{marginTop:"12px"}},y.default.createElement(Ar,{id:"show-last-summary",label:"Include last summary",description:"Add previous session's summary to context",checked:i.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY==="true",onChange:()=>m("CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY")}),y.default.createElement(Ar,{id:"show-last-message",label:"Include last message",description:"Add previous session's final message",checked:i.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE==="true",onChange:()=>m("CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE")}))))),y.default.createElement("div",{className:"modal-footer"},y.default.createElement("div",{className:"save-status"},l&&y.default.createElement("span",{className:l.includes("\u2713")?"success":l.includes("\u2717")?"error":""},l)),y.default.createElement("button",{className:"save-btn",onClick:c,disabled:o},o?"Saving...":"Save")))):null}var N=J(ee(),1),Fo=[{key:"DEBUG",label:"Debug",icon:"\u{1F50D}",color:"#8b8b8b"},{key:"INFO",label:"Info",icon:"\u2139\uFE0F",color:"#58a6ff"},{key:"WARN",label:"Warn",icon:"\u26A0\uFE0F",color:"#d29922"},{key:"ERROR",label:"Error",icon:"\u274C",color:"#f85149"}],bo=[{key:"HOOK",label:"Hook",icon:"\u{1FA9D}",color:"#a371f7"},{key:"WORKER",label:"Worker",icon:"\u2699\uFE0F",color:"#58a6ff"},{key:"SDK",label:"SDK",icon:"\u{1F4E6}",color:"#3fb950"},{key:"PARSER",label:"Parser",icon:"\u{1F4C4}",color:"#79c0ff"},{key:"DB",label:"DB",icon:"\u{1F5C4}\uFE0F",color:"#f0883e"},{key:"SYSTEM",label:"System",icon:"\u{1F4BB}",color:"#8b949e"},{key:"HTTP",label:"HTTP",icon:"\u{1F310}",color:"#39d353"},{key:"SESSION",label:"Session",icon:"\u{1F4CB}",color:"#db61a2"},{key:"CHROMA",label:"Chroma",icon:"\u{1F52E}",color:"#a855f7"}];function w0(e){let t=/^\[([^\]]+)\]\s+\[(\w+)\s*\]\s+\[(\w+)\s*\]\s+(?:\[([^\]]+)\]\s+)?(.*)$/,n=e.match(t);if(!n)return{raw:e};let[,r,o,l,i,s]=n,a;return s.startsWith("\u2192")?a="dataIn":s.startsWith("\u2190")?a="dataOut":s.startsWith("\u2713")?a="success":s.startsWith("\u2717")?a="failure":s.startsWith("\u23F1")?a="timing":s.includes("[HAPPY-PATH]")&&(a="happyPath"),{raw:e,timestamp:r,level:o?.trim(),component:l?.trim(),correlationId:i||void 0,message:s,isSpecial:a}}function Nm({isOpen:e,onClose:t}){let[n,r]=(0,N.useState)(""),[o,l]=(0,N.useState)(!1),[i,s]=(0,N.useState)(null),[a,u]=(0,N.useState)(!1),[g,h]=(0,N.useState)(350),[v,E]=(0,N.useState)(!1),_=(0,N.useRef)(0),k=(0,N.useRef)(0),A=(0,N.useRef)(null),f=(0,N.useRef)(!0),[c,m]=(0,N.useState)(new Set(["DEBUG","INFO","WARN","ERROR"])),[d,w]=(0,N.useState)(new Set(["HOOK","WORKER","SDK","PARSER","DB","SYSTEM","HTTP","SESSION","CHROMA"])),[L,x]=(0,N.useState)(!1),D=(0,N.useMemo)(()=>n?n.split(` -`).map(w0):[],[n]),G=(0,N.useMemo)(()=>D.filter(S=>L?S.raw.includes("[ALIGNMENT]"):!S.level||!S.component?!0:c.has(S.level)&&d.has(S.component)),[D,c,d,L]),U=(0,N.useCallback)(()=>{if(!A.current)return!0;let{scrollTop:S,scrollHeight:Q,clientHeight:R}=A.current;return Q-S-R<50},[]),W=(0,N.useCallback)(()=>{A.current&&f.current&&(A.current.scrollTop=A.current.scrollHeight)},[]),rt=(0,N.useCallback)(async()=>{f.current=U(),l(!0),s(null);try{let S=await fetch("/api/logs");if(!S.ok)throw new Error(`Failed to fetch logs: ${S.statusText}`);let Q=await S.json();r(Q.logs||"")}catch(S){s(S instanceof Error?S.message:"Unknown error")}finally{l(!1)}},[U]);(0,N.useEffect)(()=>{W()},[n,W]);let Cn=(0,N.useCallback)(async()=>{if(confirm("Are you sure you want to clear all logs?")){l(!0),s(null);try{let S=await fetch("/api/logs/clear",{method:"POST"});if(!S.ok)throw new Error(`Failed to clear logs: ${S.statusText}`);r("")}catch(S){s(S instanceof Error?S.message:"Unknown error")}finally{l(!1)}}},[]),Wn=(0,N.useCallback)(S=>{S.preventDefault(),E(!0),_.current=S.clientY,k.current=g},[g]);(0,N.useEffect)(()=>{if(!v)return;let S=R=>{let he=_.current-R.clientY,I=Math.min(Math.max(150,k.current+he),window.innerHeight-100);h(I)},Q=()=>{E(!1)};return document.addEventListener("mousemove",S),document.addEventListener("mouseup",Q),()=>{document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",Q)}},[v]),(0,N.useEffect)(()=>{e&&(f.current=!0,rt())},[e,rt]),(0,N.useEffect)(()=>{if(!e||!a)return;let S=setInterval(rt,2e3);return()=>clearInterval(S)},[e,a,rt]);let Pr=(0,N.useCallback)(S=>{m(Q=>{let R=new Set(Q);return R.has(S)?R.delete(S):R.add(S),R})},[]),ke=(0,N.useCallback)(S=>{w(Q=>{let R=new Set(Q);return R.has(S)?R.delete(S):R.add(S),R})},[]),kn=(0,N.useCallback)(S=>{m(S?new Set(["DEBUG","INFO","WARN","ERROR"]):new Set)},[]),He=(0,N.useCallback)(S=>{w(S?new Set(["HOOK","WORKER","SDK","PARSER","DB","SYSTEM","HTTP","SESSION","CHROMA"]):new Set)},[]);if(!e)return null;let Ir=S=>{let Q=Fo.find(ot=>ot.key===S.level),R=bo.find(ot=>ot.key===S.component),he="var(--color-text-primary)",I="normal",ue="transparent";return S.level==="ERROR"?(he="#f85149",ue="rgba(248, 81, 73, 0.1)"):S.level==="WARN"?(he="#d29922",ue="rgba(210, 153, 34, 0.05)"):S.isSpecial==="success"?he="#3fb950":S.isSpecial==="failure"?he="#f85149":S.isSpecial==="happyPath"?he="#d29922":Q&&(he=Q.color),{color:he,fontWeight:I,backgroundColor:ue,padding:"1px 0",borderRadius:"2px"}},Vn=(S,Q)=>{if(!S.timestamp)return N.default.createElement("div",{key:Q,className:"log-line log-line-raw"},S.raw);let R=Fo.find(I=>I.key===S.level),he=bo.find(I=>I.key===S.component);return N.default.createElement("div",{key:Q,className:"log-line",style:Ir(S)},N.default.createElement("span",{className:"log-timestamp"},"[",S.timestamp,"]")," ",N.default.createElement("span",{className:"log-level",style:{color:R?.color},title:S.level},"[",R?.icon||""," ",S.level?.padEnd(5),"]")," ",N.default.createElement("span",{className:"log-component",style:{color:he?.color},title:S.component},"[",he?.icon||""," ",S.component?.padEnd(7),"]")," ",S.correlationId&&N.default.createElement(N.default.Fragment,null,N.default.createElement("span",{className:"log-correlation"},"[",S.correlationId,"]")," "),N.default.createElement("span",{className:"log-message"},S.message))};return N.default.createElement("div",{className:"console-drawer",style:{height:`${g}px`}},N.default.createElement("div",{className:"console-resize-handle",onMouseDown:Wn},N.default.createElement("div",{className:"console-resize-bar"})),N.default.createElement("div",{className:"console-header"},N.default.createElement("div",{className:"console-tabs"},N.default.createElement("div",{className:"console-tab active"},"Console")),N.default.createElement("div",{className:"console-controls"},N.default.createElement("label",{className:"console-auto-refresh"},N.default.createElement("input",{type:"checkbox",checked:a,onChange:S=>u(S.target.checked)}),"Auto-refresh"),N.default.createElement("button",{className:"console-control-btn",onClick:rt,disabled:o,title:"Refresh logs"},"\u21BB"),N.default.createElement("button",{className:"console-control-btn",onClick:()=>{f.current=!0,W()},title:"Scroll to bottom"},"\u2B07"),N.default.createElement("button",{className:"console-control-btn console-clear-btn",onClick:Cn,disabled:o,title:"Clear logs"},"\u{1F5D1}"),N.default.createElement("button",{className:"console-control-btn",onClick:t,title:"Close console"},"\u2715"))),N.default.createElement("div",{className:"console-filters"},N.default.createElement("div",{className:"console-filter-section"},N.default.createElement("span",{className:"console-filter-label"},"Quick:"),N.default.createElement("div",{className:"console-filter-chips"},N.default.createElement("button",{className:`console-filter-chip ${L?"active":""}`,onClick:()=>x(!L),style:{"--chip-color":"#f0883e"},title:"Show only session alignment logs"},"\u{1F517} Alignment"))),N.default.createElement("div",{className:"console-filter-section"},N.default.createElement("span",{className:"console-filter-label"},"Levels:"),N.default.createElement("div",{className:"console-filter-chips"},Fo.map(S=>N.default.createElement("button",{key:S.key,className:`console-filter-chip ${c.has(S.key)?"active":""}`,onClick:()=>Pr(S.key),style:{"--chip-color":S.color},title:S.label},S.icon," ",S.label)),N.default.createElement("button",{className:"console-filter-action",onClick:()=>kn(c.size===0),title:c.size===Fo.length?"Select none":"Select all"},c.size===Fo.length?"\u25CB":"\u25CF"))),N.default.createElement("div",{className:"console-filter-section"},N.default.createElement("span",{className:"console-filter-label"},"Components:"),N.default.createElement("div",{className:"console-filter-chips"},bo.map(S=>N.default.createElement("button",{key:S.key,className:`console-filter-chip ${d.has(S.key)?"active":""}`,onClick:()=>ke(S.key),style:{"--chip-color":S.color},title:S.label},S.icon," ",S.label)),N.default.createElement("button",{className:"console-filter-action",onClick:()=>He(d.size===0),title:d.size===bo.length?"Select none":"Select all"},d.size===bo.length?"\u25CB":"\u25CF")))),i&&N.default.createElement("div",{className:"console-error"},"\u26A0 ",i),N.default.createElement("div",{className:"console-content",ref:A},N.default.createElement("div",{className:"console-logs"},G.length===0?N.default.createElement("div",{className:"log-line log-line-empty"},"No logs available"):G.map((S,Q)=>Vn(S,Q)))))}var nt=J(ee(),1);var Tt={OBSERVATIONS:"/api/observations",SUMMARIES:"/api/summaries",PROMPTS:"/api/prompts",SETTINGS:"/api/settings",STATS:"/api/stats",PROCESSING_STATUS:"/api/processing-status",STREAM:"/stream"};var Ci={SSE_RECONNECT_DELAY_MS:3e3,STATS_REFRESH_INTERVAL_MS:1e4,SAVE_STATUS_DISPLAY_DURATION_MS:3e3};function Mm(){let[e,t]=(0,nt.useState)([]),[n,r]=(0,nt.useState)([]),[o,l]=(0,nt.useState)([]),[i,s]=(0,nt.useState)({projects:[],sources:[],projectsBySource:{}}),[a,u]=(0,nt.useState)(!1),[g,h]=(0,nt.useState)(!1),[v,E]=(0,nt.useState)(0),_=(0,nt.useRef)(null),k=(0,nt.useRef)(),A=(f,c)=>{s(m=>{let d=m.projects.includes(f)?m.projects:[...m.projects,f],w=m.sources.includes(c)?m.sources:[...m.sources,c],L=m.projectsBySource[c]||[];return{projects:d,sources:w,projectsBySource:{...m.projectsBySource,[c]:L.includes(f)?L:[...L,f]}}})};return(0,nt.useEffect)(()=>{let f=()=>{_.current&&_.current.close();let c=new EventSource(Tt.STREAM);_.current=c,c.onopen=()=>{console.log("[SSE] Connected"),u(!0),k.current&&clearTimeout(k.current)},c.onerror=m=>{console.error("[SSE] Connection error:",m),u(!1),c.close(),k.current=setTimeout(()=>{k.current=void 0,console.log("[SSE] Attempting to reconnect..."),f()},Ci.SSE_RECONNECT_DELAY_MS)},c.onmessage=m=>{let d=JSON.parse(m.data);switch(d.type){case"initial_load":console.log("[SSE] Initial load:",{projects:d.projects?.length||0,sources:d.sources?.length||0}),s({projects:d.projects||[],sources:d.sources||[],projectsBySource:d.projectsBySource||{}});break;case"new_observation":d.observation&&(console.log("[SSE] New observation:",d.observation.id),A(d.observation.project,d.observation.platform_source||"claude"),t(w=>[d.observation,...w]));break;case"new_summary":d.summary&&(console.log("[SSE] New summary:",d.summary.id),A(d.summary.project,d.summary.platform_source||"claude"),r(w=>[d.summary,...w]));break;case"new_prompt":d.prompt&&(console.log("[SSE] New prompt:",d.prompt.id),A(d.prompt.project,d.prompt.platform_source||"claude"),l(w=>[d.prompt,...w]));break;case"processing_status":typeof d.isProcessing=="boolean"&&(console.log("[SSE] Processing status:",d.isProcessing,"Queue depth:",d.queueDepth),h(d.isProcessing),E(d.queueDepth||0));break}}};return f(),()=>{_.current&&_.current.close(),k.current&&clearTimeout(k.current)}},[]),{observations:e,summaries:n,prompts:o,projects:i.projects,sources:i.sources,projectsBySource:i.projectsBySource,isProcessing:g,queueDepth:v,isConnected:a}}var xr=J(ee(),1);var le={CLAUDE_MEM_MODEL:"claude-sonnet-4-6",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:"37777",CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"10",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]"};function Am(){let[e,t]=(0,xr.useState)(le),[n,r]=(0,xr.useState)(!1),[o,l]=(0,xr.useState)("");return(0,xr.useEffect)(()=>{fetch(Tt.SETTINGS).then(s=>s.json()).then(s=>{t({CLAUDE_MEM_MODEL:s.CLAUDE_MEM_MODEL??le.CLAUDE_MEM_MODEL,CLAUDE_MEM_CONTEXT_OBSERVATIONS:s.CLAUDE_MEM_CONTEXT_OBSERVATIONS??le.CLAUDE_MEM_CONTEXT_OBSERVATIONS,CLAUDE_MEM_WORKER_PORT:s.CLAUDE_MEM_WORKER_PORT??le.CLAUDE_MEM_WORKER_PORT,CLAUDE_MEM_WORKER_HOST:s.CLAUDE_MEM_WORKER_HOST??le.CLAUDE_MEM_WORKER_HOST,CLAUDE_MEM_PROVIDER:s.CLAUDE_MEM_PROVIDER??le.CLAUDE_MEM_PROVIDER,CLAUDE_MEM_GEMINI_API_KEY:s.CLAUDE_MEM_GEMINI_API_KEY??le.CLAUDE_MEM_GEMINI_API_KEY,CLAUDE_MEM_GEMINI_MODEL:s.CLAUDE_MEM_GEMINI_MODEL??le.CLAUDE_MEM_GEMINI_MODEL,CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:s.CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED??le.CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED,CLAUDE_MEM_OPENROUTER_API_KEY:s.CLAUDE_MEM_OPENROUTER_API_KEY??le.CLAUDE_MEM_OPENROUTER_API_KEY,CLAUDE_MEM_OPENROUTER_MODEL:s.CLAUDE_MEM_OPENROUTER_MODEL??le.CLAUDE_MEM_OPENROUTER_MODEL,CLAUDE_MEM_OPENROUTER_SITE_URL:s.CLAUDE_MEM_OPENROUTER_SITE_URL??le.CLAUDE_MEM_OPENROUTER_SITE_URL,CLAUDE_MEM_OPENROUTER_APP_NAME:s.CLAUDE_MEM_OPENROUTER_APP_NAME??le.CLAUDE_MEM_OPENROUTER_APP_NAME,CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:s.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS??le.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS,CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:s.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS??le.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS,CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:s.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT??le.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT,CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:s.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT??le.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT,CLAUDE_MEM_CONTEXT_FULL_COUNT:s.CLAUDE_MEM_CONTEXT_FULL_COUNT??le.CLAUDE_MEM_CONTEXT_FULL_COUNT,CLAUDE_MEM_CONTEXT_FULL_FIELD:s.CLAUDE_MEM_CONTEXT_FULL_FIELD??le.CLAUDE_MEM_CONTEXT_FULL_FIELD,CLAUDE_MEM_CONTEXT_SESSION_COUNT:s.CLAUDE_MEM_CONTEXT_SESSION_COUNT??le.CLAUDE_MEM_CONTEXT_SESSION_COUNT,CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:s.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY??le.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY,CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:s.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE??le.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE})}).catch(s=>{console.error("Failed to load settings:",s)})},[]),{settings:e,saveSettings:async s=>{r(!0),l("Saving...");let u=await(await fetch(Tt.SETTINGS,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})).json();u.success?(t(s),l("\u2713 Saved"),setTimeout(()=>l(""),Ci.SAVE_STATUS_DISPLAY_DURATION_MS)):l(`\u2717 Error: ${u.error}`),r(!1)},isSaving:n,saveStatus:o}}var Or=J(ee(),1);function xm(){let[e,t]=(0,Or.useState)({}),n=(0,Or.useCallback)(async()=>{try{let o=await(await fetch(Tt.STATS)).json();t(o)}catch(r){console.error("Failed to load stats:",r instanceof Error?r.message:String(r))}},[]);return(0,Or.useEffect)(()=>{n()},[n]),{stats:e,refreshStats:n}}var Tn=J(ee(),1);function Eu(e,t,n,r){let[o,l]=(0,Tn.useState)({isLoading:!1,hasMore:!0}),i=(0,Tn.useRef)(0),s=(0,Tn.useRef)(`${r}::${n}`),a=(0,Tn.useRef)(o),u=(0,Tn.useCallback)(async()=>{let g=`${r}::${n}`,h=s.current!==g;if(h){i.current=0,s.current=g;let A={isLoading:!1,hasMore:!0};l(A),a.current=A}if(!h&&(a.current.isLoading||!a.current.hasMore))return[];a.current={...a.current,isLoading:!0},l(A=>({...A,isLoading:!0}));let v=new URLSearchParams({offset:i.current.toString(),limit:xo.PAGINATION_PAGE_SIZE.toString()});n&&v.append("project",n),r&&r!=="all"&&v.append("platformSource",r);let E=await fetch(`${e}?${v}`);if(!E.ok)throw new Error(`Failed to load ${t}: ${E.statusText}`);let _=await E.json(),k={...a.current,isLoading:!1,hasMore:_.hasMore};return a.current=k,l(A=>({...A,isLoading:!1,hasMore:_.hasMore})),i.current+=xo.PAGINATION_PAGE_SIZE,_.items},[n,r,e,t]);return{...o,loadMore:u}}function Om(e,t){let n=Eu(Tt.OBSERVATIONS,"observations",e,t),r=Eu(Tt.SUMMARIES,"summaries",e,t),o=Eu(Tt.PROMPTS,"prompts",e,t);return{observations:n,summaries:r,prompts:o}}var Dr=J(ee(),1),Im="claude-mem-theme";function T0(){return typeof window>"u"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function Dm(){try{let e=localStorage.getItem(Im);if(e==="system"||e==="light"||e==="dark")return e}catch(e){console.warn("Failed to read theme preference from localStorage:",e instanceof Error?e.message:String(e))}return"system"}function Pm(e){return e==="system"?T0():e}function Um(){let[e,t]=(0,Dr.useState)(Dm),[n,r]=(0,Dr.useState)(()=>Pm(Dm()));return(0,Dr.useEffect)(()=>{let l=Pm(e);r(l),document.documentElement.setAttribute("data-theme",l)},[e]),(0,Dr.useEffect)(()=>{if(e!=="system")return;let l=window.matchMedia("(prefers-color-scheme: dark)"),i=s=>{let a=s.matches?"dark":"light";r(a),document.documentElement.setAttribute("data-theme",a)};return l.addEventListener("change",i),()=>l.removeEventListener("change",i)},[e]),{preference:e,resolvedTheme:n,setThemePreference:l=>{try{localStorage.setItem(Im,l),t(l)}catch(i){console.warn("Failed to save theme preference to localStorage:",i instanceof Error?i.message:String(i)),t(l)}}}}function ki(e,t){let n=new Set;return[...e,...t].filter(r=>n.has(r.id)?!1:(n.add(r.id),!0))}function Rm(){let[e,t]=(0,B.useState)(""),[n,r]=(0,B.useState)("all"),[o,l]=(0,B.useState)(!1),[i,s]=(0,B.useState)(!1),[a,u]=(0,B.useState)([]),[g,h]=(0,B.useState)([]),[v,E]=(0,B.useState)([]),{observations:_,summaries:k,prompts:A,projects:f,sources:c,projectsBySource:m,isProcessing:d,queueDepth:w,isConnected:L}=Mm(),{settings:x,saveSettings:D,isSaving:G,saveStatus:U}=Am(),{stats:W,refreshStats:rt}=xm(),{preference:Cn,resolvedTheme:Wn,setThemePreference:Pr}=Um(),ke=Om(e,n),kn=(0,B.useMemo)(()=>n==="all"?f:m[n]||[],[n,f,m]),He=(0,B.useCallback)(I=>{let ue=!e||I.project===e,ot=n==="all"||(I.platform_source||"claude")===n;return ue&&ot},[e,n]);(0,B.useEffect)(()=>{e&&!kn.includes(e)&&t("")},[kn,e]);let Ir=(0,B.useMemo)(()=>{let I=_.filter(He),ue=a.filter(He);return ki(I,ue)},[_,a,He]),Vn=(0,B.useMemo)(()=>{let I=k.filter(He),ue=g.filter(He);return ki(I,ue)},[k,g,He]),S=(0,B.useMemo)(()=>{let I=A.filter(He),ue=v.filter(He);return ki(I,ue)},[A,v,He]),Q=(0,B.useCallback)(()=>{l(I=>!I)},[]),R=(0,B.useCallback)(()=>{s(I=>!I)},[]),he=(0,B.useCallback)(async()=>{try{let[I,ue,ot]=await Promise.all([ke.observations.loadMore(),ke.summaries.loadMore(),ke.prompts.loadMore()]);I.length>0&&u(lt=>[...lt,...I]),ue.length>0&&h(lt=>[...lt,...ue]),ot.length>0&&E(lt=>[...lt,...ot])}catch(I){console.error("Failed to load more data:",I)}},[ke.observations,ke.summaries,ke.prompts]);return(0,B.useEffect)(()=>{u([]),h([]),E([]),he()},[e,n]),B.default.createElement(B.default.Fragment,null,B.default.createElement(Mp,{isConnected:L,projects:kn,sources:c,currentFilter:e,currentSource:n,onFilterChange:t,onSourceChange:r,isProcessing:d,queueDepth:w,themePreference:Cn,onThemeChange:Pr,onContextPreviewToggle:Q}),B.default.createElement(Ip,{observations:Ir,summaries:Vn,prompts:S,onLoadMore:he,isLoading:ke.observations.isLoading||ke.summaries.isLoading||ke.prompts.isLoading,hasMore:ke.observations.hasMore||ke.summaries.hasMore||ke.prompts.hasMore}),B.default.createElement(Lm,{isOpen:o,onClose:Q,settings:x,onSave:D,isSaving:G,saveStatus:U}),B.default.createElement("button",{className:"console-toggle-btn",onClick:R,title:"Toggle Console"},B.default.createElement("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},B.default.createElement("polyline",{points:"4 17 10 11 4 5"}),B.default.createElement("line",{x1:"12",y1:"19",x2:"20",y2:"19"}))),B.default.createElement(Nm,{isOpen:i,onClose:R}))}var Kt=J(ee(),1),Li=class extends Kt.Component{constructor(t){super(t),this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,n){console.error("[ErrorBoundary] Caught error:",t,n),this.setState({error:t,errorInfo:n})}render(){return this.state.hasError?Kt.default.createElement("div",{style:{padding:"20px",color:"#ff6b6b",backgroundColor:"#1a1a1a",minHeight:"100vh"}},Kt.default.createElement("h1",{style:{fontSize:"24px",marginBottom:"10px"}},"Something went wrong"),Kt.default.createElement("p",{style:{marginBottom:"10px",color:"#8b949e"}},"The application encountered an error. Please refresh the page to try again."),this.state.error&&Kt.default.createElement("details",{style:{marginTop:"20px",color:"#8b949e"}},Kt.default.createElement("summary",{style:{cursor:"pointer",marginBottom:"10px"}},"Error details"),Kt.default.createElement("pre",{style:{backgroundColor:"#0d1117",padding:"10px",borderRadius:"6px",overflow:"auto"}},this.state.error.toString(),this.state.errorInfo&&` +`+l.stack}return{value:e,source:t,stack:o,digest:null}}function vs(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function Js(e,t){try{console.error(t.value)}catch(n){setTimeout(function(){throw n})}}var Gh=typeof WeakMap=="function"?WeakMap:Map;function Vd(e,t,n){n=Wt(-1,n),n.tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Yl||(Yl=!0,ua=r),Js(e,t)},n}function Gd(e,t,n){n=Wt(-1,n),n.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r=="function"){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){Js(e,t)}}var l=e.stateNode;return l!==null&&typeof l.componentDidCatch=="function"&&(n.callback=function(){Js(e,t),typeof r!="function"&&(fn===null?fn=new Set([this]):fn.add(this));var i=t.stack;this.componentDidCatch(t.value,{componentStack:i!==null?i:""})}),n}function nf(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Gh;var o=new Set;r.set(t,o)}else o=r.get(t),o===void 0&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=iv.bind(null,e,t,n),t.then(e,e))}function rf(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function of(e,t,n,r,o){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,n.tag===1&&(n.alternate===null?n.tag=17:(t=Wt(-1,1),t.tag=2,cn(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=o,e)}var $h=Kt.ReactCurrentOwner,qe=!1;function Ie(e,t,n,r){t.child=e===null?_d(t,null,n,r):Tr(t,e.child,n,r)}function lf(e,t,n,r,o){n=n.render;var l=t.ref;return yr(t,o),r=ja(e,t,n,r,l,o),n=Ba(),e!==null&&!qe?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Xt(e,t,o)):(te&&n&&Ma(t),t.flags|=1,Ie(e,t,r,o),t.child)}function sf(e,t,n,r,o){if(e===null){var l=n.type;return typeof l=="function"&&!Za(l)&&l.defaultProps===void 0&&n.compare===null&&n.defaultProps===void 0?(t.tag=15,t.type=l,$d(e,t,l,r,o)):(e=Ml(n.type,null,r,t,t.mode,o),e.ref=t.ref,e.return=t,t.child=e)}if(l=e.child,(e.lanes&o)===0){var i=l.memoizedProps;if(n=n.compare,n=n!==null?n:vo,n(i,r)&&e.ref===t.ref)return Xt(e,t,o)}return t.flags|=1,e=pn(l,r),e.ref=t.ref,e.return=t,t.child=e}function $d(e,t,n,r,o){if(e!==null){var l=e.memoizedProps;if(vo(l,r)&&e.ref===t.ref)if(qe=!1,t.pendingProps=r=l,(e.lanes&o)!==0)(e.flags&131072)!==0&&(qe=!0);else return t.lanes=e.lanes,Xt(e,t,o)}return ea(e,t,n,r,o)}function Xd(e,t,n){var r=t.pendingProps,o=r.children,l=e!==null?e.memoizedState:null;if(r.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},X(pr,Ke),Ke|=n;else{if((n&1073741824)===0)return e=l!==null?l.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,X(pr,Ke),Ke|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=l!==null?l.baseLanes:n,X(pr,Ke),Ke|=r}else l!==null?(r=l.baseLanes|n,t.memoizedState=null):r=n,X(pr,Ke),Ke|=r;return Ie(e,t,o,n),t.child}function Kd(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function ea(e,t,n,r,o){var l=Ve(n)?Fn:De.current;return l=_r(t,l),yr(t,o),n=ja(e,t,n,r,l,o),r=Ba(),e!==null&&!qe?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Xt(e,t,o)):(te&&r&&Ma(t),t.flags|=1,Ie(e,t,n,o),t.child)}function af(e,t,n,r,o){if(Ve(n)){var l=!0;Hl(t)}else l=!1;if(yr(t,o),t.stateNode===null)Ll(e,t),Wd(t,n,r),Zs(t,n,r,o),r=!0;else if(e===null){var i=t.stateNode,s=t.memoizedProps;i.props=s;var a=i.context,u=n.contextType;typeof u=="object"&&u!==null?u=dt(u):(u=Ve(n)?Fn:De.current,u=_r(t,u));var g=n.getDerivedStateFromProps,h=typeof g=="function"||typeof i.getSnapshotBeforeUpdate=="function";h||typeof i.UNSAFE_componentWillReceiveProps!="function"&&typeof i.componentWillReceiveProps!="function"||(s!==r||a!==u)&&tf(t,i,r,u),en=!1;var v=t.memoizedState;i.state=v,Vl(t,r,i,o),a=t.memoizedState,s!==r||v!==a||We.current||en?(typeof g=="function"&&(Qs(t,n,g,r),a=t.memoizedState),(s=en||ef(t,n,s,r,v,a,u))?(h||typeof i.UNSAFE_componentWillMount!="function"&&typeof i.componentWillMount!="function"||(typeof i.componentWillMount=="function"&&i.componentWillMount(),typeof i.UNSAFE_componentWillMount=="function"&&i.UNSAFE_componentWillMount()),typeof i.componentDidMount=="function"&&(t.flags|=4194308)):(typeof i.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=a),i.props=r,i.state=a,i.context=u,r=s):(typeof i.componentDidMount=="function"&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Td(e,t),s=t.memoizedProps,u=t.type===t.elementType?s:vt(t.type,s),i.props=u,h=t.pendingProps,v=i.context,a=n.contextType,typeof a=="object"&&a!==null?a=dt(a):(a=Ve(n)?Fn:De.current,a=_r(t,a));var E=n.getDerivedStateFromProps;(g=typeof E=="function"||typeof i.getSnapshotBeforeUpdate=="function")||typeof i.UNSAFE_componentWillReceiveProps!="function"&&typeof i.componentWillReceiveProps!="function"||(s!==h||v!==a)&&tf(t,i,r,a),en=!1,v=t.memoizedState,i.state=v,Vl(t,r,i,o);var _=t.memoizedState;s!==h||v!==_||We.current||en?(typeof E=="function"&&(Qs(t,n,E,r),_=t.memoizedState),(u=en||ef(t,n,u,r,v,_,a)||!1)?(g||typeof i.UNSAFE_componentWillUpdate!="function"&&typeof i.componentWillUpdate!="function"||(typeof i.componentWillUpdate=="function"&&i.componentWillUpdate(r,_,a),typeof i.UNSAFE_componentWillUpdate=="function"&&i.UNSAFE_componentWillUpdate(r,_,a)),typeof i.componentDidUpdate=="function"&&(t.flags|=4),typeof i.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof i.componentDidUpdate!="function"||s===e.memoizedProps&&v===e.memoizedState||(t.flags|=4),typeof i.getSnapshotBeforeUpdate!="function"||s===e.memoizedProps&&v===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=_),i.props=r,i.state=_,i.context=a,r=u):(typeof i.componentDidUpdate!="function"||s===e.memoizedProps&&v===e.memoizedState||(t.flags|=4),typeof i.getSnapshotBeforeUpdate!="function"||s===e.memoizedProps&&v===e.memoizedState||(t.flags|=1024),r=!1)}return ta(e,t,n,r,l,o)}function ta(e,t,n,r,o,l){Kd(e,t);var i=(t.flags&128)!==0;if(!r&&!i)return o&&Gc(t,n,!1),Xt(e,t,l);r=t.stateNode,$h.current=t;var s=i&&typeof n.getDerivedStateFromError!="function"?null:r.render();return t.flags|=1,e!==null&&i?(t.child=Tr(t,e.child,null,l),t.child=Tr(t,null,s,l)):Ie(e,t,s,l),t.memoizedState=r.state,o&&Gc(t,n,!0),t.child}function Yd(e){var t=e.stateNode;t.pendingContext?Vc(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Vc(e,t.context,!1),Fa(e,t.containerInfo)}function uf(e,t,n,r,o){return wr(),Oa(o),t.flags|=256,Ie(e,t,n,r),t.child}var na={dehydrated:null,treeContext:null,retryLane:0};function ra(e){return{baseLanes:e,cachePool:null,transitions:null}}function Qd(e,t,n){var r=t.pendingProps,o=ne.current,l=!1,i=(t.flags&128)!==0,s;if((s=i)||(s=e!==null&&e.memoizedState===null?!1:(o&2)!==0),s?(l=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(o|=1),X(ne,o&1),e===null)return Ks(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data==="$!"?t.lanes=8:t.lanes=1073741824,null):(i=r.children,e=r.fallback,l?(r=t.mode,l=t.child,i={mode:"hidden",children:i},(r&1)===0&&l!==null?(l.childLanes=0,l.pendingProps=i):l=ci(i,r,0,null),e=Rn(e,r,n,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=ra(n),t.memoizedState=na,e):Va(t,i));if(o=e.memoizedState,o!==null&&(s=o.dehydrated,s!==null))return Xh(e,t,i,r,s,o,n);if(l){l=r.fallback,i=t.mode,o=e.child,s=o.sibling;var a={mode:"hidden",children:r.children};return(i&1)===0&&t.child!==o?(r=t.child,r.childLanes=0,r.pendingProps=a,t.deletions=null):(r=pn(o,a),r.subtreeFlags=o.subtreeFlags&14680064),s!==null?l=pn(s,l):(l=Rn(l,i,n,null),l.flags|=2),l.return=t,r.return=t,r.sibling=l,t.child=r,r=l,l=t.child,i=e.child.memoizedState,i=i===null?ra(n):{baseLanes:i.baseLanes|n,cachePool:null,transitions:i.transitions},l.memoizedState=i,l.childLanes=e.childLanes&~n,t.memoizedState=na,r}return l=e.child,e=l.sibling,r=pn(l,{mode:"visible",children:r.children}),(t.mode&1)===0&&(r.lanes=n),r.return=t,r.sibling=null,e!==null&&(n=t.deletions,n===null?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=r,t.memoizedState=null,r}function Va(e,t){return t=ci({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function vl(e,t,n,r){return r!==null&&Oa(r),Tr(t,e.child,null,n),e=Va(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function Xh(e,t,n,r,o,l,i){if(n)return t.flags&256?(t.flags&=-257,r=vs(Error(T(422))),vl(e,t,i,r)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(l=r.fallback,o=t.mode,r=ci({mode:"visible",children:r.children},o,0,null),l=Rn(l,o,i,null),l.flags|=2,r.return=t,l.return=t,r.sibling=l,t.child=r,(t.mode&1)!==0&&Tr(t,e.child,null,i),t.child.memoizedState=ra(i),t.memoizedState=na,l);if((t.mode&1)===0)return vl(e,t,i,null);if(o.data==="$!"){if(r=o.nextSibling&&o.nextSibling.dataset,r)var s=r.dgst;return r=s,l=Error(T(419)),r=vs(l,r,void 0),vl(e,t,i,r)}if(s=(i&e.childLanes)!==0,qe||s){if(r=ye,r!==null){switch(i&-i){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}o=(o&(r.suspendedLanes|i))!==0?0:o,o!==0&&o!==l.retryLane&&(l.retryLane=o,$t(e,o),_t(r,e,o,-1))}return Qa(),r=vs(Error(T(421))),vl(e,t,i,r)}return o.data==="$?"?(t.flags|=128,t.child=e.child,t=sv.bind(null,e),o._reactRetry=t,null):(e=l.treeContext,Ye=un(o.nextSibling),Qe=t,te=!0,Et=null,e!==null&&(at[ut++]=Bt,at[ut++]=qt,at[ut++]=bn,Bt=e.id,qt=e.overflow,bn=t),t=Va(t,r.children),t.flags|=4096,t)}function cf(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),Ys(e.return,t,n)}function ys(e,t,n,r,o){var l=e.memoizedState;l===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(l.isBackwards=t,l.rendering=null,l.renderingStartTime=0,l.last=r,l.tail=n,l.tailMode=o)}function Zd(e,t,n){var r=t.pendingProps,o=r.revealOrder,l=r.tail;if(Ie(e,t,r.children,n),r=ne.current,(r&2)!==0)r=r&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&cf(e,n,t);else if(e.tag===19)cf(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(X(ne,r),(t.mode&1)===0)t.memoizedState=null;else switch(o){case"forwards":for(n=t.child,o=null;n!==null;)e=n.alternate,e!==null&&Gl(e)===null&&(o=n),n=n.sibling;n=o,n===null?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),ys(t,!1,o,n,l);break;case"backwards":for(n=null,o=t.child,t.child=null;o!==null;){if(e=o.alternate,e!==null&&Gl(e)===null){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}ys(t,!0,n,null,l);break;case"together":ys(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Ll(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Xt(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),Hn|=t.lanes,(n&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(T(153));if(t.child!==null){for(e=t.child,n=pn(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=pn(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function Kh(e,t,n){switch(t.tag){case 3:Yd(t),wr();break;case 5:Cd(t);break;case 1:Ve(t.type)&&Hl(t);break;case 4:Fa(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;X(ql,r._currentValue),r._currentValue=o;break;case 13:if(r=t.memoizedState,r!==null)return r.dehydrated!==null?(X(ne,ne.current&1),t.flags|=128,null):(n&t.child.childLanes)!==0?Qd(e,t,n):(X(ne,ne.current&1),e=Xt(e,t,n),e!==null?e.sibling:null);X(ne,ne.current&1);break;case 19:if(r=(n&t.childLanes)!==0,(e.flags&128)!==0){if(r)return Zd(e,t,n);t.flags|=128}if(o=t.memoizedState,o!==null&&(o.rendering=null,o.tail=null,o.lastEffect=null),X(ne,ne.current),r)break;return null;case 22:case 23:return t.lanes=0,Xd(e,t,n)}return Xt(e,t,n)}var Jd,oa,ep,tp;Jd=function(e,t){for(var n=t.child;n!==null;){if(n.tag===5||n.tag===6)e.appendChild(n.stateNode);else if(n.tag!==4&&n.child!==null){n.child.return=n,n=n.child;continue}if(n===t)break;for(;n.sibling===null;){if(n.return===null||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}};oa=function(){};ep=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,In(Dt.current);var l=null;switch(n){case"input":o=Ls(e,o),r=Ls(e,r),l=[];break;case"select":o=oe({},o,{value:void 0}),r=oe({},r,{value:void 0}),l=[];break;case"textarea":o=Ms(e,o),r=Ms(e,r),l=[];break;default:typeof o.onClick!="function"&&typeof r.onClick=="function"&&(e.onclick=bl)}Os(n,r);var i;n=null;for(u in o)if(!r.hasOwnProperty(u)&&o.hasOwnProperty(u)&&o[u]!=null)if(u==="style"){var s=o[u];for(i in s)s.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else u!=="dangerouslySetInnerHTML"&&u!=="children"&&u!=="suppressContentEditableWarning"&&u!=="suppressHydrationWarning"&&u!=="autoFocus"&&(uo.hasOwnProperty(u)?l||(l=[]):(l=l||[]).push(u,null));for(u in r){var a=r[u];if(s=o?.[u],r.hasOwnProperty(u)&&a!==s&&(a!=null||s!=null))if(u==="style")if(s){for(i in s)!s.hasOwnProperty(i)||a&&a.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in a)a.hasOwnProperty(i)&&s[i]!==a[i]&&(n||(n={}),n[i]=a[i])}else n||(l||(l=[]),l.push(u,n)),n=a;else u==="dangerouslySetInnerHTML"?(a=a?a.__html:void 0,s=s?s.__html:void 0,a!=null&&s!==a&&(l=l||[]).push(u,a)):u==="children"?typeof a!="string"&&typeof a!="number"||(l=l||[]).push(u,""+a):u!=="suppressContentEditableWarning"&&u!=="suppressHydrationWarning"&&(uo.hasOwnProperty(u)?(a!=null&&u==="onScroll"&&K("scroll",e),l||s===a||(l=[])):(l=l||[]).push(u,a))}n&&(l=l||[]).push("style",n);var u=l;(t.updateQueue=u)&&(t.flags|=4)}};tp=function(e,t,n,r){n!==r&&(t.flags|=4)};function $r(e,t){if(!te)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;n!==null;)n.alternate!==null&&(r=n),n=n.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function xe(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;o!==null;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags&14680064,r|=o.flags&14680064,o.return=e,o=o.sibling;else for(o=e.child;o!==null;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Yh(e,t,n){var r=t.pendingProps;switch(xa(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return xe(t),null;case 1:return Ve(t.type)&&zl(),xe(t),null;case 3:return r=t.stateNode,Cr(),Y(We),Y(De),za(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(e===null||e.child===null)&&(gl(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Et!==null&&(da(Et),Et=null))),oa(e,t),xe(t),null;case 5:ba(t);var o=In(wo.current);if(n=t.type,e!==null&&t.stateNode!=null)ep(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(t.stateNode===null)throw Error(T(166));return xe(t),null}if(e=In(Dt.current),gl(t)){r=t.stateNode,n=t.type;var l=t.memoizedProps;switch(r[xt]=t,r[So]=l,e=(t.mode&1)!==0,n){case"dialog":K("cancel",r),K("close",r);break;case"iframe":case"object":case"embed":K("load",r);break;case"video":case"audio":for(o=0;o<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n==="select"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[xt]=t,e[So]=r,Jd(e,t,!1,!1),t.stateNode=e;e:{switch(i=Ds(n,r),n){case"dialog":K("cancel",e),K("close",e),o=r;break;case"iframe":case"object":case"embed":K("load",e),o=r;break;case"video":case"audio":for(o=0;oLr&&(t.flags|=128,r=!0,$r(l,!1),t.lanes=4194304)}else{if(!r)if(e=Gl(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),$r(l,!0),l.tail===null&&l.tailMode==="hidden"&&!i.alternate&&!te)return xe(t),null}else 2*se()-l.renderingStartTime>Lr&&n!==1073741824&&(t.flags|=128,r=!0,$r(l,!1),t.lanes=4194304);l.isBackwards?(i.sibling=t.child,t.child=i):(n=l.last,n!==null?n.sibling=i:t.child=i,l.last=i)}return l.tail!==null?(t=l.tail,l.rendering=t,l.tail=t.sibling,l.renderingStartTime=se(),t.sibling=null,n=ne.current,X(ne,r?n&1|2:n&1),t):(xe(t),null);case 22:case 23:return Ya(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(Ke&1073741824)!==0&&(xe(t),t.subtreeFlags&6&&(t.flags|=8192)):xe(t),null;case 24:return null;case 25:return null}throw Error(T(156,t.tag))}function Qh(e,t){switch(xa(t),t.tag){case 1:return Ve(t.type)&&zl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Cr(),Y(We),Y(De),za(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return ba(t),null;case 13:if(Y(ne),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(T(340));wr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Y(ne),null;case 4:return Cr(),null;case 10:return Ia(t.type._context),null;case 22:case 23:return Ya(),null;case 24:return null;default:return null}}var yl=!1,Oe=!1,Zh=typeof WeakSet=="function"?WeakSet:Set,A=null;function dr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){ie(e,t,r)}else n.current=null}function la(e,t,n){try{n()}catch(r){ie(e,t,r)}}var ff=!1;function Jh(e,t){if(Bs=Ul,e=id(),Aa(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var o=r.anchorOffset,l=r.focusNode;r=r.focusOffset;try{n.nodeType,l.nodeType}catch{n=null;break e}var i=0,s=-1,a=-1,u=0,g=0,h=e,v=null;t:for(;;){for(var E;h!==n||o!==0&&h.nodeType!==3||(s=i+o),h!==l||r!==0&&h.nodeType!==3||(a=i+r),h.nodeType===3&&(i+=h.nodeValue.length),(E=h.firstChild)!==null;)v=h,h=E;for(;;){if(h===e)break t;if(v===n&&++u===o&&(s=i),v===l&&++g===r&&(a=i),(E=h.nextSibling)!==null)break;h=v,v=h.parentNode}h=E}n=s===-1||a===-1?null:{start:s,end:a}}else n=null}n=n||{start:0,end:0}}else n=null;for(qs={focusedElem:e,selectionRange:n},Ul=!1,A=t;A!==null;)if(t=A,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,A=e;else for(;A!==null;){t=A;try{var _=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(_!==null){var k=_.memoizedProps,M=_.memoizedState,f=t.stateNode,c=f.getSnapshotBeforeUpdate(t.elementType===t.type?k:vt(t.type,k),M);f.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var m=t.stateNode.containerInfo;m.nodeType===1?m.textContent="":m.nodeType===9&&m.documentElement&&m.removeChild(m.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(T(163))}}catch(d){ie(t,t.return,d)}if(e=t.sibling,e!==null){e.return=t.return,A=e;break}A=t.return}return _=ff,ff=!1,_}function io(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var o=r=r.next;do{if((o.tag&e)===e){var l=o.destroy;o.destroy=void 0,l!==void 0&&la(t,n,l)}o=o.next}while(o!==r)}}function ai(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ia(e){var t=e.ref;if(t!==null){var n=e.stateNode;e.tag,e=n,typeof t=="function"?t(e):t.current=e}}function np(e){var t=e.alternate;t!==null&&(e.alternate=null,np(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[xt],delete t[So],delete t[Gs],delete t[Uh],delete t[Rh])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function rp(e){return e.tag===5||e.tag===3||e.tag===4}function df(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||rp(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function sa(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=bl));else if(r!==4&&(e=e.child,e!==null))for(sa(e,t,n),e=e.sibling;e!==null;)sa(e,t,n),e=e.sibling}function aa(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(aa(e,t,n),e=e.sibling;e!==null;)aa(e,t,n),e=e.sibling}var we=null,yt=!1;function Zt(e,t,n){for(n=n.child;n!==null;)op(e,t,n),n=n.sibling}function op(e,t,n){if(Ot&&typeof Ot.onCommitFiberUnmount=="function")try{Ot.onCommitFiberUnmount(ei,n)}catch{}switch(n.tag){case 5:Oe||dr(n,t);case 6:var r=we,o=yt;we=null,Zt(e,t,n),we=r,yt=o,we!==null&&(yt?(e=we,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):we.removeChild(n.stateNode));break;case 18:we!==null&&(yt?(e=we,n=n.stateNode,e.nodeType===8?fs(e.parentNode,n):e.nodeType===1&&fs(e,n),go(e)):fs(we,n.stateNode));break;case 4:r=we,o=yt,we=n.stateNode.containerInfo,yt=!0,Zt(e,t,n),we=r,yt=o;break;case 0:case 11:case 14:case 15:if(!Oe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){o=r=r.next;do{var l=o,i=l.destroy;l=l.tag,i!==void 0&&((l&2)!==0||(l&4)!==0)&&la(n,t,i),o=o.next}while(o!==r)}Zt(e,t,n);break;case 1:if(!Oe&&(dr(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){ie(n,t,s)}Zt(e,t,n);break;case 21:Zt(e,t,n);break;case 22:n.mode&1?(Oe=(r=Oe)||n.memoizedState!==null,Zt(e,t,n),Oe=r):Zt(e,t,n);break;default:Zt(e,t,n)}}function pf(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Zh),t.forEach(function(r){var o=av.bind(null,e,r);n.has(r)||(n.add(r),r.then(o,o))})}}function ht(e,t){var n=t.deletions;if(n!==null)for(var r=0;ro&&(o=i),r&=~l}if(r=o,r=se()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*tv(r/1960))-r,10e?16:e,on===null)var r=!1;else{if(e=on,on=null,Ql=0,(j&6)!==0)throw Error(T(331));var o=j;for(j|=4,A=e.current;A!==null;){var l=A,i=l.child;if((A.flags&16)!==0){var s=l.deletions;if(s!==null){for(var a=0;ase()-Xa?Un(e,0):$a|=n),Ge(e,t)}function dp(e,t){t===0&&((e.mode&1)===0?t=1:(t=ll,ll<<=1,(ll&130023424)===0&&(ll=4194304)));var n=Ue();e=$t(e,t),e!==null&&(No(e,t,n),Ge(e,n))}function sv(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),dp(e,n)}function av(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;o!==null&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(T(314))}r!==null&&r.delete(t),dp(e,n)}var pp;pp=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||We.current)qe=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return qe=!1,Kh(e,t,n);qe=(e.flags&131072)!==0}else qe=!1,te&&(t.flags&1048576)!==0&&vd(t,Bl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Ll(e,t),e=t.pendingProps;var o=_r(t,De.current);yr(t,n),o=ja(null,t,r,e,o,n);var l=Ba();return t.flags|=1,typeof o=="object"&&o!==null&&typeof o.render=="function"&&o.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Ve(r)?(l=!0,Hl(t)):l=!1,t.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,Ra(t),o.updater=si,t.stateNode=o,o._reactInternals=t,Zs(t,r,e,n),t=ta(null,t,r,!0,l,n)):(t.tag=0,te&&l&&Ma(t),Ie(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Ll(e,t),e=t.pendingProps,o=r._init,r=o(r._payload),t.type=r,o=t.tag=cv(r),e=vt(r,e),o){case 0:t=ea(null,t,r,e,n);break e;case 1:t=af(null,t,r,e,n);break e;case 11:t=lf(null,t,r,e,n);break e;case 14:t=sf(null,t,r,vt(r.type,e),n);break e}throw Error(T(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:vt(r,o),ea(e,t,r,o,n);case 1:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:vt(r,o),af(e,t,r,o,n);case 3:e:{if(Yd(t),e===null)throw Error(T(387));r=t.pendingProps,l=t.memoizedState,o=l.element,Td(e,t),Vl(t,r,null,n);var i=t.memoizedState;if(r=i.element,l.isDehydrated)if(l={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=l,t.memoizedState=l,t.flags&256){o=kr(Error(T(423)),t),t=uf(e,t,r,n,o);break e}else if(r!==o){o=kr(Error(T(424)),t),t=uf(e,t,r,n,o);break e}else for(Ye=un(t.stateNode.containerInfo.firstChild),Qe=t,te=!0,Et=null,n=_d(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(wr(),r===o){t=Xt(e,t,n);break e}Ie(e,t,r,n)}t=t.child}return t;case 5:return Cd(t),e===null&&Ks(t),r=t.type,o=t.pendingProps,l=e!==null?e.memoizedProps:null,i=o.children,Ws(r,o)?i=null:l!==null&&Ws(r,l)&&(t.flags|=32),Kd(e,t),Ie(e,t,i,n),t.child;case 6:return e===null&&Ks(t),null;case 13:return Qd(e,t,n);case 4:return Fa(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=Tr(t,null,r,n):Ie(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:vt(r,o),lf(e,t,r,o,n);case 7:return Ie(e,t,t.pendingProps,n),t.child;case 8:return Ie(e,t,t.pendingProps.children,n),t.child;case 12:return Ie(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,l=t.memoizedProps,i=o.value,X(ql,r._currentValue),r._currentValue=i,l!==null)if(wt(l.value,i)){if(l.children===o.children&&!We.current){t=Xt(e,t,n);break e}}else for(l=t.child,l!==null&&(l.return=t);l!==null;){var s=l.dependencies;if(s!==null){i=l.child;for(var a=s.firstContext;a!==null;){if(a.context===r){if(l.tag===1){a=Wt(-1,n&-n),a.tag=2;var u=l.updateQueue;if(u!==null){u=u.shared;var g=u.pending;g===null?a.next=a:(a.next=g.next,g.next=a),u.pending=a}}l.lanes|=n,a=l.alternate,a!==null&&(a.lanes|=n),Ys(l.return,n,t),s.lanes|=n;break}a=a.next}}else if(l.tag===10)i=l.type===t.type?null:l.child;else if(l.tag===18){if(i=l.return,i===null)throw Error(T(341));i.lanes|=n,s=i.alternate,s!==null&&(s.lanes|=n),Ys(i,n,t),i=l.sibling}else i=l.child;if(i!==null)i.return=l;else for(i=l;i!==null;){if(i===t){i=null;break}if(l=i.sibling,l!==null){l.return=i.return,i=l;break}i=i.return}l=i}Ie(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,yr(t,n),o=dt(o),r=r(o),t.flags|=1,Ie(e,t,r,n),t.child;case 14:return r=t.type,o=vt(r,t.pendingProps),o=vt(r.type,o),sf(e,t,r,o,n);case 15:return $d(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:vt(r,o),Ll(e,t),t.tag=1,Ve(r)?(e=!0,Hl(t)):e=!1,yr(t,n),Wd(t,r,o),Zs(t,r,o,n),ta(null,t,r,!0,e,n);case 19:return Zd(e,t,n);case 22:return Xd(e,t,n)}throw Error(T(156,t.tag))};function mp(e,t){return jf(e,t)}function uv(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ct(e,t,n,r){return new uv(e,t,n,r)}function Za(e){return e=e.prototype,!(!e||!e.isReactComponent)}function cv(e){if(typeof e=="function")return Za(e)?1:0;if(e!=null){if(e=e.$$typeof,e===va)return 11;if(e===ya)return 14}return 2}function pn(e,t){var n=e.alternate;return n===null?(n=ct(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Ml(e,t,n,r,o,l){var i=2;if(r=e,typeof e=="function")Za(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case rr:return Rn(n.children,o,l,t);case ha:i=8,o|=8;break;case ws:return e=ct(12,n,t,o|2),e.elementType=ws,e.lanes=l,e;case Ts:return e=ct(13,n,t,o),e.elementType=Ts,e.lanes=l,e;case Cs:return e=ct(19,n,t,o),e.elementType=Cs,e.lanes=l,e;case Cf:return ci(n,o,l,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case wf:i=10;break e;case Tf:i=9;break e;case va:i=11;break e;case ya:i=14;break e;case Jt:i=16,r=null;break e}throw Error(T(130,e==null?e:typeof e,""))}return t=ct(i,n,t,o),t.elementType=e,t.type=r,t.lanes=l,t}function Rn(e,t,n,r){return e=ct(7,e,r,t),e.lanes=n,e}function ci(e,t,n,r){return e=ct(22,e,r,t),e.elementType=Cf,e.lanes=n,e.stateNode={isHidden:!1},e}function Es(e,t,n){return e=ct(6,e,null,t),e.lanes=n,e}function Ss(e,t,n){return t=ct(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function fv(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=rs(0),this.expirationTimes=rs(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=rs(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Ja(e,t,n,r,o,l,i,s,a){return e=new fv(e,t,n,s,a),t===1?(t=1,l===!0&&(t|=8)):t=0,l=ct(3,null,null,t),e.current=l,l.stateNode=e,l.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ra(l),e}function dv(e,t,n){var r=3{"use strict";function Ep(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Ep)}catch(e){console.error(e)}}Ep(),Sp.exports=yp()});var Tp=Ne(ru=>{"use strict";var wp=_p();ru.createRoot=wp.createRoot,ru.hydrateRoot=wp.hydrateRoot;var P0});var ou=Ne((s1,Ev)=>{Ev.exports={Aacute:"\xC1",aacute:"\xE1",Abreve:"\u0102",abreve:"\u0103",ac:"\u223E",acd:"\u223F",acE:"\u223E\u0333",Acirc:"\xC2",acirc:"\xE2",acute:"\xB4",Acy:"\u0410",acy:"\u0430",AElig:"\xC6",aelig:"\xE6",af:"\u2061",Afr:"\u{1D504}",afr:"\u{1D51E}",Agrave:"\xC0",agrave:"\xE0",alefsym:"\u2135",aleph:"\u2135",Alpha:"\u0391",alpha:"\u03B1",Amacr:"\u0100",amacr:"\u0101",amalg:"\u2A3F",amp:"&",AMP:"&",andand:"\u2A55",And:"\u2A53",and:"\u2227",andd:"\u2A5C",andslope:"\u2A58",andv:"\u2A5A",ang:"\u2220",ange:"\u29A4",angle:"\u2220",angmsdaa:"\u29A8",angmsdab:"\u29A9",angmsdac:"\u29AA",angmsdad:"\u29AB",angmsdae:"\u29AC",angmsdaf:"\u29AD",angmsdag:"\u29AE",angmsdah:"\u29AF",angmsd:"\u2221",angrt:"\u221F",angrtvb:"\u22BE",angrtvbd:"\u299D",angsph:"\u2222",angst:"\xC5",angzarr:"\u237C",Aogon:"\u0104",aogon:"\u0105",Aopf:"\u{1D538}",aopf:"\u{1D552}",apacir:"\u2A6F",ap:"\u2248",apE:"\u2A70",ape:"\u224A",apid:"\u224B",apos:"'",ApplyFunction:"\u2061",approx:"\u2248",approxeq:"\u224A",Aring:"\xC5",aring:"\xE5",Ascr:"\u{1D49C}",ascr:"\u{1D4B6}",Assign:"\u2254",ast:"*",asymp:"\u2248",asympeq:"\u224D",Atilde:"\xC3",atilde:"\xE3",Auml:"\xC4",auml:"\xE4",awconint:"\u2233",awint:"\u2A11",backcong:"\u224C",backepsilon:"\u03F6",backprime:"\u2035",backsim:"\u223D",backsimeq:"\u22CD",Backslash:"\u2216",Barv:"\u2AE7",barvee:"\u22BD",barwed:"\u2305",Barwed:"\u2306",barwedge:"\u2305",bbrk:"\u23B5",bbrktbrk:"\u23B6",bcong:"\u224C",Bcy:"\u0411",bcy:"\u0431",bdquo:"\u201E",becaus:"\u2235",because:"\u2235",Because:"\u2235",bemptyv:"\u29B0",bepsi:"\u03F6",bernou:"\u212C",Bernoullis:"\u212C",Beta:"\u0392",beta:"\u03B2",beth:"\u2136",between:"\u226C",Bfr:"\u{1D505}",bfr:"\u{1D51F}",bigcap:"\u22C2",bigcirc:"\u25EF",bigcup:"\u22C3",bigodot:"\u2A00",bigoplus:"\u2A01",bigotimes:"\u2A02",bigsqcup:"\u2A06",bigstar:"\u2605",bigtriangledown:"\u25BD",bigtriangleup:"\u25B3",biguplus:"\u2A04",bigvee:"\u22C1",bigwedge:"\u22C0",bkarow:"\u290D",blacklozenge:"\u29EB",blacksquare:"\u25AA",blacktriangle:"\u25B4",blacktriangledown:"\u25BE",blacktriangleleft:"\u25C2",blacktriangleright:"\u25B8",blank:"\u2423",blk12:"\u2592",blk14:"\u2591",blk34:"\u2593",block:"\u2588",bne:"=\u20E5",bnequiv:"\u2261\u20E5",bNot:"\u2AED",bnot:"\u2310",Bopf:"\u{1D539}",bopf:"\u{1D553}",bot:"\u22A5",bottom:"\u22A5",bowtie:"\u22C8",boxbox:"\u29C9",boxdl:"\u2510",boxdL:"\u2555",boxDl:"\u2556",boxDL:"\u2557",boxdr:"\u250C",boxdR:"\u2552",boxDr:"\u2553",boxDR:"\u2554",boxh:"\u2500",boxH:"\u2550",boxhd:"\u252C",boxHd:"\u2564",boxhD:"\u2565",boxHD:"\u2566",boxhu:"\u2534",boxHu:"\u2567",boxhU:"\u2568",boxHU:"\u2569",boxminus:"\u229F",boxplus:"\u229E",boxtimes:"\u22A0",boxul:"\u2518",boxuL:"\u255B",boxUl:"\u255C",boxUL:"\u255D",boxur:"\u2514",boxuR:"\u2558",boxUr:"\u2559",boxUR:"\u255A",boxv:"\u2502",boxV:"\u2551",boxvh:"\u253C",boxvH:"\u256A",boxVh:"\u256B",boxVH:"\u256C",boxvl:"\u2524",boxvL:"\u2561",boxVl:"\u2562",boxVL:"\u2563",boxvr:"\u251C",boxvR:"\u255E",boxVr:"\u255F",boxVR:"\u2560",bprime:"\u2035",breve:"\u02D8",Breve:"\u02D8",brvbar:"\xA6",bscr:"\u{1D4B7}",Bscr:"\u212C",bsemi:"\u204F",bsim:"\u223D",bsime:"\u22CD",bsolb:"\u29C5",bsol:"\\",bsolhsub:"\u27C8",bull:"\u2022",bullet:"\u2022",bump:"\u224E",bumpE:"\u2AAE",bumpe:"\u224F",Bumpeq:"\u224E",bumpeq:"\u224F",Cacute:"\u0106",cacute:"\u0107",capand:"\u2A44",capbrcup:"\u2A49",capcap:"\u2A4B",cap:"\u2229",Cap:"\u22D2",capcup:"\u2A47",capdot:"\u2A40",CapitalDifferentialD:"\u2145",caps:"\u2229\uFE00",caret:"\u2041",caron:"\u02C7",Cayleys:"\u212D",ccaps:"\u2A4D",Ccaron:"\u010C",ccaron:"\u010D",Ccedil:"\xC7",ccedil:"\xE7",Ccirc:"\u0108",ccirc:"\u0109",Cconint:"\u2230",ccups:"\u2A4C",ccupssm:"\u2A50",Cdot:"\u010A",cdot:"\u010B",cedil:"\xB8",Cedilla:"\xB8",cemptyv:"\u29B2",cent:"\xA2",centerdot:"\xB7",CenterDot:"\xB7",cfr:"\u{1D520}",Cfr:"\u212D",CHcy:"\u0427",chcy:"\u0447",check:"\u2713",checkmark:"\u2713",Chi:"\u03A7",chi:"\u03C7",circ:"\u02C6",circeq:"\u2257",circlearrowleft:"\u21BA",circlearrowright:"\u21BB",circledast:"\u229B",circledcirc:"\u229A",circleddash:"\u229D",CircleDot:"\u2299",circledR:"\xAE",circledS:"\u24C8",CircleMinus:"\u2296",CirclePlus:"\u2295",CircleTimes:"\u2297",cir:"\u25CB",cirE:"\u29C3",cire:"\u2257",cirfnint:"\u2A10",cirmid:"\u2AEF",cirscir:"\u29C2",ClockwiseContourIntegral:"\u2232",CloseCurlyDoubleQuote:"\u201D",CloseCurlyQuote:"\u2019",clubs:"\u2663",clubsuit:"\u2663",colon:":",Colon:"\u2237",Colone:"\u2A74",colone:"\u2254",coloneq:"\u2254",comma:",",commat:"@",comp:"\u2201",compfn:"\u2218",complement:"\u2201",complexes:"\u2102",cong:"\u2245",congdot:"\u2A6D",Congruent:"\u2261",conint:"\u222E",Conint:"\u222F",ContourIntegral:"\u222E",copf:"\u{1D554}",Copf:"\u2102",coprod:"\u2210",Coproduct:"\u2210",copy:"\xA9",COPY:"\xA9",copysr:"\u2117",CounterClockwiseContourIntegral:"\u2233",crarr:"\u21B5",cross:"\u2717",Cross:"\u2A2F",Cscr:"\u{1D49E}",cscr:"\u{1D4B8}",csub:"\u2ACF",csube:"\u2AD1",csup:"\u2AD0",csupe:"\u2AD2",ctdot:"\u22EF",cudarrl:"\u2938",cudarrr:"\u2935",cuepr:"\u22DE",cuesc:"\u22DF",cularr:"\u21B6",cularrp:"\u293D",cupbrcap:"\u2A48",cupcap:"\u2A46",CupCap:"\u224D",cup:"\u222A",Cup:"\u22D3",cupcup:"\u2A4A",cupdot:"\u228D",cupor:"\u2A45",cups:"\u222A\uFE00",curarr:"\u21B7",curarrm:"\u293C",curlyeqprec:"\u22DE",curlyeqsucc:"\u22DF",curlyvee:"\u22CE",curlywedge:"\u22CF",curren:"\xA4",curvearrowleft:"\u21B6",curvearrowright:"\u21B7",cuvee:"\u22CE",cuwed:"\u22CF",cwconint:"\u2232",cwint:"\u2231",cylcty:"\u232D",dagger:"\u2020",Dagger:"\u2021",daleth:"\u2138",darr:"\u2193",Darr:"\u21A1",dArr:"\u21D3",dash:"\u2010",Dashv:"\u2AE4",dashv:"\u22A3",dbkarow:"\u290F",dblac:"\u02DD",Dcaron:"\u010E",dcaron:"\u010F",Dcy:"\u0414",dcy:"\u0434",ddagger:"\u2021",ddarr:"\u21CA",DD:"\u2145",dd:"\u2146",DDotrahd:"\u2911",ddotseq:"\u2A77",deg:"\xB0",Del:"\u2207",Delta:"\u0394",delta:"\u03B4",demptyv:"\u29B1",dfisht:"\u297F",Dfr:"\u{1D507}",dfr:"\u{1D521}",dHar:"\u2965",dharl:"\u21C3",dharr:"\u21C2",DiacriticalAcute:"\xB4",DiacriticalDot:"\u02D9",DiacriticalDoubleAcute:"\u02DD",DiacriticalGrave:"`",DiacriticalTilde:"\u02DC",diam:"\u22C4",diamond:"\u22C4",Diamond:"\u22C4",diamondsuit:"\u2666",diams:"\u2666",die:"\xA8",DifferentialD:"\u2146",digamma:"\u03DD",disin:"\u22F2",div:"\xF7",divide:"\xF7",divideontimes:"\u22C7",divonx:"\u22C7",DJcy:"\u0402",djcy:"\u0452",dlcorn:"\u231E",dlcrop:"\u230D",dollar:"$",Dopf:"\u{1D53B}",dopf:"\u{1D555}",Dot:"\xA8",dot:"\u02D9",DotDot:"\u20DC",doteq:"\u2250",doteqdot:"\u2251",DotEqual:"\u2250",dotminus:"\u2238",dotplus:"\u2214",dotsquare:"\u22A1",doublebarwedge:"\u2306",DoubleContourIntegral:"\u222F",DoubleDot:"\xA8",DoubleDownArrow:"\u21D3",DoubleLeftArrow:"\u21D0",DoubleLeftRightArrow:"\u21D4",DoubleLeftTee:"\u2AE4",DoubleLongLeftArrow:"\u27F8",DoubleLongLeftRightArrow:"\u27FA",DoubleLongRightArrow:"\u27F9",DoubleRightArrow:"\u21D2",DoubleRightTee:"\u22A8",DoubleUpArrow:"\u21D1",DoubleUpDownArrow:"\u21D5",DoubleVerticalBar:"\u2225",DownArrowBar:"\u2913",downarrow:"\u2193",DownArrow:"\u2193",Downarrow:"\u21D3",DownArrowUpArrow:"\u21F5",DownBreve:"\u0311",downdownarrows:"\u21CA",downharpoonleft:"\u21C3",downharpoonright:"\u21C2",DownLeftRightVector:"\u2950",DownLeftTeeVector:"\u295E",DownLeftVectorBar:"\u2956",DownLeftVector:"\u21BD",DownRightTeeVector:"\u295F",DownRightVectorBar:"\u2957",DownRightVector:"\u21C1",DownTeeArrow:"\u21A7",DownTee:"\u22A4",drbkarow:"\u2910",drcorn:"\u231F",drcrop:"\u230C",Dscr:"\u{1D49F}",dscr:"\u{1D4B9}",DScy:"\u0405",dscy:"\u0455",dsol:"\u29F6",Dstrok:"\u0110",dstrok:"\u0111",dtdot:"\u22F1",dtri:"\u25BF",dtrif:"\u25BE",duarr:"\u21F5",duhar:"\u296F",dwangle:"\u29A6",DZcy:"\u040F",dzcy:"\u045F",dzigrarr:"\u27FF",Eacute:"\xC9",eacute:"\xE9",easter:"\u2A6E",Ecaron:"\u011A",ecaron:"\u011B",Ecirc:"\xCA",ecirc:"\xEA",ecir:"\u2256",ecolon:"\u2255",Ecy:"\u042D",ecy:"\u044D",eDDot:"\u2A77",Edot:"\u0116",edot:"\u0117",eDot:"\u2251",ee:"\u2147",efDot:"\u2252",Efr:"\u{1D508}",efr:"\u{1D522}",eg:"\u2A9A",Egrave:"\xC8",egrave:"\xE8",egs:"\u2A96",egsdot:"\u2A98",el:"\u2A99",Element:"\u2208",elinters:"\u23E7",ell:"\u2113",els:"\u2A95",elsdot:"\u2A97",Emacr:"\u0112",emacr:"\u0113",empty:"\u2205",emptyset:"\u2205",EmptySmallSquare:"\u25FB",emptyv:"\u2205",EmptyVerySmallSquare:"\u25AB",emsp13:"\u2004",emsp14:"\u2005",emsp:"\u2003",ENG:"\u014A",eng:"\u014B",ensp:"\u2002",Eogon:"\u0118",eogon:"\u0119",Eopf:"\u{1D53C}",eopf:"\u{1D556}",epar:"\u22D5",eparsl:"\u29E3",eplus:"\u2A71",epsi:"\u03B5",Epsilon:"\u0395",epsilon:"\u03B5",epsiv:"\u03F5",eqcirc:"\u2256",eqcolon:"\u2255",eqsim:"\u2242",eqslantgtr:"\u2A96",eqslantless:"\u2A95",Equal:"\u2A75",equals:"=",EqualTilde:"\u2242",equest:"\u225F",Equilibrium:"\u21CC",equiv:"\u2261",equivDD:"\u2A78",eqvparsl:"\u29E5",erarr:"\u2971",erDot:"\u2253",escr:"\u212F",Escr:"\u2130",esdot:"\u2250",Esim:"\u2A73",esim:"\u2242",Eta:"\u0397",eta:"\u03B7",ETH:"\xD0",eth:"\xF0",Euml:"\xCB",euml:"\xEB",euro:"\u20AC",excl:"!",exist:"\u2203",Exists:"\u2203",expectation:"\u2130",exponentiale:"\u2147",ExponentialE:"\u2147",fallingdotseq:"\u2252",Fcy:"\u0424",fcy:"\u0444",female:"\u2640",ffilig:"\uFB03",fflig:"\uFB00",ffllig:"\uFB04",Ffr:"\u{1D509}",ffr:"\u{1D523}",filig:"\uFB01",FilledSmallSquare:"\u25FC",FilledVerySmallSquare:"\u25AA",fjlig:"fj",flat:"\u266D",fllig:"\uFB02",fltns:"\u25B1",fnof:"\u0192",Fopf:"\u{1D53D}",fopf:"\u{1D557}",forall:"\u2200",ForAll:"\u2200",fork:"\u22D4",forkv:"\u2AD9",Fouriertrf:"\u2131",fpartint:"\u2A0D",frac12:"\xBD",frac13:"\u2153",frac14:"\xBC",frac15:"\u2155",frac16:"\u2159",frac18:"\u215B",frac23:"\u2154",frac25:"\u2156",frac34:"\xBE",frac35:"\u2157",frac38:"\u215C",frac45:"\u2158",frac56:"\u215A",frac58:"\u215D",frac78:"\u215E",frasl:"\u2044",frown:"\u2322",fscr:"\u{1D4BB}",Fscr:"\u2131",gacute:"\u01F5",Gamma:"\u0393",gamma:"\u03B3",Gammad:"\u03DC",gammad:"\u03DD",gap:"\u2A86",Gbreve:"\u011E",gbreve:"\u011F",Gcedil:"\u0122",Gcirc:"\u011C",gcirc:"\u011D",Gcy:"\u0413",gcy:"\u0433",Gdot:"\u0120",gdot:"\u0121",ge:"\u2265",gE:"\u2267",gEl:"\u2A8C",gel:"\u22DB",geq:"\u2265",geqq:"\u2267",geqslant:"\u2A7E",gescc:"\u2AA9",ges:"\u2A7E",gesdot:"\u2A80",gesdoto:"\u2A82",gesdotol:"\u2A84",gesl:"\u22DB\uFE00",gesles:"\u2A94",Gfr:"\u{1D50A}",gfr:"\u{1D524}",gg:"\u226B",Gg:"\u22D9",ggg:"\u22D9",gimel:"\u2137",GJcy:"\u0403",gjcy:"\u0453",gla:"\u2AA5",gl:"\u2277",glE:"\u2A92",glj:"\u2AA4",gnap:"\u2A8A",gnapprox:"\u2A8A",gne:"\u2A88",gnE:"\u2269",gneq:"\u2A88",gneqq:"\u2269",gnsim:"\u22E7",Gopf:"\u{1D53E}",gopf:"\u{1D558}",grave:"`",GreaterEqual:"\u2265",GreaterEqualLess:"\u22DB",GreaterFullEqual:"\u2267",GreaterGreater:"\u2AA2",GreaterLess:"\u2277",GreaterSlantEqual:"\u2A7E",GreaterTilde:"\u2273",Gscr:"\u{1D4A2}",gscr:"\u210A",gsim:"\u2273",gsime:"\u2A8E",gsiml:"\u2A90",gtcc:"\u2AA7",gtcir:"\u2A7A",gt:">",GT:">",Gt:"\u226B",gtdot:"\u22D7",gtlPar:"\u2995",gtquest:"\u2A7C",gtrapprox:"\u2A86",gtrarr:"\u2978",gtrdot:"\u22D7",gtreqless:"\u22DB",gtreqqless:"\u2A8C",gtrless:"\u2277",gtrsim:"\u2273",gvertneqq:"\u2269\uFE00",gvnE:"\u2269\uFE00",Hacek:"\u02C7",hairsp:"\u200A",half:"\xBD",hamilt:"\u210B",HARDcy:"\u042A",hardcy:"\u044A",harrcir:"\u2948",harr:"\u2194",hArr:"\u21D4",harrw:"\u21AD",Hat:"^",hbar:"\u210F",Hcirc:"\u0124",hcirc:"\u0125",hearts:"\u2665",heartsuit:"\u2665",hellip:"\u2026",hercon:"\u22B9",hfr:"\u{1D525}",Hfr:"\u210C",HilbertSpace:"\u210B",hksearow:"\u2925",hkswarow:"\u2926",hoarr:"\u21FF",homtht:"\u223B",hookleftarrow:"\u21A9",hookrightarrow:"\u21AA",hopf:"\u{1D559}",Hopf:"\u210D",horbar:"\u2015",HorizontalLine:"\u2500",hscr:"\u{1D4BD}",Hscr:"\u210B",hslash:"\u210F",Hstrok:"\u0126",hstrok:"\u0127",HumpDownHump:"\u224E",HumpEqual:"\u224F",hybull:"\u2043",hyphen:"\u2010",Iacute:"\xCD",iacute:"\xED",ic:"\u2063",Icirc:"\xCE",icirc:"\xEE",Icy:"\u0418",icy:"\u0438",Idot:"\u0130",IEcy:"\u0415",iecy:"\u0435",iexcl:"\xA1",iff:"\u21D4",ifr:"\u{1D526}",Ifr:"\u2111",Igrave:"\xCC",igrave:"\xEC",ii:"\u2148",iiiint:"\u2A0C",iiint:"\u222D",iinfin:"\u29DC",iiota:"\u2129",IJlig:"\u0132",ijlig:"\u0133",Imacr:"\u012A",imacr:"\u012B",image:"\u2111",ImaginaryI:"\u2148",imagline:"\u2110",imagpart:"\u2111",imath:"\u0131",Im:"\u2111",imof:"\u22B7",imped:"\u01B5",Implies:"\u21D2",incare:"\u2105",in:"\u2208",infin:"\u221E",infintie:"\u29DD",inodot:"\u0131",intcal:"\u22BA",int:"\u222B",Int:"\u222C",integers:"\u2124",Integral:"\u222B",intercal:"\u22BA",Intersection:"\u22C2",intlarhk:"\u2A17",intprod:"\u2A3C",InvisibleComma:"\u2063",InvisibleTimes:"\u2062",IOcy:"\u0401",iocy:"\u0451",Iogon:"\u012E",iogon:"\u012F",Iopf:"\u{1D540}",iopf:"\u{1D55A}",Iota:"\u0399",iota:"\u03B9",iprod:"\u2A3C",iquest:"\xBF",iscr:"\u{1D4BE}",Iscr:"\u2110",isin:"\u2208",isindot:"\u22F5",isinE:"\u22F9",isins:"\u22F4",isinsv:"\u22F3",isinv:"\u2208",it:"\u2062",Itilde:"\u0128",itilde:"\u0129",Iukcy:"\u0406",iukcy:"\u0456",Iuml:"\xCF",iuml:"\xEF",Jcirc:"\u0134",jcirc:"\u0135",Jcy:"\u0419",jcy:"\u0439",Jfr:"\u{1D50D}",jfr:"\u{1D527}",jmath:"\u0237",Jopf:"\u{1D541}",jopf:"\u{1D55B}",Jscr:"\u{1D4A5}",jscr:"\u{1D4BF}",Jsercy:"\u0408",jsercy:"\u0458",Jukcy:"\u0404",jukcy:"\u0454",Kappa:"\u039A",kappa:"\u03BA",kappav:"\u03F0",Kcedil:"\u0136",kcedil:"\u0137",Kcy:"\u041A",kcy:"\u043A",Kfr:"\u{1D50E}",kfr:"\u{1D528}",kgreen:"\u0138",KHcy:"\u0425",khcy:"\u0445",KJcy:"\u040C",kjcy:"\u045C",Kopf:"\u{1D542}",kopf:"\u{1D55C}",Kscr:"\u{1D4A6}",kscr:"\u{1D4C0}",lAarr:"\u21DA",Lacute:"\u0139",lacute:"\u013A",laemptyv:"\u29B4",lagran:"\u2112",Lambda:"\u039B",lambda:"\u03BB",lang:"\u27E8",Lang:"\u27EA",langd:"\u2991",langle:"\u27E8",lap:"\u2A85",Laplacetrf:"\u2112",laquo:"\xAB",larrb:"\u21E4",larrbfs:"\u291F",larr:"\u2190",Larr:"\u219E",lArr:"\u21D0",larrfs:"\u291D",larrhk:"\u21A9",larrlp:"\u21AB",larrpl:"\u2939",larrsim:"\u2973",larrtl:"\u21A2",latail:"\u2919",lAtail:"\u291B",lat:"\u2AAB",late:"\u2AAD",lates:"\u2AAD\uFE00",lbarr:"\u290C",lBarr:"\u290E",lbbrk:"\u2772",lbrace:"{",lbrack:"[",lbrke:"\u298B",lbrksld:"\u298F",lbrkslu:"\u298D",Lcaron:"\u013D",lcaron:"\u013E",Lcedil:"\u013B",lcedil:"\u013C",lceil:"\u2308",lcub:"{",Lcy:"\u041B",lcy:"\u043B",ldca:"\u2936",ldquo:"\u201C",ldquor:"\u201E",ldrdhar:"\u2967",ldrushar:"\u294B",ldsh:"\u21B2",le:"\u2264",lE:"\u2266",LeftAngleBracket:"\u27E8",LeftArrowBar:"\u21E4",leftarrow:"\u2190",LeftArrow:"\u2190",Leftarrow:"\u21D0",LeftArrowRightArrow:"\u21C6",leftarrowtail:"\u21A2",LeftCeiling:"\u2308",LeftDoubleBracket:"\u27E6",LeftDownTeeVector:"\u2961",LeftDownVectorBar:"\u2959",LeftDownVector:"\u21C3",LeftFloor:"\u230A",leftharpoondown:"\u21BD",leftharpoonup:"\u21BC",leftleftarrows:"\u21C7",leftrightarrow:"\u2194",LeftRightArrow:"\u2194",Leftrightarrow:"\u21D4",leftrightarrows:"\u21C6",leftrightharpoons:"\u21CB",leftrightsquigarrow:"\u21AD",LeftRightVector:"\u294E",LeftTeeArrow:"\u21A4",LeftTee:"\u22A3",LeftTeeVector:"\u295A",leftthreetimes:"\u22CB",LeftTriangleBar:"\u29CF",LeftTriangle:"\u22B2",LeftTriangleEqual:"\u22B4",LeftUpDownVector:"\u2951",LeftUpTeeVector:"\u2960",LeftUpVectorBar:"\u2958",LeftUpVector:"\u21BF",LeftVectorBar:"\u2952",LeftVector:"\u21BC",lEg:"\u2A8B",leg:"\u22DA",leq:"\u2264",leqq:"\u2266",leqslant:"\u2A7D",lescc:"\u2AA8",les:"\u2A7D",lesdot:"\u2A7F",lesdoto:"\u2A81",lesdotor:"\u2A83",lesg:"\u22DA\uFE00",lesges:"\u2A93",lessapprox:"\u2A85",lessdot:"\u22D6",lesseqgtr:"\u22DA",lesseqqgtr:"\u2A8B",LessEqualGreater:"\u22DA",LessFullEqual:"\u2266",LessGreater:"\u2276",lessgtr:"\u2276",LessLess:"\u2AA1",lesssim:"\u2272",LessSlantEqual:"\u2A7D",LessTilde:"\u2272",lfisht:"\u297C",lfloor:"\u230A",Lfr:"\u{1D50F}",lfr:"\u{1D529}",lg:"\u2276",lgE:"\u2A91",lHar:"\u2962",lhard:"\u21BD",lharu:"\u21BC",lharul:"\u296A",lhblk:"\u2584",LJcy:"\u0409",ljcy:"\u0459",llarr:"\u21C7",ll:"\u226A",Ll:"\u22D8",llcorner:"\u231E",Lleftarrow:"\u21DA",llhard:"\u296B",lltri:"\u25FA",Lmidot:"\u013F",lmidot:"\u0140",lmoustache:"\u23B0",lmoust:"\u23B0",lnap:"\u2A89",lnapprox:"\u2A89",lne:"\u2A87",lnE:"\u2268",lneq:"\u2A87",lneqq:"\u2268",lnsim:"\u22E6",loang:"\u27EC",loarr:"\u21FD",lobrk:"\u27E6",longleftarrow:"\u27F5",LongLeftArrow:"\u27F5",Longleftarrow:"\u27F8",longleftrightarrow:"\u27F7",LongLeftRightArrow:"\u27F7",Longleftrightarrow:"\u27FA",longmapsto:"\u27FC",longrightarrow:"\u27F6",LongRightArrow:"\u27F6",Longrightarrow:"\u27F9",looparrowleft:"\u21AB",looparrowright:"\u21AC",lopar:"\u2985",Lopf:"\u{1D543}",lopf:"\u{1D55D}",loplus:"\u2A2D",lotimes:"\u2A34",lowast:"\u2217",lowbar:"_",LowerLeftArrow:"\u2199",LowerRightArrow:"\u2198",loz:"\u25CA",lozenge:"\u25CA",lozf:"\u29EB",lpar:"(",lparlt:"\u2993",lrarr:"\u21C6",lrcorner:"\u231F",lrhar:"\u21CB",lrhard:"\u296D",lrm:"\u200E",lrtri:"\u22BF",lsaquo:"\u2039",lscr:"\u{1D4C1}",Lscr:"\u2112",lsh:"\u21B0",Lsh:"\u21B0",lsim:"\u2272",lsime:"\u2A8D",lsimg:"\u2A8F",lsqb:"[",lsquo:"\u2018",lsquor:"\u201A",Lstrok:"\u0141",lstrok:"\u0142",ltcc:"\u2AA6",ltcir:"\u2A79",lt:"<",LT:"<",Lt:"\u226A",ltdot:"\u22D6",lthree:"\u22CB",ltimes:"\u22C9",ltlarr:"\u2976",ltquest:"\u2A7B",ltri:"\u25C3",ltrie:"\u22B4",ltrif:"\u25C2",ltrPar:"\u2996",lurdshar:"\u294A",luruhar:"\u2966",lvertneqq:"\u2268\uFE00",lvnE:"\u2268\uFE00",macr:"\xAF",male:"\u2642",malt:"\u2720",maltese:"\u2720",Map:"\u2905",map:"\u21A6",mapsto:"\u21A6",mapstodown:"\u21A7",mapstoleft:"\u21A4",mapstoup:"\u21A5",marker:"\u25AE",mcomma:"\u2A29",Mcy:"\u041C",mcy:"\u043C",mdash:"\u2014",mDDot:"\u223A",measuredangle:"\u2221",MediumSpace:"\u205F",Mellintrf:"\u2133",Mfr:"\u{1D510}",mfr:"\u{1D52A}",mho:"\u2127",micro:"\xB5",midast:"*",midcir:"\u2AF0",mid:"\u2223",middot:"\xB7",minusb:"\u229F",minus:"\u2212",minusd:"\u2238",minusdu:"\u2A2A",MinusPlus:"\u2213",mlcp:"\u2ADB",mldr:"\u2026",mnplus:"\u2213",models:"\u22A7",Mopf:"\u{1D544}",mopf:"\u{1D55E}",mp:"\u2213",mscr:"\u{1D4C2}",Mscr:"\u2133",mstpos:"\u223E",Mu:"\u039C",mu:"\u03BC",multimap:"\u22B8",mumap:"\u22B8",nabla:"\u2207",Nacute:"\u0143",nacute:"\u0144",nang:"\u2220\u20D2",nap:"\u2249",napE:"\u2A70\u0338",napid:"\u224B\u0338",napos:"\u0149",napprox:"\u2249",natural:"\u266E",naturals:"\u2115",natur:"\u266E",nbsp:"\xA0",nbump:"\u224E\u0338",nbumpe:"\u224F\u0338",ncap:"\u2A43",Ncaron:"\u0147",ncaron:"\u0148",Ncedil:"\u0145",ncedil:"\u0146",ncong:"\u2247",ncongdot:"\u2A6D\u0338",ncup:"\u2A42",Ncy:"\u041D",ncy:"\u043D",ndash:"\u2013",nearhk:"\u2924",nearr:"\u2197",neArr:"\u21D7",nearrow:"\u2197",ne:"\u2260",nedot:"\u2250\u0338",NegativeMediumSpace:"\u200B",NegativeThickSpace:"\u200B",NegativeThinSpace:"\u200B",NegativeVeryThinSpace:"\u200B",nequiv:"\u2262",nesear:"\u2928",nesim:"\u2242\u0338",NestedGreaterGreater:"\u226B",NestedLessLess:"\u226A",NewLine:` +`,nexist:"\u2204",nexists:"\u2204",Nfr:"\u{1D511}",nfr:"\u{1D52B}",ngE:"\u2267\u0338",nge:"\u2271",ngeq:"\u2271",ngeqq:"\u2267\u0338",ngeqslant:"\u2A7E\u0338",nges:"\u2A7E\u0338",nGg:"\u22D9\u0338",ngsim:"\u2275",nGt:"\u226B\u20D2",ngt:"\u226F",ngtr:"\u226F",nGtv:"\u226B\u0338",nharr:"\u21AE",nhArr:"\u21CE",nhpar:"\u2AF2",ni:"\u220B",nis:"\u22FC",nisd:"\u22FA",niv:"\u220B",NJcy:"\u040A",njcy:"\u045A",nlarr:"\u219A",nlArr:"\u21CD",nldr:"\u2025",nlE:"\u2266\u0338",nle:"\u2270",nleftarrow:"\u219A",nLeftarrow:"\u21CD",nleftrightarrow:"\u21AE",nLeftrightarrow:"\u21CE",nleq:"\u2270",nleqq:"\u2266\u0338",nleqslant:"\u2A7D\u0338",nles:"\u2A7D\u0338",nless:"\u226E",nLl:"\u22D8\u0338",nlsim:"\u2274",nLt:"\u226A\u20D2",nlt:"\u226E",nltri:"\u22EA",nltrie:"\u22EC",nLtv:"\u226A\u0338",nmid:"\u2224",NoBreak:"\u2060",NonBreakingSpace:"\xA0",nopf:"\u{1D55F}",Nopf:"\u2115",Not:"\u2AEC",not:"\xAC",NotCongruent:"\u2262",NotCupCap:"\u226D",NotDoubleVerticalBar:"\u2226",NotElement:"\u2209",NotEqual:"\u2260",NotEqualTilde:"\u2242\u0338",NotExists:"\u2204",NotGreater:"\u226F",NotGreaterEqual:"\u2271",NotGreaterFullEqual:"\u2267\u0338",NotGreaterGreater:"\u226B\u0338",NotGreaterLess:"\u2279",NotGreaterSlantEqual:"\u2A7E\u0338",NotGreaterTilde:"\u2275",NotHumpDownHump:"\u224E\u0338",NotHumpEqual:"\u224F\u0338",notin:"\u2209",notindot:"\u22F5\u0338",notinE:"\u22F9\u0338",notinva:"\u2209",notinvb:"\u22F7",notinvc:"\u22F6",NotLeftTriangleBar:"\u29CF\u0338",NotLeftTriangle:"\u22EA",NotLeftTriangleEqual:"\u22EC",NotLess:"\u226E",NotLessEqual:"\u2270",NotLessGreater:"\u2278",NotLessLess:"\u226A\u0338",NotLessSlantEqual:"\u2A7D\u0338",NotLessTilde:"\u2274",NotNestedGreaterGreater:"\u2AA2\u0338",NotNestedLessLess:"\u2AA1\u0338",notni:"\u220C",notniva:"\u220C",notnivb:"\u22FE",notnivc:"\u22FD",NotPrecedes:"\u2280",NotPrecedesEqual:"\u2AAF\u0338",NotPrecedesSlantEqual:"\u22E0",NotReverseElement:"\u220C",NotRightTriangleBar:"\u29D0\u0338",NotRightTriangle:"\u22EB",NotRightTriangleEqual:"\u22ED",NotSquareSubset:"\u228F\u0338",NotSquareSubsetEqual:"\u22E2",NotSquareSuperset:"\u2290\u0338",NotSquareSupersetEqual:"\u22E3",NotSubset:"\u2282\u20D2",NotSubsetEqual:"\u2288",NotSucceeds:"\u2281",NotSucceedsEqual:"\u2AB0\u0338",NotSucceedsSlantEqual:"\u22E1",NotSucceedsTilde:"\u227F\u0338",NotSuperset:"\u2283\u20D2",NotSupersetEqual:"\u2289",NotTilde:"\u2241",NotTildeEqual:"\u2244",NotTildeFullEqual:"\u2247",NotTildeTilde:"\u2249",NotVerticalBar:"\u2224",nparallel:"\u2226",npar:"\u2226",nparsl:"\u2AFD\u20E5",npart:"\u2202\u0338",npolint:"\u2A14",npr:"\u2280",nprcue:"\u22E0",nprec:"\u2280",npreceq:"\u2AAF\u0338",npre:"\u2AAF\u0338",nrarrc:"\u2933\u0338",nrarr:"\u219B",nrArr:"\u21CF",nrarrw:"\u219D\u0338",nrightarrow:"\u219B",nRightarrow:"\u21CF",nrtri:"\u22EB",nrtrie:"\u22ED",nsc:"\u2281",nsccue:"\u22E1",nsce:"\u2AB0\u0338",Nscr:"\u{1D4A9}",nscr:"\u{1D4C3}",nshortmid:"\u2224",nshortparallel:"\u2226",nsim:"\u2241",nsime:"\u2244",nsimeq:"\u2244",nsmid:"\u2224",nspar:"\u2226",nsqsube:"\u22E2",nsqsupe:"\u22E3",nsub:"\u2284",nsubE:"\u2AC5\u0338",nsube:"\u2288",nsubset:"\u2282\u20D2",nsubseteq:"\u2288",nsubseteqq:"\u2AC5\u0338",nsucc:"\u2281",nsucceq:"\u2AB0\u0338",nsup:"\u2285",nsupE:"\u2AC6\u0338",nsupe:"\u2289",nsupset:"\u2283\u20D2",nsupseteq:"\u2289",nsupseteqq:"\u2AC6\u0338",ntgl:"\u2279",Ntilde:"\xD1",ntilde:"\xF1",ntlg:"\u2278",ntriangleleft:"\u22EA",ntrianglelefteq:"\u22EC",ntriangleright:"\u22EB",ntrianglerighteq:"\u22ED",Nu:"\u039D",nu:"\u03BD",num:"#",numero:"\u2116",numsp:"\u2007",nvap:"\u224D\u20D2",nvdash:"\u22AC",nvDash:"\u22AD",nVdash:"\u22AE",nVDash:"\u22AF",nvge:"\u2265\u20D2",nvgt:">\u20D2",nvHarr:"\u2904",nvinfin:"\u29DE",nvlArr:"\u2902",nvle:"\u2264\u20D2",nvlt:"<\u20D2",nvltrie:"\u22B4\u20D2",nvrArr:"\u2903",nvrtrie:"\u22B5\u20D2",nvsim:"\u223C\u20D2",nwarhk:"\u2923",nwarr:"\u2196",nwArr:"\u21D6",nwarrow:"\u2196",nwnear:"\u2927",Oacute:"\xD3",oacute:"\xF3",oast:"\u229B",Ocirc:"\xD4",ocirc:"\xF4",ocir:"\u229A",Ocy:"\u041E",ocy:"\u043E",odash:"\u229D",Odblac:"\u0150",odblac:"\u0151",odiv:"\u2A38",odot:"\u2299",odsold:"\u29BC",OElig:"\u0152",oelig:"\u0153",ofcir:"\u29BF",Ofr:"\u{1D512}",ofr:"\u{1D52C}",ogon:"\u02DB",Ograve:"\xD2",ograve:"\xF2",ogt:"\u29C1",ohbar:"\u29B5",ohm:"\u03A9",oint:"\u222E",olarr:"\u21BA",olcir:"\u29BE",olcross:"\u29BB",oline:"\u203E",olt:"\u29C0",Omacr:"\u014C",omacr:"\u014D",Omega:"\u03A9",omega:"\u03C9",Omicron:"\u039F",omicron:"\u03BF",omid:"\u29B6",ominus:"\u2296",Oopf:"\u{1D546}",oopf:"\u{1D560}",opar:"\u29B7",OpenCurlyDoubleQuote:"\u201C",OpenCurlyQuote:"\u2018",operp:"\u29B9",oplus:"\u2295",orarr:"\u21BB",Or:"\u2A54",or:"\u2228",ord:"\u2A5D",order:"\u2134",orderof:"\u2134",ordf:"\xAA",ordm:"\xBA",origof:"\u22B6",oror:"\u2A56",orslope:"\u2A57",orv:"\u2A5B",oS:"\u24C8",Oscr:"\u{1D4AA}",oscr:"\u2134",Oslash:"\xD8",oslash:"\xF8",osol:"\u2298",Otilde:"\xD5",otilde:"\xF5",otimesas:"\u2A36",Otimes:"\u2A37",otimes:"\u2297",Ouml:"\xD6",ouml:"\xF6",ovbar:"\u233D",OverBar:"\u203E",OverBrace:"\u23DE",OverBracket:"\u23B4",OverParenthesis:"\u23DC",para:"\xB6",parallel:"\u2225",par:"\u2225",parsim:"\u2AF3",parsl:"\u2AFD",part:"\u2202",PartialD:"\u2202",Pcy:"\u041F",pcy:"\u043F",percnt:"%",period:".",permil:"\u2030",perp:"\u22A5",pertenk:"\u2031",Pfr:"\u{1D513}",pfr:"\u{1D52D}",Phi:"\u03A6",phi:"\u03C6",phiv:"\u03D5",phmmat:"\u2133",phone:"\u260E",Pi:"\u03A0",pi:"\u03C0",pitchfork:"\u22D4",piv:"\u03D6",planck:"\u210F",planckh:"\u210E",plankv:"\u210F",plusacir:"\u2A23",plusb:"\u229E",pluscir:"\u2A22",plus:"+",plusdo:"\u2214",plusdu:"\u2A25",pluse:"\u2A72",PlusMinus:"\xB1",plusmn:"\xB1",plussim:"\u2A26",plustwo:"\u2A27",pm:"\xB1",Poincareplane:"\u210C",pointint:"\u2A15",popf:"\u{1D561}",Popf:"\u2119",pound:"\xA3",prap:"\u2AB7",Pr:"\u2ABB",pr:"\u227A",prcue:"\u227C",precapprox:"\u2AB7",prec:"\u227A",preccurlyeq:"\u227C",Precedes:"\u227A",PrecedesEqual:"\u2AAF",PrecedesSlantEqual:"\u227C",PrecedesTilde:"\u227E",preceq:"\u2AAF",precnapprox:"\u2AB9",precneqq:"\u2AB5",precnsim:"\u22E8",pre:"\u2AAF",prE:"\u2AB3",precsim:"\u227E",prime:"\u2032",Prime:"\u2033",primes:"\u2119",prnap:"\u2AB9",prnE:"\u2AB5",prnsim:"\u22E8",prod:"\u220F",Product:"\u220F",profalar:"\u232E",profline:"\u2312",profsurf:"\u2313",prop:"\u221D",Proportional:"\u221D",Proportion:"\u2237",propto:"\u221D",prsim:"\u227E",prurel:"\u22B0",Pscr:"\u{1D4AB}",pscr:"\u{1D4C5}",Psi:"\u03A8",psi:"\u03C8",puncsp:"\u2008",Qfr:"\u{1D514}",qfr:"\u{1D52E}",qint:"\u2A0C",qopf:"\u{1D562}",Qopf:"\u211A",qprime:"\u2057",Qscr:"\u{1D4AC}",qscr:"\u{1D4C6}",quaternions:"\u210D",quatint:"\u2A16",quest:"?",questeq:"\u225F",quot:'"',QUOT:'"',rAarr:"\u21DB",race:"\u223D\u0331",Racute:"\u0154",racute:"\u0155",radic:"\u221A",raemptyv:"\u29B3",rang:"\u27E9",Rang:"\u27EB",rangd:"\u2992",range:"\u29A5",rangle:"\u27E9",raquo:"\xBB",rarrap:"\u2975",rarrb:"\u21E5",rarrbfs:"\u2920",rarrc:"\u2933",rarr:"\u2192",Rarr:"\u21A0",rArr:"\u21D2",rarrfs:"\u291E",rarrhk:"\u21AA",rarrlp:"\u21AC",rarrpl:"\u2945",rarrsim:"\u2974",Rarrtl:"\u2916",rarrtl:"\u21A3",rarrw:"\u219D",ratail:"\u291A",rAtail:"\u291C",ratio:"\u2236",rationals:"\u211A",rbarr:"\u290D",rBarr:"\u290F",RBarr:"\u2910",rbbrk:"\u2773",rbrace:"}",rbrack:"]",rbrke:"\u298C",rbrksld:"\u298E",rbrkslu:"\u2990",Rcaron:"\u0158",rcaron:"\u0159",Rcedil:"\u0156",rcedil:"\u0157",rceil:"\u2309",rcub:"}",Rcy:"\u0420",rcy:"\u0440",rdca:"\u2937",rdldhar:"\u2969",rdquo:"\u201D",rdquor:"\u201D",rdsh:"\u21B3",real:"\u211C",realine:"\u211B",realpart:"\u211C",reals:"\u211D",Re:"\u211C",rect:"\u25AD",reg:"\xAE",REG:"\xAE",ReverseElement:"\u220B",ReverseEquilibrium:"\u21CB",ReverseUpEquilibrium:"\u296F",rfisht:"\u297D",rfloor:"\u230B",rfr:"\u{1D52F}",Rfr:"\u211C",rHar:"\u2964",rhard:"\u21C1",rharu:"\u21C0",rharul:"\u296C",Rho:"\u03A1",rho:"\u03C1",rhov:"\u03F1",RightAngleBracket:"\u27E9",RightArrowBar:"\u21E5",rightarrow:"\u2192",RightArrow:"\u2192",Rightarrow:"\u21D2",RightArrowLeftArrow:"\u21C4",rightarrowtail:"\u21A3",RightCeiling:"\u2309",RightDoubleBracket:"\u27E7",RightDownTeeVector:"\u295D",RightDownVectorBar:"\u2955",RightDownVector:"\u21C2",RightFloor:"\u230B",rightharpoondown:"\u21C1",rightharpoonup:"\u21C0",rightleftarrows:"\u21C4",rightleftharpoons:"\u21CC",rightrightarrows:"\u21C9",rightsquigarrow:"\u219D",RightTeeArrow:"\u21A6",RightTee:"\u22A2",RightTeeVector:"\u295B",rightthreetimes:"\u22CC",RightTriangleBar:"\u29D0",RightTriangle:"\u22B3",RightTriangleEqual:"\u22B5",RightUpDownVector:"\u294F",RightUpTeeVector:"\u295C",RightUpVectorBar:"\u2954",RightUpVector:"\u21BE",RightVectorBar:"\u2953",RightVector:"\u21C0",ring:"\u02DA",risingdotseq:"\u2253",rlarr:"\u21C4",rlhar:"\u21CC",rlm:"\u200F",rmoustache:"\u23B1",rmoust:"\u23B1",rnmid:"\u2AEE",roang:"\u27ED",roarr:"\u21FE",robrk:"\u27E7",ropar:"\u2986",ropf:"\u{1D563}",Ropf:"\u211D",roplus:"\u2A2E",rotimes:"\u2A35",RoundImplies:"\u2970",rpar:")",rpargt:"\u2994",rppolint:"\u2A12",rrarr:"\u21C9",Rrightarrow:"\u21DB",rsaquo:"\u203A",rscr:"\u{1D4C7}",Rscr:"\u211B",rsh:"\u21B1",Rsh:"\u21B1",rsqb:"]",rsquo:"\u2019",rsquor:"\u2019",rthree:"\u22CC",rtimes:"\u22CA",rtri:"\u25B9",rtrie:"\u22B5",rtrif:"\u25B8",rtriltri:"\u29CE",RuleDelayed:"\u29F4",ruluhar:"\u2968",rx:"\u211E",Sacute:"\u015A",sacute:"\u015B",sbquo:"\u201A",scap:"\u2AB8",Scaron:"\u0160",scaron:"\u0161",Sc:"\u2ABC",sc:"\u227B",sccue:"\u227D",sce:"\u2AB0",scE:"\u2AB4",Scedil:"\u015E",scedil:"\u015F",Scirc:"\u015C",scirc:"\u015D",scnap:"\u2ABA",scnE:"\u2AB6",scnsim:"\u22E9",scpolint:"\u2A13",scsim:"\u227F",Scy:"\u0421",scy:"\u0441",sdotb:"\u22A1",sdot:"\u22C5",sdote:"\u2A66",searhk:"\u2925",searr:"\u2198",seArr:"\u21D8",searrow:"\u2198",sect:"\xA7",semi:";",seswar:"\u2929",setminus:"\u2216",setmn:"\u2216",sext:"\u2736",Sfr:"\u{1D516}",sfr:"\u{1D530}",sfrown:"\u2322",sharp:"\u266F",SHCHcy:"\u0429",shchcy:"\u0449",SHcy:"\u0428",shcy:"\u0448",ShortDownArrow:"\u2193",ShortLeftArrow:"\u2190",shortmid:"\u2223",shortparallel:"\u2225",ShortRightArrow:"\u2192",ShortUpArrow:"\u2191",shy:"\xAD",Sigma:"\u03A3",sigma:"\u03C3",sigmaf:"\u03C2",sigmav:"\u03C2",sim:"\u223C",simdot:"\u2A6A",sime:"\u2243",simeq:"\u2243",simg:"\u2A9E",simgE:"\u2AA0",siml:"\u2A9D",simlE:"\u2A9F",simne:"\u2246",simplus:"\u2A24",simrarr:"\u2972",slarr:"\u2190",SmallCircle:"\u2218",smallsetminus:"\u2216",smashp:"\u2A33",smeparsl:"\u29E4",smid:"\u2223",smile:"\u2323",smt:"\u2AAA",smte:"\u2AAC",smtes:"\u2AAC\uFE00",SOFTcy:"\u042C",softcy:"\u044C",solbar:"\u233F",solb:"\u29C4",sol:"/",Sopf:"\u{1D54A}",sopf:"\u{1D564}",spades:"\u2660",spadesuit:"\u2660",spar:"\u2225",sqcap:"\u2293",sqcaps:"\u2293\uFE00",sqcup:"\u2294",sqcups:"\u2294\uFE00",Sqrt:"\u221A",sqsub:"\u228F",sqsube:"\u2291",sqsubset:"\u228F",sqsubseteq:"\u2291",sqsup:"\u2290",sqsupe:"\u2292",sqsupset:"\u2290",sqsupseteq:"\u2292",square:"\u25A1",Square:"\u25A1",SquareIntersection:"\u2293",SquareSubset:"\u228F",SquareSubsetEqual:"\u2291",SquareSuperset:"\u2290",SquareSupersetEqual:"\u2292",SquareUnion:"\u2294",squarf:"\u25AA",squ:"\u25A1",squf:"\u25AA",srarr:"\u2192",Sscr:"\u{1D4AE}",sscr:"\u{1D4C8}",ssetmn:"\u2216",ssmile:"\u2323",sstarf:"\u22C6",Star:"\u22C6",star:"\u2606",starf:"\u2605",straightepsilon:"\u03F5",straightphi:"\u03D5",strns:"\xAF",sub:"\u2282",Sub:"\u22D0",subdot:"\u2ABD",subE:"\u2AC5",sube:"\u2286",subedot:"\u2AC3",submult:"\u2AC1",subnE:"\u2ACB",subne:"\u228A",subplus:"\u2ABF",subrarr:"\u2979",subset:"\u2282",Subset:"\u22D0",subseteq:"\u2286",subseteqq:"\u2AC5",SubsetEqual:"\u2286",subsetneq:"\u228A",subsetneqq:"\u2ACB",subsim:"\u2AC7",subsub:"\u2AD5",subsup:"\u2AD3",succapprox:"\u2AB8",succ:"\u227B",succcurlyeq:"\u227D",Succeeds:"\u227B",SucceedsEqual:"\u2AB0",SucceedsSlantEqual:"\u227D",SucceedsTilde:"\u227F",succeq:"\u2AB0",succnapprox:"\u2ABA",succneqq:"\u2AB6",succnsim:"\u22E9",succsim:"\u227F",SuchThat:"\u220B",sum:"\u2211",Sum:"\u2211",sung:"\u266A",sup1:"\xB9",sup2:"\xB2",sup3:"\xB3",sup:"\u2283",Sup:"\u22D1",supdot:"\u2ABE",supdsub:"\u2AD8",supE:"\u2AC6",supe:"\u2287",supedot:"\u2AC4",Superset:"\u2283",SupersetEqual:"\u2287",suphsol:"\u27C9",suphsub:"\u2AD7",suplarr:"\u297B",supmult:"\u2AC2",supnE:"\u2ACC",supne:"\u228B",supplus:"\u2AC0",supset:"\u2283",Supset:"\u22D1",supseteq:"\u2287",supseteqq:"\u2AC6",supsetneq:"\u228B",supsetneqq:"\u2ACC",supsim:"\u2AC8",supsub:"\u2AD4",supsup:"\u2AD6",swarhk:"\u2926",swarr:"\u2199",swArr:"\u21D9",swarrow:"\u2199",swnwar:"\u292A",szlig:"\xDF",Tab:" ",target:"\u2316",Tau:"\u03A4",tau:"\u03C4",tbrk:"\u23B4",Tcaron:"\u0164",tcaron:"\u0165",Tcedil:"\u0162",tcedil:"\u0163",Tcy:"\u0422",tcy:"\u0442",tdot:"\u20DB",telrec:"\u2315",Tfr:"\u{1D517}",tfr:"\u{1D531}",there4:"\u2234",therefore:"\u2234",Therefore:"\u2234",Theta:"\u0398",theta:"\u03B8",thetasym:"\u03D1",thetav:"\u03D1",thickapprox:"\u2248",thicksim:"\u223C",ThickSpace:"\u205F\u200A",ThinSpace:"\u2009",thinsp:"\u2009",thkap:"\u2248",thksim:"\u223C",THORN:"\xDE",thorn:"\xFE",tilde:"\u02DC",Tilde:"\u223C",TildeEqual:"\u2243",TildeFullEqual:"\u2245",TildeTilde:"\u2248",timesbar:"\u2A31",timesb:"\u22A0",times:"\xD7",timesd:"\u2A30",tint:"\u222D",toea:"\u2928",topbot:"\u2336",topcir:"\u2AF1",top:"\u22A4",Topf:"\u{1D54B}",topf:"\u{1D565}",topfork:"\u2ADA",tosa:"\u2929",tprime:"\u2034",trade:"\u2122",TRADE:"\u2122",triangle:"\u25B5",triangledown:"\u25BF",triangleleft:"\u25C3",trianglelefteq:"\u22B4",triangleq:"\u225C",triangleright:"\u25B9",trianglerighteq:"\u22B5",tridot:"\u25EC",trie:"\u225C",triminus:"\u2A3A",TripleDot:"\u20DB",triplus:"\u2A39",trisb:"\u29CD",tritime:"\u2A3B",trpezium:"\u23E2",Tscr:"\u{1D4AF}",tscr:"\u{1D4C9}",TScy:"\u0426",tscy:"\u0446",TSHcy:"\u040B",tshcy:"\u045B",Tstrok:"\u0166",tstrok:"\u0167",twixt:"\u226C",twoheadleftarrow:"\u219E",twoheadrightarrow:"\u21A0",Uacute:"\xDA",uacute:"\xFA",uarr:"\u2191",Uarr:"\u219F",uArr:"\u21D1",Uarrocir:"\u2949",Ubrcy:"\u040E",ubrcy:"\u045E",Ubreve:"\u016C",ubreve:"\u016D",Ucirc:"\xDB",ucirc:"\xFB",Ucy:"\u0423",ucy:"\u0443",udarr:"\u21C5",Udblac:"\u0170",udblac:"\u0171",udhar:"\u296E",ufisht:"\u297E",Ufr:"\u{1D518}",ufr:"\u{1D532}",Ugrave:"\xD9",ugrave:"\xF9",uHar:"\u2963",uharl:"\u21BF",uharr:"\u21BE",uhblk:"\u2580",ulcorn:"\u231C",ulcorner:"\u231C",ulcrop:"\u230F",ultri:"\u25F8",Umacr:"\u016A",umacr:"\u016B",uml:"\xA8",UnderBar:"_",UnderBrace:"\u23DF",UnderBracket:"\u23B5",UnderParenthesis:"\u23DD",Union:"\u22C3",UnionPlus:"\u228E",Uogon:"\u0172",uogon:"\u0173",Uopf:"\u{1D54C}",uopf:"\u{1D566}",UpArrowBar:"\u2912",uparrow:"\u2191",UpArrow:"\u2191",Uparrow:"\u21D1",UpArrowDownArrow:"\u21C5",updownarrow:"\u2195",UpDownArrow:"\u2195",Updownarrow:"\u21D5",UpEquilibrium:"\u296E",upharpoonleft:"\u21BF",upharpoonright:"\u21BE",uplus:"\u228E",UpperLeftArrow:"\u2196",UpperRightArrow:"\u2197",upsi:"\u03C5",Upsi:"\u03D2",upsih:"\u03D2",Upsilon:"\u03A5",upsilon:"\u03C5",UpTeeArrow:"\u21A5",UpTee:"\u22A5",upuparrows:"\u21C8",urcorn:"\u231D",urcorner:"\u231D",urcrop:"\u230E",Uring:"\u016E",uring:"\u016F",urtri:"\u25F9",Uscr:"\u{1D4B0}",uscr:"\u{1D4CA}",utdot:"\u22F0",Utilde:"\u0168",utilde:"\u0169",utri:"\u25B5",utrif:"\u25B4",uuarr:"\u21C8",Uuml:"\xDC",uuml:"\xFC",uwangle:"\u29A7",vangrt:"\u299C",varepsilon:"\u03F5",varkappa:"\u03F0",varnothing:"\u2205",varphi:"\u03D5",varpi:"\u03D6",varpropto:"\u221D",varr:"\u2195",vArr:"\u21D5",varrho:"\u03F1",varsigma:"\u03C2",varsubsetneq:"\u228A\uFE00",varsubsetneqq:"\u2ACB\uFE00",varsupsetneq:"\u228B\uFE00",varsupsetneqq:"\u2ACC\uFE00",vartheta:"\u03D1",vartriangleleft:"\u22B2",vartriangleright:"\u22B3",vBar:"\u2AE8",Vbar:"\u2AEB",vBarv:"\u2AE9",Vcy:"\u0412",vcy:"\u0432",vdash:"\u22A2",vDash:"\u22A8",Vdash:"\u22A9",VDash:"\u22AB",Vdashl:"\u2AE6",veebar:"\u22BB",vee:"\u2228",Vee:"\u22C1",veeeq:"\u225A",vellip:"\u22EE",verbar:"|",Verbar:"\u2016",vert:"|",Vert:"\u2016",VerticalBar:"\u2223",VerticalLine:"|",VerticalSeparator:"\u2758",VerticalTilde:"\u2240",VeryThinSpace:"\u200A",Vfr:"\u{1D519}",vfr:"\u{1D533}",vltri:"\u22B2",vnsub:"\u2282\u20D2",vnsup:"\u2283\u20D2",Vopf:"\u{1D54D}",vopf:"\u{1D567}",vprop:"\u221D",vrtri:"\u22B3",Vscr:"\u{1D4B1}",vscr:"\u{1D4CB}",vsubnE:"\u2ACB\uFE00",vsubne:"\u228A\uFE00",vsupnE:"\u2ACC\uFE00",vsupne:"\u228B\uFE00",Vvdash:"\u22AA",vzigzag:"\u299A",Wcirc:"\u0174",wcirc:"\u0175",wedbar:"\u2A5F",wedge:"\u2227",Wedge:"\u22C0",wedgeq:"\u2259",weierp:"\u2118",Wfr:"\u{1D51A}",wfr:"\u{1D534}",Wopf:"\u{1D54E}",wopf:"\u{1D568}",wp:"\u2118",wr:"\u2240",wreath:"\u2240",Wscr:"\u{1D4B2}",wscr:"\u{1D4CC}",xcap:"\u22C2",xcirc:"\u25EF",xcup:"\u22C3",xdtri:"\u25BD",Xfr:"\u{1D51B}",xfr:"\u{1D535}",xharr:"\u27F7",xhArr:"\u27FA",Xi:"\u039E",xi:"\u03BE",xlarr:"\u27F5",xlArr:"\u27F8",xmap:"\u27FC",xnis:"\u22FB",xodot:"\u2A00",Xopf:"\u{1D54F}",xopf:"\u{1D569}",xoplus:"\u2A01",xotime:"\u2A02",xrarr:"\u27F6",xrArr:"\u27F9",Xscr:"\u{1D4B3}",xscr:"\u{1D4CD}",xsqcup:"\u2A06",xuplus:"\u2A04",xutri:"\u25B3",xvee:"\u22C1",xwedge:"\u22C0",Yacute:"\xDD",yacute:"\xFD",YAcy:"\u042F",yacy:"\u044F",Ycirc:"\u0176",ycirc:"\u0177",Ycy:"\u042B",ycy:"\u044B",yen:"\xA5",Yfr:"\u{1D51C}",yfr:"\u{1D536}",YIcy:"\u0407",yicy:"\u0457",Yopf:"\u{1D550}",yopf:"\u{1D56A}",Yscr:"\u{1D4B4}",yscr:"\u{1D4CE}",YUcy:"\u042E",yucy:"\u044E",yuml:"\xFF",Yuml:"\u0178",Zacute:"\u0179",zacute:"\u017A",Zcaron:"\u017D",zcaron:"\u017E",Zcy:"\u0417",zcy:"\u0437",Zdot:"\u017B",zdot:"\u017C",zeetrf:"\u2128",ZeroWidthSpace:"\u200B",Zeta:"\u0396",zeta:"\u03B6",zfr:"\u{1D537}",Zfr:"\u2128",ZHcy:"\u0416",zhcy:"\u0436",zigrarr:"\u21DD",zopf:"\u{1D56B}",Zopf:"\u2124",Zscr:"\u{1D4B5}",zscr:"\u{1D4CF}",zwj:"\u200D",zwnj:"\u200C"}});var Rp=Ne((a1,Sv)=>{Sv.exports={Aacute:"\xC1",aacute:"\xE1",Acirc:"\xC2",acirc:"\xE2",acute:"\xB4",AElig:"\xC6",aelig:"\xE6",Agrave:"\xC0",agrave:"\xE0",amp:"&",AMP:"&",Aring:"\xC5",aring:"\xE5",Atilde:"\xC3",atilde:"\xE3",Auml:"\xC4",auml:"\xE4",brvbar:"\xA6",Ccedil:"\xC7",ccedil:"\xE7",cedil:"\xB8",cent:"\xA2",copy:"\xA9",COPY:"\xA9",curren:"\xA4",deg:"\xB0",divide:"\xF7",Eacute:"\xC9",eacute:"\xE9",Ecirc:"\xCA",ecirc:"\xEA",Egrave:"\xC8",egrave:"\xE8",ETH:"\xD0",eth:"\xF0",Euml:"\xCB",euml:"\xEB",frac12:"\xBD",frac14:"\xBC",frac34:"\xBE",gt:">",GT:">",Iacute:"\xCD",iacute:"\xED",Icirc:"\xCE",icirc:"\xEE",iexcl:"\xA1",Igrave:"\xCC",igrave:"\xEC",iquest:"\xBF",Iuml:"\xCF",iuml:"\xEF",laquo:"\xAB",lt:"<",LT:"<",macr:"\xAF",micro:"\xB5",middot:"\xB7",nbsp:"\xA0",not:"\xAC",Ntilde:"\xD1",ntilde:"\xF1",Oacute:"\xD3",oacute:"\xF3",Ocirc:"\xD4",ocirc:"\xF4",Ograve:"\xD2",ograve:"\xF2",ordf:"\xAA",ordm:"\xBA",Oslash:"\xD8",oslash:"\xF8",Otilde:"\xD5",otilde:"\xF5",Ouml:"\xD6",ouml:"\xF6",para:"\xB6",plusmn:"\xB1",pound:"\xA3",quot:'"',QUOT:'"',raquo:"\xBB",reg:"\xAE",REG:"\xAE",sect:"\xA7",shy:"\xAD",sup1:"\xB9",sup2:"\xB2",sup3:"\xB3",szlig:"\xDF",THORN:"\xDE",thorn:"\xFE",times:"\xD7",Uacute:"\xDA",uacute:"\xFA",Ucirc:"\xDB",ucirc:"\xFB",Ugrave:"\xD9",ugrave:"\xF9",uml:"\xA8",Uuml:"\xDC",uuml:"\xFC",Yacute:"\xDD",yacute:"\xFD",yen:"\xA5",yuml:"\xFF"}});var lu=Ne((u1,_v)=>{_v.exports={amp:"&",apos:"'",gt:">",lt:"<",quot:'"'}});var Fp=Ne((c1,wv)=>{wv.exports={"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}});var zp=Ne(Do=>{"use strict";var Tv=Do&&Do.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Do,"__esModule",{value:!0});var bp=Tv(Fp()),Cv=String.fromCodePoint||function(e){var t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|e&1023),t+=String.fromCharCode(e),t};function kv(e){return e>=55296&&e<=57343||e>1114111?"\uFFFD":(e in bp.default&&(e=bp.default[e]),Cv(e))}Do.default=kv});var su=Ne(Ut=>{"use strict";var gi=Ut&&Ut.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Ut,"__esModule",{value:!0});Ut.decodeHTML=Ut.decodeHTMLStrict=Ut.decodeXML=void 0;var iu=gi(ou()),Lv=gi(Rp()),Nv=gi(lu()),Hp=gi(zp()),Av=/&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g;Ut.decodeXML=Bp(Nv.default);Ut.decodeHTMLStrict=Bp(iu.default);function Bp(e){var t=qp(e);return function(n){return String(n).replace(Av,t)}}var jp=function(e,t){return e{"use strict";var Wp=$e&&$e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty($e,"__esModule",{value:!0});$e.escapeUTF8=$e.escape=$e.encodeNonAsciiHTML=$e.encodeHTML=$e.encodeXML=void 0;var Mv=Wp(lu()),Vp=$p(Mv.default),Gp=Xp(Vp);$e.encodeXML=Qp(Vp);var xv=Wp(ou()),au=$p(xv.default),Ov=Xp(au);$e.encodeHTML=Pv(au,Ov);$e.encodeNonAsciiHTML=Qp(au);function $p(e){return Object.keys(e).sort().reduce(function(t,n){return t[e[n]]="&"+n+";",t},{})}function Xp(e){for(var t=[],n=[],r=0,o=Object.keys(e);r1?Dv(e):e.charCodeAt(0)).toString(16).toUpperCase()+";"}function Pv(e,t){return function(n){return n.replace(t,function(r){return e[r]}).replace(Kp,hi)}}var Yp=new RegExp(Gp.source+"|"+Kp.source,"g");function Iv(e){return e.replace(Yp,hi)}$e.escape=Iv;function Uv(e){return e.replace(Gp,hi)}$e.escapeUTF8=Uv;function Qp(e){return function(t){return t.replace(Yp,function(n){return e[n]||hi(n)})}}});var Jp=Ne(b=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0});b.decodeXMLStrict=b.decodeHTML5Strict=b.decodeHTML4Strict=b.decodeHTML5=b.decodeHTML4=b.decodeHTMLStrict=b.decodeHTML=b.decodeXML=b.encodeHTML5=b.encodeHTML4=b.escapeUTF8=b.escape=b.encodeNonAsciiHTML=b.encodeHTML=b.encodeXML=b.encode=b.decodeStrict=b.decode=void 0;var vi=su(),Zp=uu();function Rv(e,t){return(!t||t<=0?vi.decodeXML:vi.decodeHTML)(e)}b.decode=Rv;function Fv(e,t){return(!t||t<=0?vi.decodeXML:vi.decodeHTMLStrict)(e)}b.decodeStrict=Fv;function bv(e,t){return(!t||t<=0?Zp.encodeXML:Zp.encodeHTML)(e)}b.encode=bv;var Wn=uu();Object.defineProperty(b,"encodeXML",{enumerable:!0,get:function(){return Wn.encodeXML}});Object.defineProperty(b,"encodeHTML",{enumerable:!0,get:function(){return Wn.encodeHTML}});Object.defineProperty(b,"encodeNonAsciiHTML",{enumerable:!0,get:function(){return Wn.encodeNonAsciiHTML}});Object.defineProperty(b,"escape",{enumerable:!0,get:function(){return Wn.escape}});Object.defineProperty(b,"escapeUTF8",{enumerable:!0,get:function(){return Wn.escapeUTF8}});Object.defineProperty(b,"encodeHTML4",{enumerable:!0,get:function(){return Wn.encodeHTML}});Object.defineProperty(b,"encodeHTML5",{enumerable:!0,get:function(){return Wn.encodeHTML}});var wn=su();Object.defineProperty(b,"decodeXML",{enumerable:!0,get:function(){return wn.decodeXML}});Object.defineProperty(b,"decodeHTML",{enumerable:!0,get:function(){return wn.decodeHTML}});Object.defineProperty(b,"decodeHTMLStrict",{enumerable:!0,get:function(){return wn.decodeHTMLStrict}});Object.defineProperty(b,"decodeHTML4",{enumerable:!0,get:function(){return wn.decodeHTML}});Object.defineProperty(b,"decodeHTML5",{enumerable:!0,get:function(){return wn.decodeHTML}});Object.defineProperty(b,"decodeHTML4Strict",{enumerable:!0,get:function(){return wn.decodeHTMLStrict}});Object.defineProperty(b,"decodeHTML5Strict",{enumerable:!0,get:function(){return wn.decodeHTMLStrict}});Object.defineProperty(b,"decodeXMLStrict",{enumerable:!0,get:function(){return wn.decodeXML}})});var cm=Ne((g1,um)=>{"use strict";function zv(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function em(e,t){for(var n=0;n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(u){throw u},f:o}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var l=!0,i=!1,s;return{s:function(){n=n.call(e)},n:function(){var u=n.next();return l=u.done,u},e:function(u){i=!0,s=u},f:function(){try{!l&&n.return!=null&&n.return()}finally{if(i)throw s}}}}function jv(e,t){if(e){if(typeof e=="string")return tm(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return tm(e,t)}}function tm(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0?e*40+55:0,i=t>0?t*40+55:0,s=n>0?n*40+55:0;r[o]=Vv([l,i,s])}function sm(e){for(var t=e.toString(16);t.length<2;)t="0"+t;return t}function Vv(e){var t=[],n=im(e),r;try{for(n.s();!(r=n.n()).done;){var o=r.value;t.push(sm(o))}}catch(l){n.e(l)}finally{n.f()}return"#"+t.join("")}function rm(e,t,n,r){var o;return t==="text"?o=Kv(n,r):t==="display"?o=$v(e,n,r):t==="xterm256Foreground"?o=Si(e,r.colors[n]):t==="xterm256Background"?o=_i(e,r.colors[n]):t==="rgb"&&(o=Gv(e,n)),o}function Gv(e,t){t=t.substring(2).slice(0,-1);var n=+t.substr(0,2),r=t.substring(5).split(";"),o=r.map(function(l){return("0"+Number(l).toString(16)).substr(-2)}).join("");return Ei(e,(n===38?"color:#":"background-color:#")+o)}function $v(e,t,n){t=parseInt(t,10);var r={"-1":function(){return"
"},0:function(){return e.length&&am(e)},1:function(){return Tn(e,"b")},3:function(){return Tn(e,"i")},4:function(){return Tn(e,"u")},8:function(){return Ei(e,"display:none")},9:function(){return Tn(e,"strike")},22:function(){return Ei(e,"font-weight:normal;text-decoration:none;font-style:normal")},23:function(){return lm(e,"i")},24:function(){return lm(e,"u")},39:function(){return Si(e,n.fg)},49:function(){return _i(e,n.bg)},53:function(){return Ei(e,"text-decoration:overline")}},o;return r[t]?o=r[t]():4"}).join("")}function yi(e,t){for(var n=[],r=e;r<=t;r++)n.push(r);return n}function Xv(e){return function(t){return(e===null||t.category!==e)&&e!=="all"}}function om(e){e=parseInt(e,10);var t=null;return e===0?t="all":e===1?t="bold":2")}function Ei(e,t){return Tn(e,"span",t)}function Si(e,t){return Tn(e,"span","color:"+t)}function _i(e,t){return Tn(e,"span","background-color:"+t)}function lm(e,t){var n;if(e.slice(-1)[0]===t&&(n=e.pop()),n)return""}function Yv(e,t,n){var r=!1,o=3;function l(){return""}function i(w,L){return n("xterm256Foreground",L),""}function s(w,L){return n("xterm256Background",L),""}function a(w){return t.newline?n("display",-1):n("text",w),""}function u(w,L){r=!0,L.trim().length===0&&(L="0"),L=L.trimRight(";").split(";");var x=im(L),D;try{for(x.s();!(D=x.n()).done;){var G=D.value;n("display",G)}}catch(U){x.e(U)}finally{x.f()}return""}function g(w){return n("text",w),""}function h(w){return n("rgb",w),""}var v=[{pattern:/^\x08+/,sub:l},{pattern:/^\x1b\[[012]?K/,sub:l},{pattern:/^\x1b\[\(B/,sub:l},{pattern:/^\x1b\[[34]8;2;\d+;\d+;\d+m/,sub:h},{pattern:/^\x1b\[38;5;(\d+)m/,sub:i},{pattern:/^\x1b\[48;5;(\d+)m/,sub:s},{pattern:/^\n/,sub:a},{pattern:/^\r+\n/,sub:a},{pattern:/^\r/,sub:a},{pattern:/^\x1b\[((?:\d{1,3};?)+|)m/,sub:u},{pattern:/^\x1b\[\d?J/,sub:l},{pattern:/^\x1b\[\d{0,3};\d{0,3}f/,sub:l},{pattern:/^\x1b\[?[\d;]{0,3}/,sub:l},{pattern:/^(([^\x1b\x08\r\n])+)/,sub:g}];function E(w,L){L>o&&r||(r=!1,e=e.replace(w.pattern,w.sub))}var _=[],k=e,M=k.length;e:for(;M>0;){for(var f=0,c=0,m=v.length;c{let l=["system","light","dark"],s=(l.indexOf(e)+1)%l.length;t(l[s])},r=()=>{switch(e){case"light":return Ee.default.createElement("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Ee.default.createElement("circle",{cx:"12",cy:"12",r:"5"}),Ee.default.createElement("line",{x1:"12",y1:"1",x2:"12",y2:"3"}),Ee.default.createElement("line",{x1:"12",y1:"21",x2:"12",y2:"23"}),Ee.default.createElement("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"}),Ee.default.createElement("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"}),Ee.default.createElement("line",{x1:"1",y1:"12",x2:"3",y2:"12"}),Ee.default.createElement("line",{x1:"21",y1:"12",x2:"23",y2:"12"}),Ee.default.createElement("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"}),Ee.default.createElement("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"}));case"dark":return Ee.default.createElement("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Ee.default.createElement("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"}));default:return Ee.default.createElement("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},Ee.default.createElement("rect",{x:"2",y:"3",width:"20",height:"14",rx:"2",ry:"2"}),Ee.default.createElement("line",{x1:"8",y1:"21",x2:"16",y2:"21"}),Ee.default.createElement("line",{x1:"12",y1:"17",x2:"12",y2:"21"}))}},o=()=>{switch(e){case"light":return"Theme: Light (click for Dark)";case"dark":return"Theme: Dark (click for System)";default:return"Theme: System (click for Light)"}};return Ee.default.createElement("button",{className:"theme-toggle-btn",onClick:n,title:o(),"aria-label":o()},r())}var Pt=J(ee(),1);var En=J(ee(),1);function kp(e,t){let[n,r]=(0,En.useState)(null),[o,l]=(0,En.useState)(!0),[i,s]=(0,En.useState)(null),a=(0,En.useCallback)(async()=>{try{l(!0),s(null);let u=await fetch(`https://api.github.com/repos/${e}/${t}`);if(!u.ok)throw new Error(`GitHub API error: ${u.status}`);let g=await u.json();r(g.stargazers_count)}catch(u){console.error("Failed to fetch GitHub stars:",u),s(u instanceof Error?u:new Error("Unknown error"))}finally{l(!1)}},[e,t]);return(0,En.useEffect)(()=>{a()},[a]),{stars:n,isLoading:o,error:i}}function Lp(e){return e<1e3?e.toString():e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}M`}function Np({username:e,repo:t,className:n=""}){let{stars:r,isLoading:o,error:l}=kp(e,t),i=`https://github.com/${e}/${t}`;return l?Pt.default.createElement("a",{href:i,target:"_blank",rel:"noopener noreferrer",title:"GitHub",className:"icon-link"},Pt.default.createElement("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor"},Pt.default.createElement("path",{d:"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"}))):Pt.default.createElement("a",{href:i,target:"_blank",rel:"noopener noreferrer",className:`github-stars-btn ${n}`,title:`Star us on GitHub${r!==null?` (${r.toLocaleString()} stars)`:""}`},Pt.default.createElement("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor",style:{marginRight:"6px"}},Pt.default.createElement("path",{d:"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"})),Pt.default.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"currentColor",style:{marginRight:"4px"}},Pt.default.createElement("path",{d:"M12 .587l3.668 7.431 8.2 1.192-5.934 5.787 1.4 8.166L12 18.896l-7.334 3.867 1.4-8.166-5.934-5.787 8.2-1.192z"})),Pt.default.createElement("span",{className:o?"stars-loading":"stars-count"},o?"...":r!==null?Lp(r):"\u2014"))}var Sn=J(ee(),1);function Ap(e){let t=(0,Sn.useRef)(null),n=(0,Sn.useRef)(null),r=(0,Sn.useRef)(null),o=(0,Sn.useRef)(0),l=(0,Sn.useRef)(null);(0,Sn.useEffect)(()=>{if(n.current||(n.current=document.createElement("canvas"),n.current.width=32,n.current.height=32),r.current||(r.current=new Image,r.current.src="claude-mem-logomark.webp"),!l.current){let h=document.querySelector('link[rel="icon"]');h&&(l.current=h.href)}let i=n.current,s=i.getContext("2d"),a=r.current;if(!s)return;let u=h=>{let v=document.querySelector('link[rel="icon"]');v||(v=document.createElement("link"),v.rel="icon",document.head.appendChild(v)),v.href=h},g=()=>{if(!a.complete){t.current=requestAnimationFrame(g);return}o.current+=2*Math.PI/90,s.clearRect(0,0,32,32),s.save(),s.translate(16,16),s.rotate(o.current),s.drawImage(a,-16,-16,32,32),s.restore(),u(i.toDataURL("image/png")),t.current=requestAnimationFrame(g)};return e?(o.current=0,g()):(t.current&&(cancelAnimationFrame(t.current),t.current=null),l.current&&u(l.current)),()=>{t.current&&(cancelAnimationFrame(t.current),t.current=null)}},[e])}function vv(e){return e==="all"?"All":e==="claude"?"Claude":e==="codex"?"Codex":e.charAt(0).toUpperCase()+e.slice(1)}function yv(e){let t=["all","claude","codex",...e];return Array.from(new Set(t.filter(Boolean)))}function Mp({isConnected:e,projects:t,sources:n,currentFilter:r,currentSource:o,onFilterChange:l,onSourceChange:i,isProcessing:s,queueDepth:a,themePreference:u,onThemeChange:g,onContextPreviewToggle:h}){Ap(s);let v=yv(n);return q.default.createElement("div",{className:"header"},q.default.createElement("div",{className:"header-main"},q.default.createElement("h1",null,q.default.createElement("div",{style:{position:"relative",display:"inline-block"}},q.default.createElement("img",{src:"claude-mem-logomark.webp",alt:"",className:`logomark ${s?"spinning":""}`}),a>0&&q.default.createElement("div",{className:"queue-bubble"},a)),q.default.createElement("span",{className:"logo-text"},"claude-mem")),q.default.createElement("div",{className:"source-tabs",role:"tablist","aria-label":"Context source tabs"},v.map(E=>q.default.createElement("button",{key:E,type:"button",className:`source-tab ${o===E?"active":""}`,onClick:()=>i(E),"aria-pressed":o===E},vv(E))))),q.default.createElement("div",{className:"status"},q.default.createElement("a",{href:"https://docs.claude-mem.ai",target:"_blank",rel:"noopener noreferrer",className:"icon-link",title:"Documentation"},q.default.createElement("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},q.default.createElement("path",{d:"M4 19.5A2.5 2.5 0 0 1 6.5 17H20"}),q.default.createElement("path",{d:"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"}))),q.default.createElement("a",{href:"https://x.com/Claude_Memory",target:"_blank",rel:"noopener noreferrer",className:"icon-link",title:"Follow us on X"},q.default.createElement("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"currentColor"},q.default.createElement("path",{d:"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"}))),q.default.createElement("a",{href:"https://discord.gg/J4wttp9vDu",target:"_blank",rel:"noopener noreferrer",className:"icon-link",title:"Join our Discord community"},q.default.createElement("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"currentColor"},q.default.createElement("path",{d:"M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0a12.64 12.64 0 0 0-.617-1.25a.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.078.078 0 0 0 .084-.028a14.09 14.09 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13.107 13.107 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10.2 10.2 0 0 0 .372-.292a.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127a12.299 12.299 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028a19.839 19.839 0 0 0 6.002-3.03a.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418z"}))),q.default.createElement(Np,{username:"thedotmack",repo:"claude-mem"}),q.default.createElement("select",{value:r,onChange:E=>l(E.target.value)},q.default.createElement("option",{value:""},"All Projects"),t.map(E=>q.default.createElement("option",{key:E,value:E},E))),q.default.createElement(Cp,{preference:u,onThemeChange:g}),q.default.createElement("button",{className:"settings-btn",onClick:h,title:"Settings"},q.default.createElement("svg",{className:"settings-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},q.default.createElement("path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"}),q.default.createElement("circle",{cx:"12",cy:"12",r:"3"})))))}var ae=J(ee(),1);var F=J(ee(),1);function Mr(e){return new Date(e).toLocaleString()}function xp(e){let t=["/Scripts/","/src/","/plugin/","/docs/"];for(let o of t){let l=e.indexOf(o);if(l!==-1)return e.substring(l+1)}let n=e.indexOf("claude-mem/");if(n!==-1)return e.substring(n+11);let r=e.split("/");return r.length>3?r.slice(-3).join("/"):e}function Op({observation:e}){let[t,n]=(0,F.useState)(!1),[r,o]=(0,F.useState)(!1),l=Mr(e.created_at_epoch),i=e.facts?JSON.parse(e.facts):[],s=e.concepts?JSON.parse(e.concepts):[],a=e.files_read?JSON.parse(e.files_read).map(xp):[],u=e.files_modified?JSON.parse(e.files_modified).map(xp):[],g=i.length>0||s.length>0||a.length>0||u.length>0;return F.default.createElement("div",{className:"card"},F.default.createElement("div",{className:"card-header"},F.default.createElement("div",{className:"card-header-left"},F.default.createElement("span",{className:`card-type type-${e.type}`},e.type),F.default.createElement("span",{className:`card-source source-${e.platform_source||"claude"}`},e.platform_source||"claude"),F.default.createElement("span",{className:"card-project"},e.project),e.merged_into_project&&F.default.createElement("span",{className:"card-merged-badge",title:`Merged into ${e.merged_into_project}`},"merged \u2192 ",e.merged_into_project)),F.default.createElement("div",{className:"view-mode-toggles"},g&&F.default.createElement("button",{className:`view-mode-toggle ${t?"active":""}`,onClick:()=>{n(!t),t||o(!1)}},F.default.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},F.default.createElement("polyline",{points:"9 11 12 14 22 4"}),F.default.createElement("path",{d:"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"})),F.default.createElement("span",null,"facts")),e.narrative&&F.default.createElement("button",{className:`view-mode-toggle ${r?"active":""}`,onClick:()=>{o(!r),r||n(!1)}},F.default.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},F.default.createElement("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),F.default.createElement("polyline",{points:"14 2 14 8 20 8"}),F.default.createElement("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),F.default.createElement("line",{x1:"16",y1:"17",x2:"8",y2:"17"})),F.default.createElement("span",null,"narrative")))),F.default.createElement("div",{className:"card-title"},e.title||"Untitled"),F.default.createElement("div",{className:"view-mode-content"},!t&&!r&&e.subtitle&&F.default.createElement("div",{className:"card-subtitle"},e.subtitle),t&&i.length>0&&F.default.createElement("ul",{className:"facts-list"},i.map((h,v)=>F.default.createElement("li",{key:v},h))),r&&e.narrative&&F.default.createElement("div",{className:"narrative"},e.narrative)),F.default.createElement("div",{className:"card-meta"},F.default.createElement("span",{className:"meta-date"},"#",e.id," \u2022 ",l),t&&(s.length>0||a.length>0||u.length>0)&&F.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px",alignItems:"center"}},s.map((h,v)=>F.default.createElement("span",{key:v,style:{padding:"2px 8px",background:"var(--color-type-badge-bg)",color:"var(--color-type-badge-text)",borderRadius:"3px",fontWeight:"500",fontSize:"10px"}},h)),a.length>0&&F.default.createElement("span",{className:"meta-files"},F.default.createElement("span",{className:"file-label"},"read:")," ",a.join(", ")),u.length>0&&F.default.createElement("span",{className:"meta-files"},F.default.createElement("span",{className:"file-label"},"modified:")," ",u.join(", ")))))}var Se=J(ee(),1);function Dp({summary:e}){let t=Mr(e.created_at_epoch),n=[{key:"investigated",label:"Investigated",content:e.investigated,icon:"/icon-thick-investigated.svg"},{key:"learned",label:"Learned",content:e.learned,icon:"/icon-thick-learned.svg"},{key:"completed",label:"Completed",content:e.completed,icon:"/icon-thick-completed.svg"},{key:"next_steps",label:"Next Steps",content:e.next_steps,icon:"/icon-thick-next-steps.svg"}].filter(r=>r.content);return Se.default.createElement("article",{className:"card summary-card"},Se.default.createElement("header",{className:"summary-card-header"},Se.default.createElement("div",{className:"summary-badge-row"},Se.default.createElement("span",{className:"card-type summary-badge"},"Session Summary"),Se.default.createElement("span",{className:`card-source source-${e.platform_source||"claude"}`},e.platform_source||"claude"),Se.default.createElement("span",{className:"summary-project-badge"},e.project)),e.request&&Se.default.createElement("h2",{className:"summary-title"},e.request)),Se.default.createElement("div",{className:"summary-sections"},n.map((r,o)=>Se.default.createElement("section",{key:r.key,className:"summary-section",style:{animationDelay:`${o*50}ms`}},Se.default.createElement("div",{className:"summary-section-header"},Se.default.createElement("img",{src:r.icon,alt:r.label,className:`summary-section-icon summary-section-icon--${r.key}`}),Se.default.createElement("h3",{className:"summary-section-label"},r.label)),Se.default.createElement("div",{className:"summary-section-content"},r.content)))),Se.default.createElement("footer",{className:"summary-card-footer"},Se.default.createElement("span",{className:"summary-meta-id"},"Session #",e.id),Se.default.createElement("span",{className:"summary-meta-divider"},"\u2022"),Se.default.createElement("time",{className:"summary-meta-date",dateTime:new Date(e.created_at_epoch).toISOString()},t)))}var It=J(ee(),1);function Pp({prompt:e}){let t=Mr(e.created_at_epoch);return It.default.createElement("div",{className:"card prompt-card"},It.default.createElement("div",{className:"card-header"},It.default.createElement("div",{className:"card-header-left"},It.default.createElement("span",{className:"card-type"},"Prompt"),It.default.createElement("span",{className:`card-source source-${e.platform_source||"claude"}`},e.platform_source||"claude"),It.default.createElement("span",{className:"card-project"},e.project))),It.default.createElement("div",{className:"card-content"},e.prompt_text),It.default.createElement("div",{className:"card-meta"},It.default.createElement("span",{className:"meta-date"},"#",e.id," \u2022 ",t)))}var _n=J(ee(),1);function Ip({targetRef:e}){let[t,n]=(0,_n.useState)(!1);(0,_n.useEffect)(()=>{let o=()=>{let i=e.current;i&&n(i.scrollTop>300)},l=e.current;if(l)return l.addEventListener("scroll",o),()=>l.removeEventListener("scroll",o)},[]);let r=()=>{let o=e.current;o&&o.scrollTo({top:0,behavior:"smooth"})};return t?_n.default.createElement("button",{onClick:r,className:"scroll-to-top","aria-label":"Scroll to top"},_n.default.createElement("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},_n.default.createElement("polyline",{points:"18 15 12 9 6 15"}))):null}var Oo={PAGINATION_PAGE_SIZE:50,LOAD_MORE_THRESHOLD:.1};function Up({observations:e,summaries:t,prompts:n,onLoadMore:r,isLoading:o,hasMore:l}){let i=(0,ae.useRef)(null),s=(0,ae.useRef)(null),a=(0,ae.useRef)(r);(0,ae.useEffect)(()=>{a.current=r},[r]),(0,ae.useEffect)(()=>{let g=i.current;if(!g)return;let h=new IntersectionObserver(v=>{v[0].isIntersecting&&l&&!o&&a.current?.()},{threshold:Oo.LOAD_MORE_THRESHOLD});return h.observe(g),()=>{g&&h.unobserve(g),h.disconnect()}},[l,o]);let u=(0,ae.useMemo)(()=>[...e.map(h=>({...h,itemType:"observation"})),...t.map(h=>({...h,itemType:"summary"})),...n.map(h=>({...h,itemType:"prompt"}))].sort((h,v)=>v.created_at_epoch-h.created_at_epoch),[e,t,n]);return ae.default.createElement("div",{className:"feed",ref:s},ae.default.createElement(Ip,{targetRef:s}),ae.default.createElement("div",{className:"feed-content"},u.map(g=>{let h=`${g.itemType}-${g.id}`;return g.itemType==="observation"?ae.default.createElement(Op,{key:h,observation:g}):g.itemType==="summary"?ae.default.createElement(Dp,{key:h,summary:g}):ae.default.createElement(Pp,{key:h,prompt:g})}),u.length===0&&!o&&ae.default.createElement("div",{style:{textAlign:"center",padding:"40px",color:"#8b949e"}},"No items to display"),o&&ae.default.createElement("div",{style:{textAlign:"center",padding:"20px",color:"#8b949e"}},ae.default.createElement("div",{className:"spinner",style:{display:"inline-block",marginRight:"10px"}}),"Loading more..."),l&&!o&&u.length>0&&ae.default.createElement("div",{ref:i,style:{height:"20px",margin:"10px 0"}}),!l&&u.length>0&&ae.default.createElement("div",{style:{textAlign:"center",padding:"20px",color:"#8b949e",fontSize:"14px"}},"No more items to load")))}var y=J(ee(),1);var ge=J(ee(),1),Cm=J(cm(),1);var{entries:Em,setPrototypeOf:fm,isFrozen:Jv,getPrototypeOf:e0,getOwnPropertyDescriptor:t0}=Object,{freeze:be,seal:mt,create:hu}=Object,{apply:vu,construct:yu}=typeof Reflect<"u"&&Reflect;be||(be=function(t){return t});mt||(mt=function(t){return t});vu||(vu=function(t,n){for(var r=arguments.length,o=new Array(r>2?r-2:0),l=2;l1?n-1:0),o=1;o1?n-1:0),o=1;o2&&arguments[2]!==void 0?arguments[2]:Ci;fm&&fm(e,null);let r=t.length;for(;r--;){let o=t[r];if(typeof o=="string"){let l=n(o);l!==o&&(Jv(t)||(t[r]=l),o=l)}e[o]=!0}return e}function s0(e){for(let t=0;t/gm),d0=mt(/\$\{[\w\W]*/gm),p0=mt(/^data-[\-\w.\u00B7-\uFFFF]+$/),m0=mt(/^aria-[\-\w]+$/),Sm=mt(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),g0=mt(/^(?:\w+script|data):/i),h0=mt(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),_m=mt(/^html$/i),v0=mt(/^[a-z][.\w]*(-[.\w]+)+$/i),vm=Object.freeze({__proto__:null,ARIA_ATTR:m0,ATTR_WHITESPACE:h0,CUSTOM_ELEMENT:v0,DATA_ATTR:p0,DOCTYPE_NAME:_m,ERB_EXPR:f0,IS_ALLOWED_URI:Sm,IS_SCRIPT_OR_DATA:g0,MUSTACHE_EXPR:c0,TMPLIT_EXPR:d0}),Fo={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},y0=function(){return typeof window>"u"?null:window},E0=function(t,n){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let r=null,o="data-tt-policy-suffix";n&&n.hasAttribute(o)&&(r=n.getAttribute(o));let l="dompurify"+(r?"#"+r:"");try{return t.createPolicy(l,{createHTML(i){return i},createScriptURL(i){return i}})}catch{return console.warn("TrustedTypes policy "+l+" could not be created."),null}},ym=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function wm(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:y0(),t=P=>wm(P);if(t.version="3.3.1",t.removed=[],!e||!e.document||e.document.nodeType!==Fo.document||!e.Element)return t.isSupported=!1,t;let{document:n}=e,r=n,o=r.currentScript,{DocumentFragment:l,HTMLTemplateElement:i,Node:s,Element:a,NodeFilter:u,NamedNodeMap:g=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:h,DOMParser:v,trustedTypes:E}=e,_=a.prototype,k=Ro(_,"cloneNode"),M=Ro(_,"remove"),f=Ro(_,"nextSibling"),c=Ro(_,"childNodes"),m=Ro(_,"parentNode");if(typeof i=="function"){let P=n.createElement("template");P.content&&P.content.ownerDocument&&(n=P.content.ownerDocument)}let d,w="",{implementation:L,createNodeIterator:x,createDocumentFragment:D,getElementsByTagName:G}=n,{importNode:U}=r,W=ym();t.isSupported=typeof Em=="function"&&typeof m=="function"&&L&&L.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:ot,ERB_EXPR:kn,TMPLIT_EXPR:Vn,DATA_ATTR:Ir,ARIA_ATTR:ke,IS_SCRIPT_OR_DATA:Ln,ATTR_WHITESPACE:He,CUSTOM_ELEMENT:Ur}=vm,{IS_ALLOWED_URI:Gn}=vm,S=null,Q=z({},[...pm,...du,...pu,...mu,...mm]),R=null,he=z({},[...gm,...gu,...hm,...Ti]),I=Object.seal(hu(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ue=null,lt=null,it=Object.seal(hu(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),wu=!0,Ai=!0,Tu=!1,Cu=!0,$n=!1,Ho=!0,Nn=!1,Mi=!1,xi=!1,Xn=!1,jo=!1,Bo=!1,ku=!0,Lu=!1,Hm="user-content-",Oi=!0,Rr=!1,Kn={},kt=null,Di=z({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Nu=null,Au=z({},["audio","video","img","source","image","track"]),Pi=null,Mu=z({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),qo="http://www.w3.org/1998/Math/MathML",Wo="http://www.w3.org/2000/svg",Ft="http://www.w3.org/1999/xhtml",Yn=Ft,Ii=!1,Ui=null,jm=z({},[qo,Wo,Ft],cu),Vo=z({},["mi","mo","mn","ms","mtext"]),Go=z({},["annotation-xml"]),Bm=z({},["title","style","font","a","script"]),Fr=null,qm=["application/xhtml+xml","text/html"],Wm="text/html",de=null,Qn=null,Vm=n.createElement("form"),xu=function(p){return p instanceof RegExp||p instanceof Function},Ri=function(){let p=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(Qn&&Qn===p)){if((!p||typeof p!="object")&&(p={}),p=Rt(p),Fr=qm.indexOf(p.PARSER_MEDIA_TYPE)===-1?Wm:p.PARSER_MEDIA_TYPE,de=Fr==="application/xhtml+xml"?cu:Ci,S=Tt(p,"ALLOWED_TAGS")?z({},p.ALLOWED_TAGS,de):Q,R=Tt(p,"ALLOWED_ATTR")?z({},p.ALLOWED_ATTR,de):he,Ui=Tt(p,"ALLOWED_NAMESPACES")?z({},p.ALLOWED_NAMESPACES,cu):jm,Pi=Tt(p,"ADD_URI_SAFE_ATTR")?z(Rt(Mu),p.ADD_URI_SAFE_ATTR,de):Mu,Nu=Tt(p,"ADD_DATA_URI_TAGS")?z(Rt(Au),p.ADD_DATA_URI_TAGS,de):Au,kt=Tt(p,"FORBID_CONTENTS")?z({},p.FORBID_CONTENTS,de):Di,ue=Tt(p,"FORBID_TAGS")?z({},p.FORBID_TAGS,de):Rt({}),lt=Tt(p,"FORBID_ATTR")?z({},p.FORBID_ATTR,de):Rt({}),Kn=Tt(p,"USE_PROFILES")?p.USE_PROFILES:!1,wu=p.ALLOW_ARIA_ATTR!==!1,Ai=p.ALLOW_DATA_ATTR!==!1,Tu=p.ALLOW_UNKNOWN_PROTOCOLS||!1,Cu=p.ALLOW_SELF_CLOSE_IN_ATTR!==!1,$n=p.SAFE_FOR_TEMPLATES||!1,Ho=p.SAFE_FOR_XML!==!1,Nn=p.WHOLE_DOCUMENT||!1,Xn=p.RETURN_DOM||!1,jo=p.RETURN_DOM_FRAGMENT||!1,Bo=p.RETURN_TRUSTED_TYPE||!1,xi=p.FORCE_BODY||!1,ku=p.SANITIZE_DOM!==!1,Lu=p.SANITIZE_NAMED_PROPS||!1,Oi=p.KEEP_CONTENT!==!1,Rr=p.IN_PLACE||!1,Gn=p.ALLOWED_URI_REGEXP||Sm,Yn=p.NAMESPACE||Ft,Vo=p.MATHML_TEXT_INTEGRATION_POINTS||Vo,Go=p.HTML_INTEGRATION_POINTS||Go,I=p.CUSTOM_ELEMENT_HANDLING||{},p.CUSTOM_ELEMENT_HANDLING&&xu(p.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(I.tagNameCheck=p.CUSTOM_ELEMENT_HANDLING.tagNameCheck),p.CUSTOM_ELEMENT_HANDLING&&xu(p.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(I.attributeNameCheck=p.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),p.CUSTOM_ELEMENT_HANDLING&&typeof p.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(I.allowCustomizedBuiltInElements=p.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),$n&&(Ai=!1),jo&&(Xn=!0),Kn&&(S=z({},mm),R=[],Kn.html===!0&&(z(S,pm),z(R,gm)),Kn.svg===!0&&(z(S,du),z(R,gu),z(R,Ti)),Kn.svgFilters===!0&&(z(S,pu),z(R,gu),z(R,Ti)),Kn.mathMl===!0&&(z(S,mu),z(R,hm),z(R,Ti))),p.ADD_TAGS&&(typeof p.ADD_TAGS=="function"?it.tagCheck=p.ADD_TAGS:(S===Q&&(S=Rt(S)),z(S,p.ADD_TAGS,de))),p.ADD_ATTR&&(typeof p.ADD_ATTR=="function"?it.attributeCheck=p.ADD_ATTR:(R===he&&(R=Rt(R)),z(R,p.ADD_ATTR,de))),p.ADD_URI_SAFE_ATTR&&z(Pi,p.ADD_URI_SAFE_ATTR,de),p.FORBID_CONTENTS&&(kt===Di&&(kt=Rt(kt)),z(kt,p.FORBID_CONTENTS,de)),p.ADD_FORBID_CONTENTS&&(kt===Di&&(kt=Rt(kt)),z(kt,p.ADD_FORBID_CONTENTS,de)),Oi&&(S["#text"]=!0),Nn&&z(S,["html","head","body"]),S.table&&(z(S,["tbody"]),delete ue.tbody),p.TRUSTED_TYPES_POLICY){if(typeof p.TRUSTED_TYPES_POLICY.createHTML!="function")throw Uo('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof p.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw Uo('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');d=p.TRUSTED_TYPES_POLICY,w=d.createHTML("")}else d===void 0&&(d=E0(E,o)),d!==null&&typeof w=="string"&&(w=d.createHTML(""));be&&be(p),Qn=p}},Ou=z({},[...du,...pu,...a0]),Du=z({},[...mu,...u0]),Gm=function(p){let C=m(p);(!C||!C.tagName)&&(C={namespaceURI:Yn,tagName:"template"});let O=Ci(p.tagName),Z=Ci(C.tagName);return Ui[p.namespaceURI]?p.namespaceURI===Wo?C.namespaceURI===Ft?O==="svg":C.namespaceURI===qo?O==="svg"&&(Z==="annotation-xml"||Vo[Z]):!!Ou[O]:p.namespaceURI===qo?C.namespaceURI===Ft?O==="math":C.namespaceURI===Wo?O==="math"&&Go[Z]:!!Du[O]:p.namespaceURI===Ft?C.namespaceURI===Wo&&!Go[Z]||C.namespaceURI===qo&&!Vo[Z]?!1:!Du[O]&&(Bm[O]||!Ou[O]):!!(Fr==="application/xhtml+xml"&&Ui[p.namespaceURI]):!1},Lt=function(p){Po(t.removed,{element:p});try{m(p).removeChild(p)}catch{M(p)}},An=function(p,C){try{Po(t.removed,{attribute:C.getAttributeNode(p),from:C})}catch{Po(t.removed,{attribute:null,from:C})}if(C.removeAttribute(p),p==="is")if(Xn||jo)try{Lt(C)}catch{}else try{C.setAttribute(p,"")}catch{}},Pu=function(p){let C=null,O=null;if(xi)p=""+p;else{let ce=fu(p,/^[\r\n\t ]+/);O=ce&&ce[0]}Fr==="application/xhtml+xml"&&Yn===Ft&&(p=''+p+"");let Z=d?d.createHTML(p):p;if(Yn===Ft)try{C=new v().parseFromString(Z,Fr)}catch{}if(!C||!C.documentElement){C=L.createDocument(Yn,"template",null);try{C.documentElement.innerHTML=Ii?w:Z}catch{}}let Le=C.body||C.documentElement;return p&&O&&Le.insertBefore(n.createTextNode(O),Le.childNodes[0]||null),Yn===Ft?G.call(C,Nn?"html":"body")[0]:Nn?C.documentElement:Le},Iu=function(p){return x.call(p.ownerDocument||p,p,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT|u.SHOW_PROCESSING_INSTRUCTION|u.SHOW_CDATA_SECTION,null)},Fi=function(p){return p instanceof h&&(typeof p.nodeName!="string"||typeof p.textContent!="string"||typeof p.removeChild!="function"||!(p.attributes instanceof g)||typeof p.removeAttribute!="function"||typeof p.setAttribute!="function"||typeof p.namespaceURI!="string"||typeof p.insertBefore!="function"||typeof p.hasChildNodes!="function")},Uu=function(p){return typeof s=="function"&&p instanceof s};function bt(P,p,C){wi(P,O=>{O.call(t,p,C,Qn)})}let Ru=function(p){let C=null;if(bt(W.beforeSanitizeElements,p,null),Fi(p))return Lt(p),!0;let O=de(p.nodeName);if(bt(W.uponSanitizeElement,p,{tagName:O,allowedTags:S}),Ho&&p.hasChildNodes()&&!Uu(p.firstElementChild)&&Fe(/<[/\w!]/g,p.innerHTML)&&Fe(/<[/\w!]/g,p.textContent)||p.nodeType===Fo.progressingInstruction||Ho&&p.nodeType===Fo.comment&&Fe(/<[/\w]/g,p.data))return Lt(p),!0;if(!(it.tagCheck instanceof Function&&it.tagCheck(O))&&(!S[O]||ue[O])){if(!ue[O]&&bu(O)&&(I.tagNameCheck instanceof RegExp&&Fe(I.tagNameCheck,O)||I.tagNameCheck instanceof Function&&I.tagNameCheck(O)))return!1;if(Oi&&!kt[O]){let Z=m(p)||p.parentNode,Le=c(p)||p.childNodes;if(Le&&Z){let ce=Le.length;for(let je=ce-1;je>=0;--je){let zt=k(Le[je],!0);zt.__removalCount=(p.__removalCount||0)+1,Z.insertBefore(zt,f(p))}}}return Lt(p),!0}return p instanceof a&&!Gm(p)||(O==="noscript"||O==="noembed"||O==="noframes")&&Fe(/<\/no(script|embed|frames)/i,p.innerHTML)?(Lt(p),!0):($n&&p.nodeType===Fo.text&&(C=p.textContent,wi([ot,kn,Vn],Z=>{C=Io(C,Z," ")}),p.textContent!==C&&(Po(t.removed,{element:p.cloneNode()}),p.textContent=C)),bt(W.afterSanitizeElements,p,null),!1)},Fu=function(p,C,O){if(ku&&(C==="id"||C==="name")&&(O in n||O in Vm))return!1;if(!(Ai&&!lt[C]&&Fe(Ir,C))){if(!(wu&&Fe(ke,C))){if(!(it.attributeCheck instanceof Function&&it.attributeCheck(C,p))){if(!R[C]||lt[C]){if(!(bu(p)&&(I.tagNameCheck instanceof RegExp&&Fe(I.tagNameCheck,p)||I.tagNameCheck instanceof Function&&I.tagNameCheck(p))&&(I.attributeNameCheck instanceof RegExp&&Fe(I.attributeNameCheck,C)||I.attributeNameCheck instanceof Function&&I.attributeNameCheck(C,p))||C==="is"&&I.allowCustomizedBuiltInElements&&(I.tagNameCheck instanceof RegExp&&Fe(I.tagNameCheck,O)||I.tagNameCheck instanceof Function&&I.tagNameCheck(O))))return!1}else if(!Pi[C]){if(!Fe(Gn,Io(O,He,""))){if(!((C==="src"||C==="xlink:href"||C==="href")&&p!=="script"&&o0(O,"data:")===0&&Nu[p])){if(!(Tu&&!Fe(Ln,Io(O,He,"")))){if(O)return!1}}}}}}}return!0},bu=function(p){return p!=="annotation-xml"&&fu(p,Ur)},zu=function(p){bt(W.beforeSanitizeAttributes,p,null);let{attributes:C}=p;if(!C||Fi(p))return;let O={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:R,forceKeepAttr:void 0},Z=C.length;for(;Z--;){let Le=C[Z],{name:ce,namespaceURI:je,value:zt}=Le,Zn=de(ce),bi=zt,_e=ce==="value"?bi:l0(bi);if(O.attrName=Zn,O.attrValue=_e,O.keepAttr=!0,O.forceKeepAttr=void 0,bt(W.uponSanitizeAttribute,p,O),_e=O.attrValue,Lu&&(Zn==="id"||Zn==="name")&&(An(ce,p),_e=Hm+_e),Ho&&Fe(/((--!?|])>)|<\/(style|title|textarea)/i,_e)){An(ce,p);continue}if(Zn==="attributename"&&fu(_e,"href")){An(ce,p);continue}if(O.forceKeepAttr)continue;if(!O.keepAttr){An(ce,p);continue}if(!Cu&&Fe(/\/>/i,_e)){An(ce,p);continue}$n&&wi([ot,kn,Vn],ju=>{_e=Io(_e,ju," ")});let Hu=de(p.nodeName);if(!Fu(Hu,Zn,_e)){An(ce,p);continue}if(d&&typeof E=="object"&&typeof E.getAttributeType=="function"&&!je)switch(E.getAttributeType(Hu,Zn)){case"TrustedHTML":{_e=d.createHTML(_e);break}case"TrustedScriptURL":{_e=d.createScriptURL(_e);break}}if(_e!==bi)try{je?p.setAttributeNS(je,ce,_e):p.setAttribute(ce,_e),Fi(p)?Lt(p):dm(t.removed)}catch{An(ce,p)}}bt(W.afterSanitizeAttributes,p,null)},$m=function P(p){let C=null,O=Iu(p);for(bt(W.beforeSanitizeShadowDOM,p,null);C=O.nextNode();)bt(W.uponSanitizeShadowNode,C,null),Ru(C),zu(C),C.content instanceof l&&P(C.content);bt(W.afterSanitizeShadowDOM,p,null)};return t.sanitize=function(P){let p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},C=null,O=null,Z=null,Le=null;if(Ii=!P,Ii&&(P=""),typeof P!="string"&&!Uu(P))if(typeof P.toString=="function"){if(P=P.toString(),typeof P!="string")throw Uo("dirty is not a string, aborting")}else throw Uo("toString is not a function");if(!t.isSupported)return P;if(Mi||Ri(p),t.removed=[],typeof P=="string"&&(Rr=!1),Rr){if(P.nodeName){let zt=de(P.nodeName);if(!S[zt]||ue[zt])throw Uo("root node is forbidden and cannot be sanitized in-place")}}else if(P instanceof s)C=Pu(""),O=C.ownerDocument.importNode(P,!0),O.nodeType===Fo.element&&O.nodeName==="BODY"||O.nodeName==="HTML"?C=O:C.appendChild(O);else{if(!Xn&&!$n&&!Nn&&P.indexOf("<")===-1)return d&&Bo?d.createHTML(P):P;if(C=Pu(P),!C)return Xn?null:Bo?w:""}C&&xi&&Lt(C.firstChild);let ce=Iu(Rr?P:C);for(;Z=ce.nextNode();)Ru(Z),zu(Z),Z.content instanceof l&&$m(Z.content);if(Rr)return P;if(Xn){if(jo)for(Le=D.call(C.ownerDocument);C.firstChild;)Le.appendChild(C.firstChild);else Le=C;return(R.shadowroot||R.shadowrootmode)&&(Le=U.call(r,Le,!0)),Le}let je=Nn?C.outerHTML:C.innerHTML;return Nn&&S["!doctype"]&&C.ownerDocument&&C.ownerDocument.doctype&&C.ownerDocument.doctype.name&&Fe(_m,C.ownerDocument.doctype.name)&&(je=" +`+je),$n&&wi([ot,kn,Vn],zt=>{je=Io(je,zt," ")}),d&&Bo?d.createHTML(je):je},t.setConfig=function(){let P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Ri(P),Mi=!0},t.clearConfig=function(){Qn=null,Mi=!1},t.isValidAttribute=function(P,p,C){Qn||Ri({});let O=de(P),Z=de(p);return Fu(O,Z,C)},t.addHook=function(P,p){typeof p=="function"&&Po(W[P],p)},t.removeHook=function(P,p){if(p!==void 0){let C=n0(W[P],p);return C===-1?void 0:r0(W[P],C,1)[0]}return dm(W[P])},t.removeHooks=function(P){W[P]=[]},t.removeAllHooks=function(){W=ym()},t}var Tm=wm();var S0=new Cm.default({fg:"#dcd6cc",bg:"#252320",newline:!1,escapeXML:!0,stream:!1});function km({content:e,isLoading:t=!1,className:n=""}){let r=(0,ge.useRef)(null),o=(0,ge.useRef)(0),[l,i]=(0,ge.useState)(!0),s=(0,ge.useMemo)(()=>{if(r.current&&(o.current=r.current.scrollTop),!e)return"";let u=S0.toHtml(e);return Tm.sanitize(u,{ALLOWED_TAGS:["span","div","br"],ALLOWED_ATTR:["style","class"],ALLOW_DATA_ATTR:!1})},[e]);return(0,ge.useLayoutEffect)(()=>{r.current&&o.current>0&&(r.current.scrollTop=o.current)},[s]),ge.default.createElement("div",{className:n,style:{backgroundColor:"var(--color-bg-card)",border:"1px solid var(--color-border-primary)",borderRadius:"8px",overflow:"hidden",height:"100%",display:"flex",flexDirection:"column",boxShadow:"0 10px 40px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.3)"}},ge.default.createElement("div",{style:{padding:"12px",borderBottom:"1px solid var(--color-border-primary)",display:"flex",gap:"6px",alignItems:"center",backgroundColor:"var(--color-bg-header)"}},ge.default.createElement("div",{style:{width:"12px",height:"12px",borderRadius:"50%",backgroundColor:"#ff5f57"}}),ge.default.createElement("div",{style:{width:"12px",height:"12px",borderRadius:"50%",backgroundColor:"#ffbd2e"}}),ge.default.createElement("div",{style:{width:"12px",height:"12px",borderRadius:"50%",backgroundColor:"#28c840"}}),ge.default.createElement("button",{onClick:()=>i(!l),style:{marginLeft:"auto",padding:"4px 8px",fontSize:"11px",fontWeight:500,color:l?"var(--color-text-secondary)":"var(--color-accent-primary)",backgroundColor:"transparent",border:"1px solid",borderColor:l?"var(--color-border-primary)":"var(--color-accent-primary)",borderRadius:"4px",cursor:"pointer",transition:"all 0.2s",whiteSpace:"nowrap"},onMouseEnter:u=>{u.currentTarget.style.borderColor="var(--color-accent-primary)",u.currentTarget.style.color="var(--color-accent-primary)"},onMouseLeave:u=>{u.currentTarget.style.borderColor=l?"var(--color-border-primary)":"var(--color-accent-primary)",u.currentTarget.style.color=l?"var(--color-text-secondary)":"var(--color-accent-primary)"},title:l?"Disable word wrap (scroll horizontally)":"Enable word wrap"},l?"\u2922 Wrap":"\u21C4 Scroll")),t?ge.default.createElement("div",{style:{padding:"16px",fontFamily:"var(--font-terminal)",fontSize:"12px",color:"var(--color-text-secondary)"}},"Loading preview..."):ge.default.createElement("div",{style:{position:"relative",flex:1,overflow:"hidden"}},ge.default.createElement("pre",{ref:r,style:{padding:"16px",margin:0,fontFamily:"var(--font-terminal)",fontSize:"12px",lineHeight:"1.6",overflow:"auto",color:"var(--color-text-primary)",backgroundColor:"var(--color-bg-card)",whiteSpace:l?"pre-wrap":"pre",wordBreak:l?"break-word":"normal",position:"absolute",inset:0},dangerouslySetInnerHTML:{__html:s}})))}var Xe=J(ee(),1);function tt(e,t){let n=window.__CLAUDE_MEM_AUTH_TOKEN__;if(!n)return fetch(e,t);let r=new Headers(t?.headers);return r.set("Authorization",`Bearer ${n}`),fetch(e,{...t,headers:r})}function _0(e){return e.includes("claude")?"claude":e.includes("codex")?"codex":e[0]||null}function w0(e){let t=["claude","codex",...e];return Array.from(new Set(t))}function Lm(e){let[t,n]=(0,Xe.useState)(""),[r,o]=(0,Xe.useState)(!1),[l,i]=(0,Xe.useState)(null),[s,a]=(0,Xe.useState)({projects:[],sources:[],projectsBySource:{}}),[u,g]=(0,Xe.useState)([]),[h,v]=(0,Xe.useState)(null),[E,_]=(0,Xe.useState)(null);(0,Xe.useEffect)(()=>{async function M(){let f;try{f=await(await tt("/api/projects")).json()}catch(d){console.error("Failed to fetch projects:",d instanceof Error?d.message:String(d));return}let c={projects:f.projects||[],sources:w0(f.sources||[]),projectsBySource:f.projectsBySource||{}};a(c);let m=_0(c.sources);if(v(m),m){let d=c.projectsBySource[m]||[];g(d),_(d[0]||null);return}g(c.projects),_(c.projects[0]||null)}M()},[]),(0,Xe.useEffect)(()=>{if(!h){g(s.projects),_(f=>f&&s.projects.includes(f)?f:s.projects[0]||null);return}let M=s.projectsBySource[h]||[];g(M),_(f=>f&&M.includes(f)?f:M[0]||null)},[s,h]);let k=(0,Xe.useCallback)(async()=>{if(!E){n("No project selected");return}o(!0),i(null);let M=new URLSearchParams({project:E});h&&M.append("platformSource",h);try{let f=await tt(`/api/context/preview?${M}`),c=await f.text();f.ok?n(c):i("Failed to load preview")}catch(f){console.error("Failed to load context preview:",f instanceof Error?f.message:String(f)),i("Failed to load preview")}o(!1)},[E,h]);return(0,Xe.useEffect)(()=>{let M=setTimeout(()=>{k()},300);return()=>clearTimeout(M)},[e,k]),{preview:t,isLoading:r,error:l,refresh:k,projects:u,sources:s.sources,selectedSource:h,setSelectedSource:v,selectedProject:E,setSelectedProject:_}}function Eu({title:e,description:t,children:n,defaultOpen:r=!0}){let[o,l]=(0,y.useState)(r);return y.default.createElement("div",{className:`settings-section-collapsible ${o?"open":""}`},y.default.createElement("button",{className:"section-header-btn",onClick:()=>l(!o),type:"button"},y.default.createElement("div",{className:"section-header-content"},y.default.createElement("span",{className:"section-title"},e),t&&y.default.createElement("span",{className:"section-description"},t)),y.default.createElement("svg",{className:`chevron-icon ${o?"rotated":""}`,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2"},y.default.createElement("polyline",{points:"6 9 12 15 18 9"}))),o&&y.default.createElement("div",{className:"section-content"},n))}function nt({label:e,tooltip:t,children:n}){return y.default.createElement("div",{className:"form-field"},y.default.createElement("label",{className:"form-field-label"},e,t&&y.default.createElement("span",{className:"tooltip-trigger",title:t},y.default.createElement("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2"},y.default.createElement("circle",{cx:"12",cy:"12",r:"10"}),y.default.createElement("path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"}),y.default.createElement("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})))),n)}function xr({id:e,label:t,description:n,checked:r,onChange:o,disabled:l}){return y.default.createElement("div",{className:"toggle-row"},y.default.createElement("div",{className:"toggle-info"},y.default.createElement("label",{htmlFor:e,className:"toggle-label"},t),n&&y.default.createElement("span",{className:"toggle-description"},n)),y.default.createElement("button",{type:"button",id:e,role:"switch","aria-checked":r,className:`toggle-switch ${r?"on":""} ${l?"disabled":""}`,onClick:()=>!l&&o(!r),disabled:l},y.default.createElement("span",{className:"toggle-knob"})))}function Nm({isOpen:e,onClose:t,settings:n,onSave:r,isSaving:o,saveStatus:l}){let[i,s]=(0,y.useState)(n);(0,y.useEffect)(()=>{s(n)},[n]);let{preview:a,isLoading:u,error:g,projects:h,sources:v,selectedSource:E,setSelectedSource:_,selectedProject:k,setSelectedProject:M}=Lm(i),f=(0,y.useCallback)((d,w)=>{let L={...i,[d]:w};s(L)},[i]),c=(0,y.useCallback)(()=>{r(i)},[i,r]),m=(0,y.useCallback)(d=>{let L=i[d]==="true"?"false":"true";f(d,L)},[i,f]);return(0,y.useEffect)(()=>{let d=w=>{w.key==="Escape"&&t()};if(e)return window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)},[e,t]),e?y.default.createElement("div",{className:"modal-backdrop",onClick:t},y.default.createElement("div",{className:"context-settings-modal",onClick:d=>d.stopPropagation()},y.default.createElement("div",{className:"modal-header"},y.default.createElement("h2",null,"Settings"),y.default.createElement("div",{className:"header-controls"},y.default.createElement("label",{className:"preview-selector"},"Source:",y.default.createElement("select",{value:E||"",onChange:d=>_(d.target.value),disabled:v.length===0},v.map(d=>y.default.createElement("option",{key:d,value:d},d)))),y.default.createElement("label",{className:"preview-selector"},"Project:",y.default.createElement("select",{value:k||"",onChange:d=>M(d.target.value),disabled:h.length===0},h.map(d=>y.default.createElement("option",{key:d,value:d},d)))),y.default.createElement("button",{onClick:t,className:"modal-close-btn",title:"Close (Esc)"},y.default.createElement("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2"},y.default.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),y.default.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"}))))),y.default.createElement("div",{className:"modal-body"},y.default.createElement("div",{className:"preview-column"},y.default.createElement("div",{className:"preview-content"},g?y.default.createElement("div",{style:{color:"#ff6b6b"}},"Error loading preview: ",g):y.default.createElement(km,{content:a,isLoading:u}))),y.default.createElement("div",{className:"settings-column"},y.default.createElement(Eu,{title:"Loading",description:"How many observations to inject"},y.default.createElement(nt,{label:"Observations",tooltip:"Number of recent observations to include in context (1-200)"},y.default.createElement("input",{type:"number",min:"1",max:"200",value:i.CLAUDE_MEM_CONTEXT_OBSERVATIONS||"50",onChange:d=>f("CLAUDE_MEM_CONTEXT_OBSERVATIONS",d.target.value)})),y.default.createElement(nt,{label:"Sessions",tooltip:"Number of recent sessions to pull observations from (1-50)"},y.default.createElement("input",{type:"number",min:"1",max:"50",value:i.CLAUDE_MEM_CONTEXT_SESSION_COUNT||"10",onChange:d=>f("CLAUDE_MEM_CONTEXT_SESSION_COUNT",d.target.value)}))),y.default.createElement(Eu,{title:"Display",description:"What to show in context tables"},y.default.createElement("div",{className:"display-subsection"},y.default.createElement("span",{className:"subsection-label"},"Full Observations"),y.default.createElement(nt,{label:"Count",tooltip:"How many observations show expanded details (0-20)"},y.default.createElement("input",{type:"number",min:"0",max:"20",value:i.CLAUDE_MEM_CONTEXT_FULL_COUNT||"5",onChange:d=>f("CLAUDE_MEM_CONTEXT_FULL_COUNT",d.target.value)})),y.default.createElement(nt,{label:"Field",tooltip:"Which field to expand for full observations"},y.default.createElement("select",{value:i.CLAUDE_MEM_CONTEXT_FULL_FIELD||"narrative",onChange:d=>f("CLAUDE_MEM_CONTEXT_FULL_FIELD",d.target.value)},y.default.createElement("option",{value:"narrative"},"Narrative"),y.default.createElement("option",{value:"facts"},"Facts")))),y.default.createElement("div",{className:"display-subsection"},y.default.createElement("span",{className:"subsection-label"},"Token Economics"),y.default.createElement("div",{className:"toggle-group"},y.default.createElement(xr,{id:"show-read-tokens",label:"Read cost",description:"Tokens to read this observation",checked:i.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS==="true",onChange:()=>m("CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS")}),y.default.createElement(xr,{id:"show-work-tokens",label:"Work investment",description:"Tokens spent creating this observation",checked:i.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS==="true",onChange:()=>m("CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS")}),y.default.createElement(xr,{id:"show-savings-amount",label:"Savings",description:"Total tokens saved by reusing context",checked:i.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT==="true",onChange:()=>m("CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT")})))),y.default.createElement(Eu,{title:"Advanced",description:"AI provider and model selection",defaultOpen:!1},y.default.createElement(nt,{label:"AI Provider",tooltip:"Choose between Claude (via Agent SDK) or Gemini (via REST API)"},y.default.createElement("select",{value:i.CLAUDE_MEM_PROVIDER||"claude",onChange:d=>f("CLAUDE_MEM_PROVIDER",d.target.value)},y.default.createElement("option",{value:"claude"},"Claude (uses your Claude account)"),y.default.createElement("option",{value:"gemini"},"Gemini (uses API key)"),y.default.createElement("option",{value:"openrouter"},"OpenRouter (multi-model)"))),i.CLAUDE_MEM_PROVIDER==="claude"&&y.default.createElement(nt,{label:"Claude Model",tooltip:"Claude model used for generating observations"},y.default.createElement("select",{value:i.CLAUDE_MEM_MODEL||"haiku",onChange:d=>f("CLAUDE_MEM_MODEL",d.target.value)},y.default.createElement("option",{value:"haiku"},"haiku (fastest)"),y.default.createElement("option",{value:"sonnet"},"sonnet (balanced)"),y.default.createElement("option",{value:"opus"},"opus (highest quality)"))),i.CLAUDE_MEM_PROVIDER==="gemini"&&y.default.createElement(y.default.Fragment,null,y.default.createElement(nt,{label:"Gemini API Key",tooltip:"Your Google AI Studio API key (or set GEMINI_API_KEY env var)"},y.default.createElement("input",{type:"password",value:i.CLAUDE_MEM_GEMINI_API_KEY||"",onChange:d=>f("CLAUDE_MEM_GEMINI_API_KEY",d.target.value),placeholder:"Enter Gemini API key..."})),y.default.createElement(nt,{label:"Gemini Model",tooltip:"Gemini model used for generating observations"},y.default.createElement("select",{value:i.CLAUDE_MEM_GEMINI_MODEL||"gemini-2.5-flash-lite",onChange:d=>f("CLAUDE_MEM_GEMINI_MODEL",d.target.value)},y.default.createElement("option",{value:"gemini-2.5-flash-lite"},"gemini-2.5-flash-lite (10 RPM free)"),y.default.createElement("option",{value:"gemini-2.5-flash"},"gemini-2.5-flash (5 RPM free)"),y.default.createElement("option",{value:"gemini-3-flash-preview"},"gemini-3-flash-preview (5 RPM free)"))),y.default.createElement("div",{className:"toggle-group",style:{marginTop:"8px"}},y.default.createElement(xr,{id:"gemini-rate-limiting",label:"Rate Limiting",description:"Enable for free tier (10-30 RPM). Disable if you have billing set up (1000+ RPM).",checked:i.CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED==="true",onChange:d=>f("CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED",d?"true":"false")}))),i.CLAUDE_MEM_PROVIDER==="openrouter"&&y.default.createElement(y.default.Fragment,null,y.default.createElement(nt,{label:"OpenRouter API Key",tooltip:"Your OpenRouter API key from openrouter.ai (or set OPENROUTER_API_KEY env var)"},y.default.createElement("input",{type:"password",value:i.CLAUDE_MEM_OPENROUTER_API_KEY||"",onChange:d=>f("CLAUDE_MEM_OPENROUTER_API_KEY",d.target.value),placeholder:"Enter OpenRouter API key..."})),y.default.createElement(nt,{label:"OpenRouter Model",tooltip:"Model identifier from OpenRouter (e.g., anthropic/claude-3.5-sonnet, google/gemini-2.0-flash-thinking-exp)"},y.default.createElement("input",{type:"text",value:i.CLAUDE_MEM_OPENROUTER_MODEL||"xiaomi/mimo-v2-flash:free",onChange:d=>f("CLAUDE_MEM_OPENROUTER_MODEL",d.target.value),placeholder:"e.g., xiaomi/mimo-v2-flash:free"})),y.default.createElement(nt,{label:"Site URL (Optional)",tooltip:"Your site URL for OpenRouter analytics (optional)"},y.default.createElement("input",{type:"text",value:i.CLAUDE_MEM_OPENROUTER_SITE_URL||"",onChange:d=>f("CLAUDE_MEM_OPENROUTER_SITE_URL",d.target.value),placeholder:"https://yoursite.com"})),y.default.createElement(nt,{label:"App Name (Optional)",tooltip:"Your app name for OpenRouter analytics (optional)"},y.default.createElement("input",{type:"text",value:i.CLAUDE_MEM_OPENROUTER_APP_NAME||"claude-mem",onChange:d=>f("CLAUDE_MEM_OPENROUTER_APP_NAME",d.target.value),placeholder:"claude-mem"}))),y.default.createElement(nt,{label:"Worker Port",tooltip:"Port for the background worker service"},y.default.createElement("input",{type:"number",min:"1024",max:"65535",value:i.CLAUDE_MEM_WORKER_PORT||"37777",onChange:d=>f("CLAUDE_MEM_WORKER_PORT",d.target.value)})),y.default.createElement("div",{className:"toggle-group",style:{marginTop:"12px"}},y.default.createElement(xr,{id:"show-last-summary",label:"Include last summary",description:"Add previous session's summary to context",checked:i.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY==="true",onChange:()=>m("CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY")}),y.default.createElement(xr,{id:"show-last-message",label:"Include last message",description:"Add previous session's final message",checked:i.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE==="true",onChange:()=>m("CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE")}))))),y.default.createElement("div",{className:"modal-footer"},y.default.createElement("div",{className:"save-status"},l&&y.default.createElement("span",{className:l.includes("\u2713")?"success":l.includes("\u2717")?"error":""},l)),y.default.createElement("button",{className:"save-btn",onClick:c,disabled:o},o?"Saving...":"Save")))):null}var N=J(ee(),1);var bo=[{key:"DEBUG",label:"Debug",icon:"\u{1F50D}",color:"#8b8b8b"},{key:"INFO",label:"Info",icon:"\u2139\uFE0F",color:"#58a6ff"},{key:"WARN",label:"Warn",icon:"\u26A0\uFE0F",color:"#d29922"},{key:"ERROR",label:"Error",icon:"\u274C",color:"#f85149"}],zo=[{key:"HOOK",label:"Hook",icon:"\u{1FA9D}",color:"#a371f7"},{key:"WORKER",label:"Worker",icon:"\u2699\uFE0F",color:"#58a6ff"},{key:"SDK",label:"SDK",icon:"\u{1F4E6}",color:"#3fb950"},{key:"PARSER",label:"Parser",icon:"\u{1F4C4}",color:"#79c0ff"},{key:"DB",label:"DB",icon:"\u{1F5C4}\uFE0F",color:"#f0883e"},{key:"SYSTEM",label:"System",icon:"\u{1F4BB}",color:"#8b949e"},{key:"HTTP",label:"HTTP",icon:"\u{1F310}",color:"#39d353"},{key:"SESSION",label:"Session",icon:"\u{1F4CB}",color:"#db61a2"},{key:"CHROMA",label:"Chroma",icon:"\u{1F52E}",color:"#a855f7"}];function T0(e){let t=/^\[([^\]]+)\]\s+\[(\w+)\s*\]\s+\[(\w+)\s*\]\s+(?:\[([^\]]+)\]\s+)?(.*)$/,n=e.match(t);if(!n)return{raw:e};let[,r,o,l,i,s]=n,a;return s.startsWith("\u2192")?a="dataIn":s.startsWith("\u2190")?a="dataOut":s.startsWith("\u2713")?a="success":s.startsWith("\u2717")?a="failure":s.startsWith("\u23F1")?a="timing":s.includes("[HAPPY-PATH]")&&(a="happyPath"),{raw:e,timestamp:r,level:o?.trim(),component:l?.trim(),correlationId:i||void 0,message:s,isSpecial:a}}function Am({isOpen:e,onClose:t}){let[n,r]=(0,N.useState)(""),[o,l]=(0,N.useState)(!1),[i,s]=(0,N.useState)(null),[a,u]=(0,N.useState)(!1),[g,h]=(0,N.useState)(350),[v,E]=(0,N.useState)(!1),_=(0,N.useRef)(0),k=(0,N.useRef)(0),M=(0,N.useRef)(null),f=(0,N.useRef)(!0),[c,m]=(0,N.useState)(new Set(["DEBUG","INFO","WARN","ERROR"])),[d,w]=(0,N.useState)(new Set(["HOOK","WORKER","SDK","PARSER","DB","SYSTEM","HTTP","SESSION","CHROMA"])),[L,x]=(0,N.useState)(!1),D=(0,N.useMemo)(()=>n?n.split(` +`).map(T0):[],[n]),G=(0,N.useMemo)(()=>D.filter(S=>L?S.raw.includes("[ALIGNMENT]"):!S.level||!S.component?!0:c.has(S.level)&&d.has(S.component)),[D,c,d,L]),U=(0,N.useCallback)(()=>{if(!M.current)return!0;let{scrollTop:S,scrollHeight:Q,clientHeight:R}=M.current;return Q-S-R<50},[]),W=(0,N.useCallback)(()=>{M.current&&f.current&&(M.current.scrollTop=M.current.scrollHeight)},[]),ot=(0,N.useCallback)(async()=>{f.current=U(),l(!0),s(null);try{let S=await tt("/api/logs");if(!S.ok)throw new Error(`Failed to fetch logs: ${S.statusText}`);let Q=await S.json();r(Q.logs||"")}catch(S){s(S instanceof Error?S.message:"Unknown error")}finally{l(!1)}},[U]);(0,N.useEffect)(()=>{W()},[n,W]);let kn=(0,N.useCallback)(async()=>{if(confirm("Are you sure you want to clear all logs?")){l(!0),s(null);try{let S=await tt("/api/logs/clear",{method:"POST"});if(!S.ok)throw new Error(`Failed to clear logs: ${S.statusText}`);r("")}catch(S){s(S instanceof Error?S.message:"Unknown error")}finally{l(!1)}}},[]),Vn=(0,N.useCallback)(S=>{S.preventDefault(),E(!0),_.current=S.clientY,k.current=g},[g]);(0,N.useEffect)(()=>{if(!v)return;let S=R=>{let he=_.current-R.clientY,I=Math.min(Math.max(150,k.current+he),window.innerHeight-100);h(I)},Q=()=>{E(!1)};return document.addEventListener("mousemove",S),document.addEventListener("mouseup",Q),()=>{document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",Q)}},[v]),(0,N.useEffect)(()=>{e&&(f.current=!0,ot())},[e,ot]),(0,N.useEffect)(()=>{if(!e||!a)return;let S=setInterval(ot,2e3);return()=>clearInterval(S)},[e,a,ot]);let Ir=(0,N.useCallback)(S=>{m(Q=>{let R=new Set(Q);return R.has(S)?R.delete(S):R.add(S),R})},[]),ke=(0,N.useCallback)(S=>{w(Q=>{let R=new Set(Q);return R.has(S)?R.delete(S):R.add(S),R})},[]),Ln=(0,N.useCallback)(S=>{m(S?new Set(["DEBUG","INFO","WARN","ERROR"]):new Set)},[]),He=(0,N.useCallback)(S=>{w(S?new Set(["HOOK","WORKER","SDK","PARSER","DB","SYSTEM","HTTP","SESSION","CHROMA"]):new Set)},[]);if(!e)return null;let Ur=S=>{let Q=bo.find(lt=>lt.key===S.level),R=zo.find(lt=>lt.key===S.component),he="var(--color-text-primary)",I="normal",ue="transparent";return S.level==="ERROR"?(he="#f85149",ue="rgba(248, 81, 73, 0.1)"):S.level==="WARN"?(he="#d29922",ue="rgba(210, 153, 34, 0.05)"):S.isSpecial==="success"?he="#3fb950":S.isSpecial==="failure"?he="#f85149":S.isSpecial==="happyPath"?he="#d29922":Q&&(he=Q.color),{color:he,fontWeight:I,backgroundColor:ue,padding:"1px 0",borderRadius:"2px"}},Gn=(S,Q)=>{if(!S.timestamp)return N.default.createElement("div",{key:Q,className:"log-line log-line-raw"},S.raw);let R=bo.find(I=>I.key===S.level),he=zo.find(I=>I.key===S.component);return N.default.createElement("div",{key:Q,className:"log-line",style:Ur(S)},N.default.createElement("span",{className:"log-timestamp"},"[",S.timestamp,"]")," ",N.default.createElement("span",{className:"log-level",style:{color:R?.color},title:S.level},"[",R?.icon||""," ",S.level?.padEnd(5),"]")," ",N.default.createElement("span",{className:"log-component",style:{color:he?.color},title:S.component},"[",he?.icon||""," ",S.component?.padEnd(7),"]")," ",S.correlationId&&N.default.createElement(N.default.Fragment,null,N.default.createElement("span",{className:"log-correlation"},"[",S.correlationId,"]")," "),N.default.createElement("span",{className:"log-message"},S.message))};return N.default.createElement("div",{className:"console-drawer",style:{height:`${g}px`}},N.default.createElement("div",{className:"console-resize-handle",onMouseDown:Vn},N.default.createElement("div",{className:"console-resize-bar"})),N.default.createElement("div",{className:"console-header"},N.default.createElement("div",{className:"console-tabs"},N.default.createElement("div",{className:"console-tab active"},"Console")),N.default.createElement("div",{className:"console-controls"},N.default.createElement("label",{className:"console-auto-refresh"},N.default.createElement("input",{type:"checkbox",checked:a,onChange:S=>u(S.target.checked)}),"Auto-refresh"),N.default.createElement("button",{className:"console-control-btn",onClick:ot,disabled:o,title:"Refresh logs"},"\u21BB"),N.default.createElement("button",{className:"console-control-btn",onClick:()=>{f.current=!0,W()},title:"Scroll to bottom"},"\u2B07"),N.default.createElement("button",{className:"console-control-btn console-clear-btn",onClick:kn,disabled:o,title:"Clear logs"},"\u{1F5D1}"),N.default.createElement("button",{className:"console-control-btn",onClick:t,title:"Close console"},"\u2715"))),N.default.createElement("div",{className:"console-filters"},N.default.createElement("div",{className:"console-filter-section"},N.default.createElement("span",{className:"console-filter-label"},"Quick:"),N.default.createElement("div",{className:"console-filter-chips"},N.default.createElement("button",{className:`console-filter-chip ${L?"active":""}`,onClick:()=>x(!L),style:{"--chip-color":"#f0883e"},title:"Show only session alignment logs"},"\u{1F517} Alignment"))),N.default.createElement("div",{className:"console-filter-section"},N.default.createElement("span",{className:"console-filter-label"},"Levels:"),N.default.createElement("div",{className:"console-filter-chips"},bo.map(S=>N.default.createElement("button",{key:S.key,className:`console-filter-chip ${c.has(S.key)?"active":""}`,onClick:()=>Ir(S.key),style:{"--chip-color":S.color},title:S.label},S.icon," ",S.label)),N.default.createElement("button",{className:"console-filter-action",onClick:()=>Ln(c.size===0),title:c.size===bo.length?"Select none":"Select all"},c.size===bo.length?"\u25CB":"\u25CF"))),N.default.createElement("div",{className:"console-filter-section"},N.default.createElement("span",{className:"console-filter-label"},"Components:"),N.default.createElement("div",{className:"console-filter-chips"},zo.map(S=>N.default.createElement("button",{key:S.key,className:`console-filter-chip ${d.has(S.key)?"active":""}`,onClick:()=>ke(S.key),style:{"--chip-color":S.color},title:S.label},S.icon," ",S.label)),N.default.createElement("button",{className:"console-filter-action",onClick:()=>He(d.size===0),title:d.size===zo.length?"Select none":"Select all"},d.size===zo.length?"\u25CB":"\u25CF")))),i&&N.default.createElement("div",{className:"console-error"},"\u26A0 ",i),N.default.createElement("div",{className:"console-content",ref:M},N.default.createElement("div",{className:"console-logs"},G.length===0?N.default.createElement("div",{className:"log-line log-line-empty"},"No logs available"):G.map((S,Q)=>Gn(S,Q)))))}var rt=J(ee(),1);var Ct={OBSERVATIONS:"/api/observations",SUMMARIES:"/api/summaries",PROMPTS:"/api/prompts",SETTINGS:"/api/settings",STATS:"/api/stats",PROCESSING_STATUS:"/api/processing-status",STREAM:"/stream"};var ki={SSE_RECONNECT_DELAY_MS:3e3,STATS_REFRESH_INTERVAL_MS:1e4,SAVE_STATUS_DISPLAY_DURATION_MS:3e3};function Mm(){let[e,t]=(0,rt.useState)([]),[n,r]=(0,rt.useState)([]),[o,l]=(0,rt.useState)([]),[i,s]=(0,rt.useState)({projects:[],sources:[],projectsBySource:{}}),[a,u]=(0,rt.useState)(!1),[g,h]=(0,rt.useState)(!1),[v,E]=(0,rt.useState)(0),_=(0,rt.useRef)(null),k=(0,rt.useRef)(),M=(f,c)=>{s(m=>{let d=m.projects.includes(f)?m.projects:[...m.projects,f],w=m.sources.includes(c)?m.sources:[...m.sources,c],L=m.projectsBySource[c]||[];return{projects:d,sources:w,projectsBySource:{...m.projectsBySource,[c]:L.includes(f)?L:[...L,f]}}})};return(0,rt.useEffect)(()=>{let f=()=>{_.current&&_.current.close();let c=new EventSource(Ct.STREAM);_.current=c,c.onopen=()=>{console.log("[SSE] Connected"),u(!0),k.current&&clearTimeout(k.current)},c.onerror=m=>{console.error("[SSE] Connection error:",m),u(!1),c.close(),k.current=setTimeout(()=>{k.current=void 0,console.log("[SSE] Attempting to reconnect..."),f()},ki.SSE_RECONNECT_DELAY_MS)},c.onmessage=m=>{let d=JSON.parse(m.data);switch(d.type){case"initial_load":console.log("[SSE] Initial load:",{projects:d.projects?.length||0,sources:d.sources?.length||0}),s({projects:d.projects||[],sources:d.sources||[],projectsBySource:d.projectsBySource||{}});break;case"new_observation":d.observation&&(console.log("[SSE] New observation:",d.observation.id),M(d.observation.project,d.observation.platform_source||"claude"),t(w=>[d.observation,...w]));break;case"new_summary":d.summary&&(console.log("[SSE] New summary:",d.summary.id),M(d.summary.project,d.summary.platform_source||"claude"),r(w=>[d.summary,...w]));break;case"new_prompt":d.prompt&&(console.log("[SSE] New prompt:",d.prompt.id),M(d.prompt.project,d.prompt.platform_source||"claude"),l(w=>[d.prompt,...w]));break;case"processing_status":typeof d.isProcessing=="boolean"&&(console.log("[SSE] Processing status:",d.isProcessing,"Queue depth:",d.queueDepth),h(d.isProcessing),E(d.queueDepth||0));break}}};return f(),()=>{_.current&&_.current.close(),k.current&&clearTimeout(k.current)}},[]),{observations:e,summaries:n,prompts:o,projects:i.projects,sources:i.sources,projectsBySource:i.projectsBySource,isProcessing:g,queueDepth:v,isConnected:a}}var Or=J(ee(),1);var le={CLAUDE_MEM_MODEL:"claude-sonnet-4-6",CLAUDE_MEM_CONTEXT_OBSERVATIONS:"50",CLAUDE_MEM_WORKER_PORT:"37777",CLAUDE_MEM_WORKER_HOST:"127.0.0.1",CLAUDE_MEM_PROVIDER:"claude",CLAUDE_MEM_GEMINI_API_KEY:"",CLAUDE_MEM_GEMINI_MODEL:"gemini-2.5-flash-lite",CLAUDE_MEM_OPENROUTER_API_KEY:"",CLAUDE_MEM_OPENROUTER_MODEL:"xiaomi/mimo-v2-flash:free",CLAUDE_MEM_OPENROUTER_SITE_URL:"",CLAUDE_MEM_OPENROUTER_APP_NAME:"claude-mem",CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:"true",CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:"false",CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:"true",CLAUDE_MEM_CONTEXT_FULL_COUNT:"0",CLAUDE_MEM_CONTEXT_FULL_FIELD:"narrative",CLAUDE_MEM_CONTEXT_SESSION_COUNT:"10",CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:"true",CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:"false",CLAUDE_MEM_EXCLUDED_PROJECTS:"",CLAUDE_MEM_FOLDER_MD_EXCLUDE:"[]"};function xm(){let[e,t]=(0,Or.useState)(le),[n,r]=(0,Or.useState)(!1),[o,l]=(0,Or.useState)("");return(0,Or.useEffect)(()=>{tt(Ct.SETTINGS).then(async s=>{if(!s.ok)throw new Error(`Failed to load settings (${s.status})`);return s.json()}).then(s=>{t({CLAUDE_MEM_MODEL:s.CLAUDE_MEM_MODEL??le.CLAUDE_MEM_MODEL,CLAUDE_MEM_CONTEXT_OBSERVATIONS:s.CLAUDE_MEM_CONTEXT_OBSERVATIONS??le.CLAUDE_MEM_CONTEXT_OBSERVATIONS,CLAUDE_MEM_WORKER_PORT:s.CLAUDE_MEM_WORKER_PORT??le.CLAUDE_MEM_WORKER_PORT,CLAUDE_MEM_WORKER_HOST:s.CLAUDE_MEM_WORKER_HOST??le.CLAUDE_MEM_WORKER_HOST,CLAUDE_MEM_PROVIDER:s.CLAUDE_MEM_PROVIDER??le.CLAUDE_MEM_PROVIDER,CLAUDE_MEM_GEMINI_API_KEY:s.CLAUDE_MEM_GEMINI_API_KEY??le.CLAUDE_MEM_GEMINI_API_KEY,CLAUDE_MEM_GEMINI_MODEL:s.CLAUDE_MEM_GEMINI_MODEL??le.CLAUDE_MEM_GEMINI_MODEL,CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED:s.CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED??le.CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED,CLAUDE_MEM_OPENROUTER_API_KEY:s.CLAUDE_MEM_OPENROUTER_API_KEY??le.CLAUDE_MEM_OPENROUTER_API_KEY,CLAUDE_MEM_OPENROUTER_MODEL:s.CLAUDE_MEM_OPENROUTER_MODEL??le.CLAUDE_MEM_OPENROUTER_MODEL,CLAUDE_MEM_OPENROUTER_SITE_URL:s.CLAUDE_MEM_OPENROUTER_SITE_URL??le.CLAUDE_MEM_OPENROUTER_SITE_URL,CLAUDE_MEM_OPENROUTER_APP_NAME:s.CLAUDE_MEM_OPENROUTER_APP_NAME??le.CLAUDE_MEM_OPENROUTER_APP_NAME,CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS:s.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS??le.CLAUDE_MEM_CONTEXT_SHOW_READ_TOKENS,CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS:s.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS??le.CLAUDE_MEM_CONTEXT_SHOW_WORK_TOKENS,CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT:s.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT??le.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_AMOUNT,CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT:s.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT??le.CLAUDE_MEM_CONTEXT_SHOW_SAVINGS_PERCENT,CLAUDE_MEM_CONTEXT_FULL_COUNT:s.CLAUDE_MEM_CONTEXT_FULL_COUNT??le.CLAUDE_MEM_CONTEXT_FULL_COUNT,CLAUDE_MEM_CONTEXT_FULL_FIELD:s.CLAUDE_MEM_CONTEXT_FULL_FIELD??le.CLAUDE_MEM_CONTEXT_FULL_FIELD,CLAUDE_MEM_CONTEXT_SESSION_COUNT:s.CLAUDE_MEM_CONTEXT_SESSION_COUNT??le.CLAUDE_MEM_CONTEXT_SESSION_COUNT,CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY:s.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY??le.CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY,CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE:s.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE??le.CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE})}).catch(s=>{console.error("Failed to load settings:",s)})},[]),{settings:e,saveSettings:async s=>{r(!0),l("Saving...");try{let a=await tt(Ct.SETTINGS,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(!a.ok){l(`\u2717 Error: ${a.status===401?"Unauthorized":a.statusText}`),r(!1);return}let u=await a.json();u.success?(t(s),l("\u2713 Saved"),setTimeout(()=>l(""),ki.SAVE_STATUS_DISPLAY_DURATION_MS)):l(`\u2717 Error: ${u.error}`)}catch(a){l(`\u2717 Error: ${a instanceof Error?a.message:"Network error"}`)}r(!1)},isSaving:n,saveStatus:o}}var Dr=J(ee(),1);function Om(){let[e,t]=(0,Dr.useState)({}),n=(0,Dr.useCallback)(async()=>{try{let o=await(await tt(Ct.STATS)).json();t(o)}catch(r){console.error("Failed to load stats:",r instanceof Error?r.message:String(r))}},[]);return(0,Dr.useEffect)(()=>{n()},[n]),{stats:e,refreshStats:n}}var Cn=J(ee(),1);function Su(e,t,n,r){let[o,l]=(0,Cn.useState)({isLoading:!1,hasMore:!0}),i=(0,Cn.useRef)(0),s=(0,Cn.useRef)(`${r}::${n}`),a=(0,Cn.useRef)(o),u=(0,Cn.useCallback)(async()=>{let g=`${r}::${n}`,h=s.current!==g;if(h){i.current=0,s.current=g;let M={isLoading:!1,hasMore:!0};l(M),a.current=M}if(!h&&(a.current.isLoading||!a.current.hasMore))return[];a.current={...a.current,isLoading:!0},l(M=>({...M,isLoading:!0}));let v=new URLSearchParams({offset:i.current.toString(),limit:Oo.PAGINATION_PAGE_SIZE.toString()});n&&v.append("project",n),r&&r!=="all"&&v.append("platformSource",r);let E=await tt(`${e}?${v}`);if(!E.ok)throw new Error(`Failed to load ${t}: ${E.statusText}`);let _=await E.json(),k={...a.current,isLoading:!1,hasMore:_.hasMore};return a.current=k,l(M=>({...M,isLoading:!1,hasMore:_.hasMore})),i.current+=Oo.PAGINATION_PAGE_SIZE,_.items},[n,r,e,t]);return{...o,loadMore:u}}function Dm(e,t){let n=Su(Ct.OBSERVATIONS,"observations",e,t),r=Su(Ct.SUMMARIES,"summaries",e,t),o=Su(Ct.PROMPTS,"prompts",e,t);return{observations:n,summaries:r,prompts:o}}var Pr=J(ee(),1),Um="claude-mem-theme";function C0(){return typeof window>"u"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function Pm(){try{let e=localStorage.getItem(Um);if(e==="system"||e==="light"||e==="dark")return e}catch(e){console.warn("Failed to read theme preference from localStorage:",e instanceof Error?e.message:String(e))}return"system"}function Im(e){return e==="system"?C0():e}function Rm(){let[e,t]=(0,Pr.useState)(Pm),[n,r]=(0,Pr.useState)(()=>Im(Pm()));return(0,Pr.useEffect)(()=>{let l=Im(e);r(l),document.documentElement.setAttribute("data-theme",l)},[e]),(0,Pr.useEffect)(()=>{if(e!=="system")return;let l=window.matchMedia("(prefers-color-scheme: dark)"),i=s=>{let a=s.matches?"dark":"light";r(a),document.documentElement.setAttribute("data-theme",a)};return l.addEventListener("change",i),()=>l.removeEventListener("change",i)},[e]),{preference:e,resolvedTheme:n,setThemePreference:l=>{try{localStorage.setItem(Um,l),t(l)}catch(i){console.warn("Failed to save theme preference to localStorage:",i instanceof Error?i.message:String(i)),t(l)}}}}function Li(e,t){let n=new Set;return[...e,...t].filter(r=>n.has(r.id)?!1:(n.add(r.id),!0))}function Fm(){let[e,t]=(0,B.useState)(""),[n,r]=(0,B.useState)("all"),[o,l]=(0,B.useState)(!1),[i,s]=(0,B.useState)(!1),[a,u]=(0,B.useState)([]),[g,h]=(0,B.useState)([]),[v,E]=(0,B.useState)([]),{observations:_,summaries:k,prompts:M,projects:f,sources:c,projectsBySource:m,isProcessing:d,queueDepth:w,isConnected:L}=Mm(),{settings:x,saveSettings:D,isSaving:G,saveStatus:U}=xm(),{stats:W,refreshStats:ot}=Om(),{preference:kn,resolvedTheme:Vn,setThemePreference:Ir}=Rm(),ke=Dm(e,n),Ln=(0,B.useMemo)(()=>n==="all"?f:m[n]||[],[n,f,m]),He=(0,B.useCallback)(I=>{let ue=!e||I.project===e,lt=n==="all"||(I.platform_source||"claude")===n;return ue&<},[e,n]);(0,B.useEffect)(()=>{e&&!Ln.includes(e)&&t("")},[Ln,e]);let Ur=(0,B.useMemo)(()=>{let I=_.filter(He),ue=a.filter(He);return Li(I,ue)},[_,a,He]),Gn=(0,B.useMemo)(()=>{let I=k.filter(He),ue=g.filter(He);return Li(I,ue)},[k,g,He]),S=(0,B.useMemo)(()=>{let I=M.filter(He),ue=v.filter(He);return Li(I,ue)},[M,v,He]),Q=(0,B.useCallback)(()=>{l(I=>!I)},[]),R=(0,B.useCallback)(()=>{s(I=>!I)},[]),he=(0,B.useCallback)(async()=>{try{let[I,ue,lt]=await Promise.all([ke.observations.loadMore(),ke.summaries.loadMore(),ke.prompts.loadMore()]);I.length>0&&u(it=>[...it,...I]),ue.length>0&&h(it=>[...it,...ue]),lt.length>0&&E(it=>[...it,...lt])}catch(I){console.error("Failed to load more data:",I)}},[ke.observations,ke.summaries,ke.prompts]);return(0,B.useEffect)(()=>{u([]),h([]),E([]),he()},[e,n]),B.default.createElement(B.default.Fragment,null,B.default.createElement(Mp,{isConnected:L,projects:Ln,sources:c,currentFilter:e,currentSource:n,onFilterChange:t,onSourceChange:r,isProcessing:d,queueDepth:w,themePreference:kn,onThemeChange:Ir,onContextPreviewToggle:Q}),B.default.createElement(Up,{observations:Ur,summaries:Gn,prompts:S,onLoadMore:he,isLoading:ke.observations.isLoading||ke.summaries.isLoading||ke.prompts.isLoading,hasMore:ke.observations.hasMore||ke.summaries.hasMore||ke.prompts.hasMore}),B.default.createElement(Nm,{isOpen:o,onClose:Q,settings:x,onSave:D,isSaving:G,saveStatus:U}),B.default.createElement("button",{className:"console-toggle-btn",onClick:R,title:"Toggle Console"},B.default.createElement("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},B.default.createElement("polyline",{points:"4 17 10 11 4 5"}),B.default.createElement("line",{x1:"12",y1:"19",x2:"20",y2:"19"}))),B.default.createElement(Am,{isOpen:i,onClose:R}))}var Yt=J(ee(),1),Ni=class extends Yt.Component{constructor(t){super(t),this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,n){console.error("[ErrorBoundary] Caught error:",t,n),this.setState({error:t,errorInfo:n})}render(){return this.state.hasError?Yt.default.createElement("div",{style:{padding:"20px",color:"#ff6b6b",backgroundColor:"#1a1a1a",minHeight:"100vh"}},Yt.default.createElement("h1",{style:{fontSize:"24px",marginBottom:"10px"}},"Something went wrong"),Yt.default.createElement("p",{style:{marginBottom:"10px",color:"#8b949e"}},"The application encountered an error. Please refresh the page to try again."),this.state.error&&Yt.default.createElement("details",{style:{marginTop:"20px",color:"#8b949e"}},Yt.default.createElement("summary",{style:{cursor:"pointer",marginBottom:"10px"}},"Error details"),Yt.default.createElement("pre",{style:{backgroundColor:"#0d1117",padding:"10px",borderRadius:"6px",overflow:"auto"}},this.state.error.toString(),this.state.errorInfo&&` -`+this.state.errorInfo.componentStack))):this.props.children}};var bm=document.getElementById("root");if(!bm)throw new Error("Root element not found");var C0=(0,Fm.createRoot)(bm);C0.render(Su.default.createElement(Li,null,Su.default.createElement(Rm,null)));})(); +`+this.state.errorInfo.componentStack))):this.props.children}};var zm=document.getElementById("root");if(!zm)throw new Error("Root element not found");var k0=(0,bm.createRoot)(zm);k0.render(_u.default.createElement(Ni,null,_u.default.createElement(Fm,null)));})(); /*! Bundled license information: react/cjs/react.production.min.js: diff --git a/scripts/sync-marketplace.cjs b/scripts/sync-marketplace.cjs index 013217a7..0e40c09e 100644 --- a/scripts/sync-marketplace.cjs +++ b/scripts/sync-marketplace.cjs @@ -108,12 +108,22 @@ try { // Trigger worker restart after file sync console.log('\n🔄 Triggering worker restart...'); const http = require('http'); + const fs = require('fs'); + const os = require('os'); + // Read auth token for API auth (#1932/#1933) + const dataDir = process.env.CLAUDE_MEM_DATA_DIR || require('path').join(os.homedir(), '.claude-mem'); + let authToken = ''; + try { authToken = fs.readFileSync(require('path').join(dataDir, 'worker-auth-token'), 'utf-8').trim(); } catch {} + // Use per-user port derivation (#1936) + const uid = typeof process.getuid === 'function' ? process.getuid() : 77; + const workerPort = parseInt(process.env.CLAUDE_MEM_WORKER_PORT || String(37700 + (uid % 100)), 10); const req = http.request({ hostname: '127.0.0.1', - port: 37777, + port: workerPort, path: '/api/admin/restart', method: 'POST', - timeout: 2000 + timeout: 2000, + headers: authToken ? { 'Authorization': `Bearer ${authToken}` } : {} }, (res) => { if (res.statusCode === 200) { console.log('\x1b[32m%s\x1b[0m', '✓ Worker restart triggered'); diff --git a/src/cli/handlers/session-init.ts b/src/cli/handlers/session-init.ts index 9ee09049..4b9fa7cc 100644 --- a/src/cli/handlers/session-init.ts +++ b/src/cli/handlers/session-init.ts @@ -44,7 +44,8 @@ export const sessionInitHandler: EventHandler = { return { continue: true, suppressOutput: true, exitCode: HOOK_EXIT_CODES.SUCCESS }; } - const { sessionId, cwd, prompt: rawPrompt } = input; + const { sessionId, prompt: rawPrompt } = input; + const cwd = input.cwd ?? process.cwd(); // Match context.ts fallback (#1918) // Guard: Codex CLI and other platforms may not provide a session_id (#744) if (!sessionId) { @@ -69,16 +70,23 @@ export const sessionInitHandler: EventHandler = { logger.debug('HOOK', 'session-init: Calling /api/sessions/init', { contentSessionId: sessionId, project }); // Initialize session via HTTP - handles DB operations and privacy checks - const initResponse = await workerHttpRequest('/api/sessions/init', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - contentSessionId: sessionId, - project, - prompt, - platformSource - }) - }); + let initResponse: Response; + try { + initResponse = await workerHttpRequest('/api/sessions/init', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + contentSessionId: sessionId, + project, + prompt, + platformSource + }) + }); + } catch (err) { + // Worker unreachable — on Linux/WSL, hook may fire before worker is healthy (#1907) + logger.warn('HOOK', `session-init: worker request failed: ${err instanceof Error ? err.message : err}`); + return { continue: true, suppressOutput: true, exitCode: HOOK_EXIT_CODES.SUCCESS }; + } if (!initResponse.ok) { // Log but don't throw - a worker 500 should not block the user's prompt diff --git a/src/cli/handlers/summarize.ts b/src/cli/handlers/summarize.ts index 8c7e8f3a..09ceee33 100644 --- a/src/cli/handlers/summarize.ts +++ b/src/cli/handlers/summarize.ts @@ -84,16 +84,24 @@ export const summarizeHandler: EventHandler = { const platformSource = normalizePlatformSource(input.platform); // 1. Queue summarize request — worker returns immediately with { status: 'queued' } - const response = await workerHttpRequest('/api/sessions/summarize', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - contentSessionId: sessionId, - last_assistant_message: lastAssistantMessage, - platformSource - }), - timeoutMs: SUMMARIZE_TIMEOUT_MS - }); + let response: Response; + try { + response = await workerHttpRequest('/api/sessions/summarize', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + contentSessionId: sessionId, + last_assistant_message: lastAssistantMessage, + platformSource + }), + timeoutMs: SUMMARIZE_TIMEOUT_MS + }); + } catch (err) { + // Network error, worker crash, or timeout — exit gracefully instead of + // bubbling to hook runner which exits code 2 and blocks session exit (#1901) + logger.warn('HOOK', `Stop hook: summarize request failed: ${err instanceof Error ? err.message : err}`); + return { continue: true, suppressOutput: true, exitCode: HOOK_EXIT_CODES.SUCCESS }; + } if (!response.ok) { return { continue: true, suppressOutput: true }; diff --git a/src/integrations/opencode-plugin/index.ts b/src/integrations/opencode-plugin/index.ts index a0670046..06a9fda0 100644 --- a/src/integrations/opencode-plugin/index.ts +++ b/src/integrations/opencode-plugin/index.ts @@ -101,6 +101,8 @@ const MAX_TOOL_RESPONSE_LENGTH = 1000; // Worker HTTP Client // ============================================================================ +const JSON_HEADERS: Record = { "Content-Type": "application/json" }; + async function workerPost( path: string, body: Record, @@ -109,7 +111,7 @@ async function workerPost( try { response = await fetch(`${WORKER_BASE_URL}${path}`, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: JSON_HEADERS, body: JSON.stringify(body), }); } catch (error: unknown) { @@ -134,7 +136,7 @@ function workerPostFireAndForget( ): void { fetch(`${WORKER_BASE_URL}${path}`, { method: "POST", - headers: { "Content-Type": "application/json" }, + headers: JSON_HEADERS, body: JSON.stringify(body), }).catch((error: unknown) => { const message = error instanceof Error ? error.message : String(error); @@ -146,7 +148,7 @@ function workerPostFireAndForget( async function workerGetText(path: string): Promise { try { - const response = await fetch(`${WORKER_BASE_URL}${path}`); + const response = await fetch(`${WORKER_BASE_URL}${path}`, { headers: JSON_HEADERS }); if (!response.ok) { console.warn(`[claude-mem] Worker GET ${path} returned ${response.status}`); return null; diff --git a/src/services/sqlite/PendingMessageStore.ts b/src/services/sqlite/PendingMessageStore.ts index 345b2d0b..2a20c73c 100644 --- a/src/services/sqlite/PendingMessageStore.ts +++ b/src/services/sqlite/PendingMessageStore.ts @@ -477,6 +477,25 @@ export class PendingMessageStore { return result.changes; } + /** + * Clear failed messages older than the given threshold. + * Preserves recent failures for inspection and manual retry. + * @param thresholdMs - Only delete failures older than this many milliseconds + * @returns Number of messages deleted + */ + clearFailedOlderThan(thresholdMs: number): number { + const cutoff = Date.now() - thresholdMs; + // Use COALESCE to prefer the most recent failure timestamp over creation time. + // failed_at_epoch is set by session-level failures, completed_at_epoch by markFailed(). + const stmt = this.db.prepare(` + DELETE FROM pending_messages + WHERE status = 'failed' + AND COALESCE(failed_at_epoch, completed_at_epoch, started_processing_at_epoch, created_at_epoch) < ? + `); + const result = stmt.run(cutoff); + return result.changes; + } + /** * Clear all pending, processing, and failed messages from the queue * Keeps only processed messages (for history) diff --git a/src/services/sqlite/SessionSearch.ts b/src/services/sqlite/SessionSearch.ts index 65b2294c..0f559181 100644 --- a/src/services/sqlite/SessionSearch.ts +++ b/src/services/sqlite/SessionSearch.ts @@ -36,7 +36,7 @@ export class SessionSearch { // Cache FTS5 availability once at construction (avoids DDL probe on every query) this._fts5Available = this.isFts5Available(); - // Ensure FTS tables exist + // Ensure FTS tables exist — may downgrade _fts5Available if creation fails this.ensureFTSTables(); } @@ -84,6 +84,7 @@ export class SessionSearch { logger.info('DB', 'FTS5 tables created successfully'); } catch (error) { // FTS5 creation failed at runtime despite probe succeeding — degrade gracefully + this._fts5Available = false; logger.warn('DB', 'FTS5 table creation failed — search will use ChromaDB and LIKE queries', {}, error instanceof Error ? error : undefined); } } @@ -327,14 +328,17 @@ export class SessionSearch { LIMIT ? OFFSET ? `; - params.unshift(query); + // Escape FTS5 special characters: wrap in quotes to treat as literal phrase + const escapedQuery = '"' + query.replace(/"/g, '""') + '"'; + params.unshift(escapedQuery); params.push(limit, offset); try { return this.db.prepare(sql).all(...params) as ObservationSearchResult[]; } catch (error) { - logger.warn('DB', 'FTS5 observation search failed, returning empty', {}, error instanceof Error ? error : undefined); - return []; + // Re-throw so callers can distinguish FTS failure from "no results" + logger.warn('DB', 'FTS5 observation search failed', {}, error instanceof Error ? error : undefined); + throw error; } } @@ -383,7 +387,9 @@ export class SessionSearch { const orderClause = orderBy === 'date_asc' ? 'ORDER BY s.created_at_epoch ASC' - : 'ORDER BY session_summaries_fts.rank ASC'; + : orderBy === 'date_desc' + ? 'ORDER BY s.created_at_epoch DESC' + : 'ORDER BY session_summaries_fts.rank ASC'; const sql = ` SELECT s.*, s.discovery_tokens @@ -395,14 +401,17 @@ export class SessionSearch { LIMIT ? OFFSET ? `; - params.unshift(query); + // Escape FTS5 special characters: wrap in quotes to treat as literal phrase + const escapedQuery = '"' + query.replace(/"/g, '""') + '"'; + params.unshift(escapedQuery); params.push(limit, offset); try { return this.db.prepare(sql).all(...params) as SessionSummarySearchResult[]; } catch (error) { - logger.warn('DB', 'FTS5 session search failed, returning empty', {}, error instanceof Error ? error : undefined); - return []; + // Re-throw so callers can distinguish FTS failure from "no results" + logger.warn('DB', 'FTS5 session search failed', {}, error instanceof Error ? error : undefined); + throw error; } } @@ -645,8 +654,10 @@ export class SessionSearch { } // LIKE fallback for user prompts text search (no FTS table for this entity) - baseConditions.push('up.prompt_text LIKE ?'); - params.push(`%${query}%`); + // Escape LIKE metacharacters so %, _, and \ in user input are treated as literals + const escapedQuery = query.replace(/[\\%_]/g, '\\$&'); + baseConditions.push("up.prompt_text LIKE ? ESCAPE '\\'"); + params.push(`%${escapedQuery}%`); const whereClause = `WHERE ${baseConditions.join(' AND ')}`; const orderClause = orderBy === 'date_asc' diff --git a/src/services/transcripts/processor.ts b/src/services/transcripts/processor.ts index 557378be..a6774beb 100644 --- a/src/services/transcripts/processor.ts +++ b/src/services/transcripts/processor.ts @@ -1,8 +1,10 @@ +import path from 'path'; import { sessionInitHandler } from '../../cli/handlers/session-init.js'; import { observationHandler } from '../../cli/handlers/observation.js'; import { fileEditHandler } from '../../cli/handlers/file-edit.js'; import { sessionCompleteHandler } from '../../cli/handlers/session-complete.js'; import { ensureWorkerRunning, workerHttpRequest } from '../../shared/worker-utils.js'; +import { DATA_DIR } from '../../shared/paths.js'; import { logger } from '../../utils/logger.js'; import { getProjectContext } from '../../utils/project-name.js'; import { writeAgentsMd } from '../../utils/agents-md-utils.js'; @@ -357,6 +359,19 @@ export class TranscriptEventProcessor { const contextUrl = `/api/context/inject?projects=${encodeURIComponent(projectsParam)}&platformSource=${encodeURIComponent(session.platformSource)}`; const agentsPath = expandHomePath(watch.context.path ?? `${cwd}/AGENTS.md`); + // Validate resolved path stays within allowed directories (#1934) + const resolvedAgentsPath = path.resolve(agentsPath); + const allowedRoots = [path.resolve(cwd), path.resolve(DATA_DIR)]; + const isPathSafe = allowedRoots.some(root => resolvedAgentsPath.startsWith(root + path.sep) || resolvedAgentsPath === root); + if (!isPathSafe) { + logger.warn('SECURITY', 'Rejected path traversal attempt in watch.context.path', { + original: watch.context.path, + resolved: resolvedAgentsPath, + allowedRoots + }); + return; + } + let response: Awaited>; try { response = await workerHttpRequest(contextUrl); diff --git a/src/services/worker-service.ts b/src/services/worker-service.ts index 7d8306cd..940f13f0 100644 --- a/src/services/worker-service.ts +++ b/src/services/worker-service.ts @@ -28,6 +28,7 @@ import { sanitizeEnv } from '../supervisor/env-sanitizer.js'; // ensure the worker daemon is up without importing this entire module — which // transitively pulls in the SQLite database layer via ChromaSync/DatabaseManager. import { ensureWorkerStarted as ensureWorkerStartedShared } from './worker-spawner.js'; +import { RestartGuard } from './worker/RestartGuard.js'; // Re-export for backward compatibility — canonical implementation in shared/plugin-state.ts export { isPluginDisabledInClaudeSettings } from '../shared/plugin-state.js'; @@ -482,7 +483,7 @@ export class WorkerService { // Best-effort loopback MCP self-check getSupervisor().assertCanSpawn('mcp server'); const transport = new StdioClientTransport({ - command: 'node', + command: process.execPath, // Use resolved path, not bare 'node' which fails on non-interactive PATH (#1876) args: [mcpServerPath], env: sanitizeEnv(process.env) }); @@ -558,12 +559,14 @@ export class WorkerService { } } - // Purge failed pending messages to prevent unbounded queue growth (#1957) + // Purge stale failed pending messages to prevent unbounded queue growth (#1957) + // Only remove failures older than 1 hour to preserve recent failures for inspection/retry try { const pendingStore = this.sessionManager.getPendingMessageStore(); - const purged = pendingStore.clearFailed(); + const FAILED_MESSAGE_RETENTION_MS = 60 * 60 * 1000; // 1 hour + const purged = pendingStore.clearFailedOlderThan(FAILED_MESSAGE_RETENTION_MS); if (purged > 0) { - logger.info('SYSTEM', `Purged ${purged} failed pending messages`); + logger.info('SYSTEM', `Purged ${purged} stale failed pending messages (older than 1h)`); } } catch (e) { if (e instanceof Error) { @@ -816,17 +819,19 @@ export class WorkerService { } // Fall through to pending-work restart below } - const MAX_PENDING_RESTARTS = 3; - if (pendingCount > 0) { - // Track consecutive pending-work restarts to prevent infinite loops (e.g. FK errors) - session.consecutiveRestarts = (session.consecutiveRestarts || 0) + 1; + // Windowed restart guard: only blocks tight-loop restarts, not spread-out ones (#2053) + if (!session.restartGuard) session.restartGuard = new RestartGuard(); + const restartAllowed = session.restartGuard.recordRestart(); + session.consecutiveRestarts = (session.consecutiveRestarts || 0) + 1; // Keep for logging - if (session.consecutiveRestarts > MAX_PENDING_RESTARTS) { - logger.error('SYSTEM', 'Exceeded max pending-work restarts, stopping to prevent infinite loop', { + if (!restartAllowed) { + logger.error('SYSTEM', 'Restart guard tripped: too many restarts in window, stopping to prevent runaway costs', { sessionId: session.sessionDbId, pendingCount, - consecutiveRestarts: session.consecutiveRestarts + restartsInWindow: session.restartGuard.restartsInWindow, + windowMs: session.restartGuard.windowMs, + maxRestarts: session.restartGuard.maxRestarts }); session.consecutiveRestarts = 0; this.terminateSession(session.sessionDbId, 'max_restarts_exceeded'); @@ -846,6 +851,7 @@ export class WorkerService { } else { // Successful completion with no pending work — clean up session // removeSessionImmediate fires onSessionDeletedCallback → broadcastProcessingStatus() + session.restartGuard?.recordSuccess(); session.consecutiveRestarts = 0; this.sessionManager.removeSessionImmediate(session.sessionDbId); } diff --git a/src/services/worker-types.ts b/src/services/worker-types.ts index d4e02e4b..7c046e29 100644 --- a/src/services/worker-types.ts +++ b/src/services/worker-types.ts @@ -3,6 +3,7 @@ */ import type { Response } from 'express'; +import type { RestartGuard } from './worker/RestartGuard.js'; // ============================================================================ // Active Session Types @@ -34,7 +35,8 @@ export interface ActiveSession { earliestPendingTimestamp: number | null; // Original timestamp of earliest pending message (for accurate observation timestamps) conversationHistory: ConversationMessage[]; // Shared conversation history for provider switching currentProvider: 'claude' | 'gemini' | 'openrouter' | null; // Track which provider is currently running - consecutiveRestarts: number; // Track consecutive restart attempts to prevent infinite loops + consecutiveRestarts: number; // DEPRECATED: use restartGuard. Kept for logging compat. + restartGuard?: RestartGuard; forceInit?: boolean; // Force fresh SDK session (skip resume) idleTimedOut?: boolean; // Set when session exits due to idle timeout (prevents restart loop) lastGeneratorActivity: number; // Timestamp of last generator progress (for stale detection, Issue #1099) diff --git a/src/services/worker/ProcessRegistry.ts b/src/services/worker/ProcessRegistry.ts index c4d6de25..411dc636 100644 --- a/src/services/worker/ProcessRegistry.ts +++ b/src/services/worker/ProcessRegistry.ts @@ -115,10 +115,15 @@ function notifySlotAvailable(): void { * Wait for a pool slot to become available (promise-based, not polling) * @param maxConcurrent Max number of concurrent agents * @param timeoutMs Max time to wait before giving up + * @param evictIdleSession Optional callback to evict an idle session when all slots are full (#1868) */ const TOTAL_PROCESS_HARD_CAP = 10; -export async function waitForSlot(maxConcurrent: number, timeoutMs: number = 60_000): Promise { +export async function waitForSlot( + maxConcurrent: number, + timeoutMs: number = 60_000, + evictIdleSession?: () => boolean +): Promise { // Hard cap: refuse to spawn if too many processes exist regardless of pool accounting const activeCount = getActiveCount(); if (activeCount >= TOTAL_PROCESS_HARD_CAP) { @@ -127,6 +132,17 @@ export async function waitForSlot(maxConcurrent: number, timeoutMs: number = 60_ if (activeCount < maxConcurrent) return; + // Try to evict an idle session before waiting (#1868) + // Idle sessions hold pool slots during their 3-min idle timeout, blocking new sessions + // that would timeout after 60s. Eviction aborts the idle session asynchronously — + // the freed slot is picked up by the waiter mechanism below. + if (evictIdleSession) { + const evicted = evictIdleSession(); + if (evicted) { + logger.info('PROCESS', 'Evicted idle session to free pool slot for waiting request'); + } + } + logger.info('PROCESS', `Pool limit reached (${activeCount}/${maxConcurrent}), waiting for slot...`); return new Promise((resolve, reject) => { diff --git a/src/services/worker/RestartGuard.ts b/src/services/worker/RestartGuard.ts new file mode 100644 index 00000000..39f5069e --- /dev/null +++ b/src/services/worker/RestartGuard.ts @@ -0,0 +1,70 @@ +/** + * Time-windowed restart guard. + * Prevents tight-loop restarts (bug) while allowing legitimate occasional restarts + * over long sessions. Replaces the flat consecutiveRestarts counter that stranded + * pending messages after just 3 restarts over any timeframe (#2053). + */ + +const RESTART_WINDOW_MS = 60_000; // Only count restarts within last 60 seconds +const MAX_WINDOWED_RESTARTS = 10; // 10 restarts in 60s = runaway loop +const DECAY_AFTER_SUCCESS_MS = 5 * 60_000; // Clear history after 5min of uninterrupted success + +export class RestartGuard { + private restartTimestamps: number[] = []; + private lastSuccessfulProcessing: number | null = null; + + /** + * Record a restart and check if the guard should trip. + * @returns true if the restart is ALLOWED, false if it should be BLOCKED + */ + recordRestart(): boolean { + const now = Date.now(); + + // Decay: clear history only after real success + 5min of uninterrupted success + if (this.lastSuccessfulProcessing !== null + && now - this.lastSuccessfulProcessing >= DECAY_AFTER_SUCCESS_MS) { + this.restartTimestamps = []; + this.lastSuccessfulProcessing = null; + } + + // Prune old timestamps outside the window + this.restartTimestamps = this.restartTimestamps.filter( + ts => now - ts < RESTART_WINDOW_MS + ); + + // Record this restart + this.restartTimestamps.push(now); + + // Check if we've exceeded the cap within the window + return this.restartTimestamps.length <= MAX_WINDOWED_RESTARTS; + } + + /** + * Call when a message is successfully processed to update the success timestamp. + */ + recordSuccess(): void { + this.lastSuccessfulProcessing = Date.now(); + } + + /** + * Get the number of restarts in the current window (for logging). + */ + get restartsInWindow(): number { + const now = Date.now(); + return this.restartTimestamps.filter(ts => now - ts < RESTART_WINDOW_MS).length; + } + + /** + * Get the window size in ms (for logging). + */ + get windowMs(): number { + return RESTART_WINDOW_MS; + } + + /** + * Get the max allowed restarts (for logging). + */ + get maxRestarts(): number { + return MAX_WINDOWED_RESTARTS; + } +} diff --git a/src/services/worker/SDKAgent.ts b/src/services/worker/SDKAgent.ts index 0cf98141..67b76491 100644 --- a/src/services/worker/SDKAgent.ts +++ b/src/services/worker/SDKAgent.ts @@ -90,9 +90,11 @@ export class SDKAgent { } // Wait for agent pool slot (configurable via CLAUDE_MEM_MAX_CONCURRENT_AGENTS) + // Pass idle session eviction callback to prevent pool deadlock (#1868): + // idle sessions hold slots during 3-min idle wait, blocking new sessions const settings = SettingsDefaultsManager.loadFromFile(USER_SETTINGS_PATH); const maxConcurrent = parseInt(settings.CLAUDE_MEM_MAX_CONCURRENT_AGENTS, 10) || 2; - await waitForSlot(maxConcurrent); + await waitForSlot(maxConcurrent, 60_000, () => this.sessionManager.evictIdlestSession()); // Build isolated environment from ~/.claude-mem/.env // This prevents Issue #733: random ANTHROPIC_API_KEY from project .env files diff --git a/src/services/worker/SearchManager.ts b/src/services/worker/SearchManager.ts index 4b0b98f9..5e049be7 100644 --- a/src/services/worker/SearchManager.ts +++ b/src/services/worker/SearchManager.ts @@ -67,8 +67,20 @@ export class SearchManager { return await this.chromaSync.queryChroma(query, limit, whereFilter); } - private async searchChromaForTimeline(query: string, ninetyDaysAgo: number): Promise { - const chromaResults = await this.queryChroma(query, 100); + private async searchChromaForTimeline(query: string, ninetyDaysAgo: number, project?: string): Promise { + // Build where filter scoped to observations only + project if provided + let whereFilter: Record = { doc_type: 'observation' }; + if (project) { + const projectFilter = { + $or: [ + { project }, + { merged_into_project: project } + ] + }; + whereFilter = { $and: [whereFilter, projectFilter] }; + } + + const chromaResults = await this.queryChroma(query, 100, whereFilter); logger.debug('SEARCH', 'Chroma returned semantic matches for timeline', { matchCount: chromaResults?.ids?.length ?? 0 }); if (chromaResults?.ids && chromaResults.ids.length > 0) { @@ -78,7 +90,7 @@ export class SearchManager { }); if (recentIds.length > 0) { - return this.sessionStore.getObservationsByIds(recentIds, { orderBy: 'date_desc', limit: 1 }); + return this.sessionStore.getObservationsByIds(recentIds, { orderBy: 'date_desc', limit: 1, project }); } } return []; @@ -286,14 +298,20 @@ export class SearchManager { // ChromaDB not initialized - fall back to FTS5 keyword search (#1913, #2048) else if (query) { logger.debug('SEARCH', 'ChromaDB not initialized — falling back to FTS5 keyword search', {}); - if (searchObservations) { - observations = this.sessionSearch.searchObservations(query, { ...options, type: obs_type, concepts, files }); - } - if (searchSessions) { - sessions = this.sessionSearch.searchSessions(query, options); - } - if (searchPrompts) { - prompts = this.sessionSearch.searchUserPrompts(query, options); + try { + if (searchObservations) { + observations = this.sessionSearch.searchObservations(query, { ...options, type: obs_type, concepts, files }); + } + if (searchSessions) { + sessions = this.sessionSearch.searchSessions(query, options); + } + if (searchPrompts) { + prompts = this.sessionSearch.searchUserPrompts(query, options); + } + } catch (ftsError) { + const errorObject = ftsError instanceof Error ? ftsError : new Error(String(ftsError)); + logger.error('WORKER', 'FTS5 fallback search failed', {}, errorObject); + chromaFailed = true; } } @@ -469,13 +487,25 @@ export class SearchManager { logger.debug('SEARCH', 'Using hybrid semantic search for timeline query', {}); const ninetyDaysAgo = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS; try { - results = await this.searchChromaForTimeline(query, ninetyDaysAgo); + results = await this.searchChromaForTimeline(query, ninetyDaysAgo, project); } catch (chromaError) { const errorObject = chromaError instanceof Error ? chromaError : new Error(String(chromaError)); logger.error('WORKER', 'Chroma search failed for timeline, continuing without semantic results', {}, errorObject); } } + // FTS fallback when Chroma is unavailable or returned no results + if (results.length === 0) { + try { + const ftsResults = this.sessionSearch.searchObservations(query, { project, limit: 1 }); + if (ftsResults.length > 0) { + results = ftsResults; + } + } catch (ftsError) { + logger.warn('SEARCH', 'FTS fallback failed for timeline', {}, ftsError instanceof Error ? ftsError : undefined); + } + } + if (results.length === 0) { return { content: [{ @@ -927,26 +957,55 @@ export class SearchManager { if (this.chromaSync) { logger.debug('SEARCH', 'Using hybrid semantic search (Chroma + SQLite)', {}); + // Build Chroma where filter with doc_type and project scope + let whereFilter: Record = { doc_type: 'observation' }; + if (options.project) { + const projectFilter = { + $or: [ + { project: options.project }, + { merged_into_project: options.project } + ] + }; + whereFilter = { $and: [whereFilter, projectFilter] }; + } + // Step 1: Chroma semantic search (top 100) - const chromaResults = await this.queryChroma(query, 100); - logger.debug('SEARCH', 'Chroma returned semantic matches', { matchCount: chromaResults.ids.length }); + try { + const chromaResults = await this.queryChroma(query, 100, whereFilter); + logger.debug('SEARCH', 'Chroma returned semantic matches', { matchCount: chromaResults.ids.length }); - if (chromaResults.ids.length > 0) { - // Step 2: Filter by recency (90 days) - const ninetyDaysAgo = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS; - const recentIds = chromaResults.ids.filter((_id, idx) => { - const meta = chromaResults.metadatas[idx]; - return meta && meta.created_at_epoch > ninetyDaysAgo; - }); + if (chromaResults.ids.length > 0) { + // Step 2: Filter by recency (90 days) + const ninetyDaysAgo = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS; + const recentIds = chromaResults.ids.filter((_id, idx) => { + const meta = chromaResults.metadatas[idx]; + return meta && meta.created_at_epoch > ninetyDaysAgo; + }); - logger.debug('SEARCH', 'Results within 90-day window', { count: recentIds.length }); + logger.debug('SEARCH', 'Results within 90-day window', { count: recentIds.length }); - // Step 3: Hydrate from SQLite in temporal order - if (recentIds.length > 0) { - const limit = options.limit || 20; - results = this.sessionStore.getObservationsByIds(recentIds, { orderBy: 'date_desc', limit }); - logger.debug('SEARCH', 'Hydrated observations from SQLite', { count: results.length }); + // Step 3: Hydrate from SQLite in temporal order + if (recentIds.length > 0) { + const limit = options.limit || 20; + results = this.sessionStore.getObservationsByIds(recentIds, { orderBy: 'date_desc', limit, project: options.project }); + logger.debug('SEARCH', 'Hydrated observations from SQLite', { count: results.length }); + } } + } catch (chromaError) { + const errorObject = chromaError instanceof Error ? chromaError : new Error(String(chromaError)); + logger.error('WORKER', 'Chroma search failed for observations, falling back to FTS', {}, errorObject); + } + } + + // FTS fallback when Chroma is unavailable or returned no results + if (results.length === 0) { + try { + const ftsResults = this.sessionSearch.searchObservations(query, options); + if (ftsResults.length > 0) { + results = ftsResults; + } + } catch (ftsError) { + logger.warn('SEARCH', 'FTS fallback failed for observations', {}, ftsError instanceof Error ? ftsError : undefined); } } @@ -984,26 +1043,55 @@ export class SearchManager { if (this.chromaSync) { logger.debug('SEARCH', 'Using hybrid semantic search for sessions', {}); + // Build Chroma where filter with doc_type and project scope + let whereFilter: Record = { doc_type: 'session_summary' }; + if (options.project) { + const projectFilter = { + $or: [ + { project: options.project }, + { merged_into_project: options.project } + ] + }; + whereFilter = { $and: [whereFilter, projectFilter] }; + } + // Step 1: Chroma semantic search (top 100) - const chromaResults = await this.queryChroma(query, 100, { doc_type: 'session_summary' }); - logger.debug('SEARCH', 'Chroma returned semantic matches for sessions', { matchCount: chromaResults.ids.length }); + try { + const chromaResults = await this.queryChroma(query, 100, whereFilter); + logger.debug('SEARCH', 'Chroma returned semantic matches for sessions', { matchCount: chromaResults.ids.length }); - if (chromaResults.ids.length > 0) { - // Step 2: Filter by recency (90 days) - const ninetyDaysAgo = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS; - const recentIds = chromaResults.ids.filter((_id, idx) => { - const meta = chromaResults.metadatas[idx]; - return meta && meta.created_at_epoch > ninetyDaysAgo; - }); + if (chromaResults.ids.length > 0) { + // Step 2: Filter by recency (90 days) + const ninetyDaysAgo = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS; + const recentIds = chromaResults.ids.filter((_id, idx) => { + const meta = chromaResults.metadatas[idx]; + return meta && meta.created_at_epoch > ninetyDaysAgo; + }); - logger.debug('SEARCH', 'Results within 90-day window', { count: recentIds.length }); + logger.debug('SEARCH', 'Results within 90-day window', { count: recentIds.length }); - // Step 3: Hydrate from SQLite in temporal order - if (recentIds.length > 0) { - const limit = options.limit || 20; - results = this.sessionStore.getSessionSummariesByIds(recentIds, { orderBy: 'date_desc', limit }); - logger.debug('SEARCH', 'Hydrated sessions from SQLite', { count: results.length }); + // Step 3: Hydrate from SQLite in temporal order + if (recentIds.length > 0) { + const limit = options.limit || 20; + results = this.sessionStore.getSessionSummariesByIds(recentIds, { orderBy: 'date_desc', limit, project: options.project }); + logger.debug('SEARCH', 'Hydrated sessions from SQLite', { count: results.length }); + } } + } catch (chromaError) { + const errorObject = chromaError instanceof Error ? chromaError : new Error(String(chromaError)); + logger.error('WORKER', 'Chroma search failed for sessions, falling back to FTS', {}, errorObject); + } + } + + // FTS fallback when Chroma is unavailable or returned no results + if (results.length === 0) { + try { + const ftsResults = this.sessionSearch.searchSessions(query, options); + if (ftsResults.length > 0) { + results = ftsResults; + } + } catch (ftsError) { + logger.warn('SEARCH', 'FTS fallback failed for sessions', {}, ftsError instanceof Error ? ftsError : undefined); } } @@ -1041,26 +1129,55 @@ export class SearchManager { if (this.chromaSync) { logger.debug('SEARCH', 'Using hybrid semantic search for user prompts', {}); + // Build Chroma where filter with doc_type and project scope + let whereFilter: Record = { doc_type: 'user_prompt' }; + if (options.project) { + const projectFilter = { + $or: [ + { project: options.project }, + { merged_into_project: options.project } + ] + }; + whereFilter = { $and: [whereFilter, projectFilter] }; + } + // Step 1: Chroma semantic search (top 100) - const chromaResults = await this.queryChroma(query, 100, { doc_type: 'user_prompt' }); - logger.debug('SEARCH', 'Chroma returned semantic matches for prompts', { matchCount: chromaResults.ids.length }); + try { + const chromaResults = await this.queryChroma(query, 100, whereFilter); + logger.debug('SEARCH', 'Chroma returned semantic matches for prompts', { matchCount: chromaResults.ids.length }); - if (chromaResults.ids.length > 0) { - // Step 2: Filter by recency (90 days) - const ninetyDaysAgo = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS; - const recentIds = chromaResults.ids.filter((_id, idx) => { - const meta = chromaResults.metadatas[idx]; - return meta && meta.created_at_epoch > ninetyDaysAgo; - }); + if (chromaResults.ids.length > 0) { + // Step 2: Filter by recency (90 days) + const ninetyDaysAgo = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS; + const recentIds = chromaResults.ids.filter((_id, idx) => { + const meta = chromaResults.metadatas[idx]; + return meta && meta.created_at_epoch > ninetyDaysAgo; + }); - logger.debug('SEARCH', 'Results within 90-day window', { count: recentIds.length }); + logger.debug('SEARCH', 'Results within 90-day window', { count: recentIds.length }); - // Step 3: Hydrate from SQLite in temporal order - if (recentIds.length > 0) { - const limit = options.limit || 20; - results = this.sessionStore.getUserPromptsByIds(recentIds, { orderBy: 'date_desc', limit }); - logger.debug('SEARCH', 'Hydrated user prompts from SQLite', { count: results.length }); + // Step 3: Hydrate from SQLite in temporal order + if (recentIds.length > 0) { + const limit = options.limit || 20; + results = this.sessionStore.getUserPromptsByIds(recentIds, { orderBy: 'date_desc', limit, project: options.project }); + logger.debug('SEARCH', 'Hydrated user prompts from SQLite', { count: results.length }); + } } + } catch (chromaError) { + const errorObject = chromaError instanceof Error ? chromaError : new Error(String(chromaError)); + logger.error('WORKER', 'Chroma search failed for user prompts, falling back to FTS', {}, errorObject); + } + } + + // FTS fallback when Chroma is unavailable or returned no results + if (results.length === 0 && query) { + try { + const ftsResults = this.sessionSearch.searchUserPrompts(query, options); + if (ftsResults.length > 0) { + results = ftsResults; + } + } catch (ftsError) { + logger.warn('SEARCH', 'FTS fallback failed for user prompts', {}, ftsError instanceof Error ? ftsError : undefined); } } @@ -1702,23 +1819,53 @@ export class SearchManager { // Use hybrid search if available if (this.chromaSync) { logger.debug('SEARCH', 'Using hybrid semantic search for timeline query', {}); - const chromaResults = await this.queryChroma(query, 100); - logger.debug('SEARCH', 'Chroma returned semantic matches for timeline', { matchCount: chromaResults.ids.length }); - if (chromaResults.ids.length > 0) { - // Filter by recency (90 days) - const ninetyDaysAgo = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS; - const recentIds = chromaResults.ids.filter((_id, idx) => { - const meta = chromaResults.metadatas[idx]; - return meta && meta.created_at_epoch > ninetyDaysAgo; - }); + // Build Chroma where filter scoped to observations + project if provided + let whereFilter: Record = { doc_type: 'observation' }; + if (project) { + const projectFilter = { + $or: [ + { project }, + { merged_into_project: project } + ] + }; + whereFilter = { $and: [whereFilter, projectFilter] }; + } - logger.debug('SEARCH', 'Results within 90-day window', { count: recentIds.length }); + try { + const chromaResults = await this.queryChroma(query, 100, whereFilter); + logger.debug('SEARCH', 'Chroma returned semantic matches for timeline', { matchCount: chromaResults.ids.length }); - if (recentIds.length > 0) { - results = this.sessionStore.getObservationsByIds(recentIds, { orderBy: 'date_desc', limit: mode === 'auto' ? 1 : limit }); - logger.debug('SEARCH', 'Hydrated observations from SQLite', { count: results.length }); + if (chromaResults.ids.length > 0) { + // Filter by recency (90 days) + const ninetyDaysAgo = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS; + const recentIds = chromaResults.ids.filter((_id, idx) => { + const meta = chromaResults.metadatas[idx]; + return meta && meta.created_at_epoch > ninetyDaysAgo; + }); + + logger.debug('SEARCH', 'Results within 90-day window', { count: recentIds.length }); + + if (recentIds.length > 0) { + results = this.sessionStore.getObservationsByIds(recentIds, { orderBy: 'date_desc', limit: mode === 'auto' ? 1 : limit, project }); + logger.debug('SEARCH', 'Hydrated observations from SQLite', { count: results.length }); + } } + } catch (chromaError) { + const errorObject = chromaError instanceof Error ? chromaError : new Error(String(chromaError)); + logger.error('WORKER', 'Chroma search failed for timeline by query, falling back to FTS', {}, errorObject); + } + } + + // FTS fallback when Chroma is unavailable or returned no results + if (results.length === 0) { + try { + const ftsResults = this.sessionSearch.searchObservations(query, { project, limit: mode === 'auto' ? 1 : limit }); + if (ftsResults.length > 0) { + results = ftsResults; + } + } catch (ftsError) { + logger.warn('SEARCH', 'FTS fallback failed for timeline by query', {}, ftsError instanceof Error ? ftsError : undefined); } } diff --git a/src/services/worker/SessionManager.ts b/src/services/worker/SessionManager.ts index 357cfc13..d61ecdbb 100644 --- a/src/services/worker/SessionManager.ts +++ b/src/services/worker/SessionManager.ts @@ -17,6 +17,7 @@ import { SessionQueueProcessor } from '../queue/SessionQueueProcessor.js'; import { getProcessBySession, ensureProcessExit } from './ProcessRegistry.js'; import { getSupervisor } from '../../supervisor/index.js'; import { MAX_CONSECUTIVE_SUMMARY_FAILURES } from '../../sdk/prompts.js'; +import { RestartGuard } from './RestartGuard.js'; /** Idle threshold before a stuck generator (zombie subprocess) is force-killed. */ export const MAX_GENERATOR_IDLE_MS = 5 * 60 * 1000; // 5 minutes @@ -224,7 +225,8 @@ export class SessionManager { earliestPendingTimestamp: null, conversationHistory: [], // Initialize empty - will be populated by agents currentProvider: null, // Will be set when generator starts - consecutiveRestarts: 0, // Track consecutive restart attempts to prevent infinite loops + consecutiveRestarts: 0, // DEPRECATED: use restartGuard. Kept for logging compat. + restartGuard: new RestartGuard(), processingMessageIds: [], // CLAIM-CONFIRM: Track message IDs for confirmProcessed() lastGeneratorActivity: Date.now(), // Initialize for stale detection (Issue #1099) consecutiveSummaryFailures: 0, // Circuit breaker for summary retry loop (#1633) @@ -465,6 +467,44 @@ export class SessionManager { } } + /** + * Evict the idlest session to free a pool slot (#1868). + * An "idle" session has an active generator but no pending work — it's sitting + * in the 3-min idle wait before subprocess cleanup. Evicting it triggers abort + * which kills the subprocess and frees the pool slot for a waiting new session. + * @returns true if a session was evicted, false if no idle sessions found + */ + evictIdlestSession(): boolean { + let idlestSessionId: number | null = null; + let oldestActivity = Infinity; + + for (const [sessionDbId, session] of this.sessions) { + if (!session.generatorPromise) continue; // No generator = no slot held + const pendingCount = this.getPendingStore().getPendingCount(sessionDbId); + if (pendingCount > 0) continue; // Has work to do, don't evict + + // Pick the session with the oldest lastGeneratorActivity (idlest) + if (session.lastGeneratorActivity < oldestActivity) { + oldestActivity = session.lastGeneratorActivity; + idlestSessionId = sessionDbId; + } + } + + if (idlestSessionId === null) return false; + + const session = this.sessions.get(idlestSessionId); + if (!session) return false; + + logger.info('SESSION', 'Evicting idle session to free pool slot for new request (#1868)', { + sessionDbId: idlestSessionId, + idleDurationMs: Date.now() - oldestActivity + }); + + session.idleTimedOut = true; + session.abortController.abort(); + return true; + } + /** * Reap sessions with no active generator and no pending work that have been idle too long. * Also reaps sessions whose generator has been stuck (no lastGeneratorActivity update) for diff --git a/src/services/worker/agents/ResponseProcessor.ts b/src/services/worker/agents/ResponseProcessor.ts index 6be695a2..dd045be4 100644 --- a/src/services/worker/agents/ResponseProcessor.ts +++ b/src/services/worker/agents/ResponseProcessor.ts @@ -207,6 +207,8 @@ export async function processAgentResponse( } if (session.processingMessageIds.length > 0) { logger.debug('QUEUE', `CONFIRMED_BATCH | sessionDbId=${session.sessionDbId} | count=${session.processingMessageIds.length} | ids=[${session.processingMessageIds.join(',')}]`); + // Record successful processing so restart guard decay is anchored to real successes + session.restartGuard?.recordSuccess(); } // Clear the tracking array after confirmation session.processingMessageIds = []; diff --git a/src/services/worker/http/middleware.ts b/src/services/worker/http/middleware.ts index 6b9d7df8..abe481cb 100644 --- a/src/services/worker/http/middleware.ts +++ b/src/services/worker/http/middleware.ts @@ -21,8 +21,8 @@ export function createMiddleware( ): RequestHandler[] { const middlewares: RequestHandler[] = []; - // JSON parsing with 50mb limit - middlewares.push(express.json({ limit: '50mb' })); + // JSON parsing with 5mb limit (#1935) + middlewares.push(express.json({ limit: '5mb' })); // CORS - restrict to localhost origins only middlewares.push(cors({ @@ -42,6 +42,39 @@ export function createMiddleware( credentials: false })); + // Simple in-memory rate limiter (#1935) + const requestCounts = new Map(); + const RATE_LIMIT_WINDOW_MS = 60_000; // 1 minute + const RATE_LIMIT_MAX_REQUESTS = 300; // 300 requests per minute per IP + + const rateLimiter: RequestHandler = (req, res, next) => { + const clientIp = req.ip || 'unknown'; + const now = Date.now(); + let entry = requestCounts.get(clientIp); + + if (!entry || now >= entry.resetAt) { + entry = { count: 0, resetAt: now + RATE_LIMIT_WINDOW_MS }; + requestCounts.set(clientIp, entry); + } + + // Lazy cleanup: remove expired entries when map grows large + if (requestCounts.size > 100) { + for (const [ip, e] of requestCounts) { + if (now >= e.resetAt) requestCounts.delete(ip); + } + } + + entry.count++; + if (entry.count > RATE_LIMIT_MAX_REQUESTS) { + res.status(429).json({ error: 'Rate limit exceeded' }); + return; + } + + next(); + }; + + middlewares.push(rateLimiter); + // HTTP request/response logging middlewares.push((req: Request, res: Response, next: NextFunction) => { // Skip logging for static assets, health checks, and polling endpoints diff --git a/src/services/worker/http/routes/DataRoutes.ts b/src/services/worker/http/routes/DataRoutes.ts index b476a3d9..1fbddcec 100644 --- a/src/services/worker/http/routes/DataRoutes.ts +++ b/src/services/worker/http/routes/DataRoutes.ts @@ -382,11 +382,13 @@ export class DataRoutes extends BaseRouteHandler { } // Import observations (depends on sessions) + const importedObservations: Array<{ id: number; obs: typeof observations[0] }> = []; if (Array.isArray(observations)) { for (const obs of observations) { const result = store.importObservation(obs); if (result.imported) { stats.observationsImported++; + importedObservations.push({ id: result.id, obs }); } else { stats.observationsSkipped++; } @@ -398,6 +400,53 @@ export class DataRoutes extends BaseRouteHandler { if (stats.observationsImported > 0) { store.rebuildObservationsFTSIndex(); } + + // Sync imported observations to ChromaDB for vector search. + // Fire-and-forget: Chroma sync failure should not block the import response. + // Bounded concurrency to prevent overwhelming Chroma on large imports. + const chromaSync = this.dbManager.getChromaSync(); + if (chromaSync && importedObservations.length > 0) { + const CHROMA_SYNC_CONCURRENCY = 8; + const safeParseJson = (val: string | null): string[] => { + if (!val) return []; + try { return JSON.parse(val); } catch { return []; } + }; + + const syncOne = async ({ id, obs }: { id: number; obs: any }) => { + const parsedObs = { + type: obs.type || 'discovery', + title: obs.title || null, + subtitle: obs.subtitle || null, + facts: safeParseJson(obs.facts), + narrative: obs.narrative || null, + concepts: safeParseJson(obs.concepts), + files_read: safeParseJson(obs.files_read), + files_modified: safeParseJson(obs.files_modified), + }; + + await chromaSync.syncObservation( + id, + obs.memory_session_id, + obs.project, + parsedObs, + obs.prompt_number || 0, + obs.created_at_epoch, + obs.discovery_tokens || 0 + ).catch(err => { + logger.error('CHROMA', 'Import ChromaDB sync failed', { id }, err as Error); + }); + }; + + // Fire-and-forget: process in batches but don't block the response + (async () => { + for (let i = 0; i < importedObservations.length; i += CHROMA_SYNC_CONCURRENCY) { + const batch = importedObservations.slice(i, i + CHROMA_SYNC_CONCURRENCY); + await Promise.all(batch.map(syncOne)); + } + })().catch(err => { + logger.error('CHROMA', 'Import ChromaDB batch sync failed', {}, err as Error); + }); + } } // Import prompts (depends on sessions) diff --git a/src/services/worker/http/routes/SessionRoutes.ts b/src/services/worker/http/routes/SessionRoutes.ts index 99c8de4c..c633f8a9 100644 --- a/src/services/worker/http/routes/SessionRoutes.ts +++ b/src/services/worker/http/routes/SessionRoutes.ts @@ -24,6 +24,7 @@ import { USER_SETTINGS_PATH } from '../../../../shared/paths.js'; import { getProcessBySession, ensureProcessExit } from '../../ProcessRegistry.js'; import { getProjectContext } from '../../../../utils/project-name.js'; import { normalizePlatformSource } from '../../../../shared/platform-source.js'; +import { RestartGuard } from '../../RestartGuard.js'; export class SessionRoutes extends BaseRouteHandler { private completionHandler: SessionCompletionHandler; @@ -279,9 +280,10 @@ export class SessionRoutes extends BaseRouteHandler { if (wasAborted) { logger.info('SESSION', `Generator aborted`, { sessionId: sessionDbId }); - } else { - logger.error('SESSION', `Generator exited unexpectedly`, { sessionId: sessionDbId }); } + // Don't log "exited unexpectedly" here — a non-abort exit is normal when + // the SDK subprocess completes its work. The crash-recovery block below + // checks pendingCount to distinguish real crashes from clean exits (#1876). session.generatorPromise = null; session.currentProvider = null; @@ -290,7 +292,6 @@ export class SessionRoutes extends BaseRouteHandler { // Crash recovery: If not aborted and still has work, restart (with limit) if (!wasAborted) { const pendingStore = this.sessionManager.getPendingMessageStore(); - const MAX_CONSECUTIVE_RESTARTS = 3; let pendingCount: number; try { @@ -309,14 +310,18 @@ export class SessionRoutes extends BaseRouteHandler { return; } - session.consecutiveRestarts = (session.consecutiveRestarts || 0) + 1; + // Windowed restart guard: only blocks tight-loop restarts, not spread-out ones (#2053) + if (!session.restartGuard) session.restartGuard = new RestartGuard(); + const restartAllowed = session.restartGuard.recordRestart(); + session.consecutiveRestarts = (session.consecutiveRestarts || 0) + 1; // Keep for logging - if (session.consecutiveRestarts > MAX_CONSECUTIVE_RESTARTS) { - logger.error('SESSION', `CRITICAL: Generator restart limit exceeded - stopping to prevent runaway costs`, { + if (!restartAllowed) { + logger.error('SESSION', `CRITICAL: Restart guard tripped — too many restarts in window, stopping to prevent runaway costs`, { sessionId: sessionDbId, pendingCount, - consecutiveRestarts: session.consecutiveRestarts, - maxRestarts: MAX_CONSECUTIVE_RESTARTS, + restartsInWindow: session.restartGuard.restartsInWindow, + windowMs: session.restartGuard.windowMs, + maxRestarts: session.restartGuard.maxRestarts, action: 'Generator will NOT restart. Check logs for root cause. Messages remain in pending state.' }); // Don't restart - abort to prevent further API calls @@ -328,7 +333,8 @@ export class SessionRoutes extends BaseRouteHandler { sessionId: sessionDbId, pendingCount, consecutiveRestarts: session.consecutiveRestarts, - maxRestarts: MAX_CONSECUTIVE_RESTARTS + restartsInWindow: session.restartGuard!.restartsInWindow, + maxRestarts: session.restartGuard!.maxRestarts }); // Abort OLD controller before replacing to prevent child process leaks diff --git a/src/shared/SettingsDefaultsManager.ts b/src/shared/SettingsDefaultsManager.ts index 0bf87519..96371151 100644 --- a/src/shared/SettingsDefaultsManager.ts +++ b/src/shared/SettingsDefaultsManager.ts @@ -85,7 +85,7 @@ export class SettingsDefaultsManager { private static readonly DEFAULTS: SettingsDefaults = { CLAUDE_MEM_MODEL: 'claude-sonnet-4-6', CLAUDE_MEM_CONTEXT_OBSERVATIONS: '50', - CLAUDE_MEM_WORKER_PORT: '37777', + CLAUDE_MEM_WORKER_PORT: String(37700 + ((process.getuid?.() ?? 77) % 100)), CLAUDE_MEM_WORKER_HOST: '127.0.0.1', CLAUDE_MEM_SKIP_TOOLS: 'ListMcpResourcesTool,SlashCommand,Skill,TodoWrite,AskUserQuestion', // AI Provider Configuration diff --git a/src/ui/viewer/components/LogsModal.tsx b/src/ui/viewer/components/LogsModal.tsx index a537a6c8..0c80055d 100644 --- a/src/ui/viewer/components/LogsModal.tsx +++ b/src/ui/viewer/components/LogsModal.tsx @@ -1,4 +1,5 @@ import React, { useState, useEffect, useCallback, useRef, useMemo } from 'react'; +import { authFetch } from '../utils/api'; // Log levels and components matching the logger.ts definitions type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR'; @@ -133,7 +134,7 @@ export function LogsDrawer({ isOpen, onClose }: LogsDrawerProps) { setIsLoading(true); setError(null); try { - const response = await fetch('/api/logs'); + const response = await authFetch('/api/logs'); if (!response.ok) { throw new Error(`Failed to fetch logs: ${response.statusText}`); } @@ -158,7 +159,7 @@ export function LogsDrawer({ isOpen, onClose }: LogsDrawerProps) { setIsLoading(true); setError(null); try { - const response = await fetch('/api/logs/clear', { method: 'POST' }); + const response = await authFetch('/api/logs/clear', { method: 'POST' }); if (!response.ok) { throw new Error(`Failed to clear logs: ${response.statusText}`); } diff --git a/src/ui/viewer/hooks/useContextPreview.ts b/src/ui/viewer/hooks/useContextPreview.ts index b81d6595..3099513e 100644 --- a/src/ui/viewer/hooks/useContextPreview.ts +++ b/src/ui/viewer/hooks/useContextPreview.ts @@ -1,5 +1,6 @@ import { useState, useEffect, useCallback } from 'react'; import type { ProjectCatalog, Settings } from '../types'; +import { authFetch } from '../utils/api'; interface UseContextPreviewResult { preview: string; @@ -39,7 +40,7 @@ export function useContextPreview(settings: Settings): UseContextPreviewResult { async function fetchProjects() { let data: ProjectCatalog; try { - const response = await fetch('/api/projects'); + const response = await authFetch('/api/projects'); data = await response.json() as ProjectCatalog; } catch (err: unknown) { console.error('Failed to fetch projects:', err instanceof Error ? err.message : String(err)); @@ -100,7 +101,7 @@ export function useContextPreview(settings: Settings): UseContextPreviewResult { } try { - const response = await fetch(`/api/context/preview?${params}`); + const response = await authFetch(`/api/context/preview?${params}`); const text = await response.text(); if (response.ok) { diff --git a/src/ui/viewer/hooks/usePagination.ts b/src/ui/viewer/hooks/usePagination.ts index 102e3cf8..19587417 100644 --- a/src/ui/viewer/hooks/usePagination.ts +++ b/src/ui/viewer/hooks/usePagination.ts @@ -2,6 +2,7 @@ import { useState, useCallback, useRef } from 'react'; import { Observation, Summary, UserPrompt } from '../types'; import { UI } from '../constants/ui'; import { API_ENDPOINTS } from '../constants/api'; +import { authFetch } from '../utils/api'; interface PaginationState { isLoading: boolean; @@ -68,7 +69,7 @@ function usePaginationFor(endpoint: string, dataType: DataType, currentFilter: s params.append('platformSource', currentSource); } - const response = await fetch(`${endpoint}?${params}`); + const response = await authFetch(`${endpoint}?${params}`); if (!response.ok) { throw new Error(`Failed to load ${dataType}: ${response.statusText}`); diff --git a/src/ui/viewer/hooks/useSettings.ts b/src/ui/viewer/hooks/useSettings.ts index f5e62992..246a0108 100644 --- a/src/ui/viewer/hooks/useSettings.ts +++ b/src/ui/viewer/hooks/useSettings.ts @@ -3,6 +3,7 @@ import { Settings } from '../types'; import { DEFAULT_SETTINGS } from '../constants/settings'; import { API_ENDPOINTS } from '../constants/api'; import { TIMING } from '../constants/timing'; +import { authFetch } from '../utils/api'; export function useSettings() { const [settings, setSettings] = useState(DEFAULT_SETTINGS); @@ -11,8 +12,13 @@ export function useSettings() { useEffect(() => { // Load initial settings - fetch(API_ENDPOINTS.SETTINGS) - .then(res => res.json()) + authFetch(API_ENDPOINTS.SETTINGS) + .then(async res => { + if (!res.ok) { + throw new Error(`Failed to load settings (${res.status})`); + } + return res.json(); + }) .then(data => { // Use ?? (nullish coalescing) instead of || so that falsy values // like '0', 'false', and '' from the backend are preserved. @@ -60,20 +66,30 @@ export function useSettings() { setIsSaving(true); setSaveStatus('Saving...'); - const response = await fetch(API_ENDPOINTS.SETTINGS, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(newSettings) - }); + try { + const response = await authFetch(API_ENDPOINTS.SETTINGS, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(newSettings) + }); - const result = await response.json(); + if (!response.ok) { + setSaveStatus(`✗ Error: ${response.status === 401 ? 'Unauthorized' : response.statusText}`); + setIsSaving(false); + return; + } - if (result.success) { - setSettings(newSettings); - setSaveStatus('✓ Saved'); - setTimeout(() => setSaveStatus(''), TIMING.SAVE_STATUS_DISPLAY_DURATION_MS); - } else { - setSaveStatus(`✗ Error: ${result.error}`); + const result = await response.json(); + + if (result.success) { + setSettings(newSettings); + setSaveStatus('✓ Saved'); + setTimeout(() => setSaveStatus(''), TIMING.SAVE_STATUS_DISPLAY_DURATION_MS); + } else { + setSaveStatus(`✗ Error: ${result.error}`); + } + } catch (error) { + setSaveStatus(`✗ Error: ${error instanceof Error ? error.message : 'Network error'}`); } setIsSaving(false); diff --git a/src/ui/viewer/hooks/useStats.ts b/src/ui/viewer/hooks/useStats.ts index 8d13b5e6..17d7b92a 100644 --- a/src/ui/viewer/hooks/useStats.ts +++ b/src/ui/viewer/hooks/useStats.ts @@ -1,13 +1,14 @@ import { useState, useEffect, useCallback } from 'react'; import { Stats } from '../types'; import { API_ENDPOINTS } from '../constants/api'; +import { authFetch } from '../utils/api'; export function useStats() { const [stats, setStats] = useState({}); const loadStats = useCallback(async () => { try { - const response = await fetch(API_ENDPOINTS.STATS); + const response = await authFetch(API_ENDPOINTS.STATS); const data = await response.json(); setStats(data); } catch (error: unknown) { diff --git a/src/ui/viewer/utils/api.ts b/src/ui/viewer/utils/api.ts new file mode 100644 index 00000000..9f5e905f --- /dev/null +++ b/src/ui/viewer/utils/api.ts @@ -0,0 +1,7 @@ +/** + * Fetch wrapper for viewer API calls. + * Worker is localhost-only; no auth header needed. + */ +export function authFetch(input: RequestInfo | URL, init?: RequestInit): Promise { + return fetch(input, init); +}