From c9acf0c4dae4afcb2bd5eff5728282a77c977248 Mon Sep 17 00:00:00 2001 From: Krilly Date: Sat, 21 Feb 2026 02:28:57 +0000 Subject: [PATCH] Add memory-viewer from silicondawn - Web UI for browsing and editing OpenClaw memory files - Cloned from https://github.com/silicondawn/memory-viewer - Built and running on port 8901 - Features: file tree, markdown rendering, search, live reload - Full access to MEMORY.md, daily notes, skills, automations --- memory-viewer | 1 - memory-viewer/.dockerignore | 16 + .../.github/ISSUE_TEMPLATE/bug_report.md | 28 + .../.github/ISSUE_TEMPLATE/feature_request.md | 18 + .../.github/workflows/docker-build.yml | 123 + memory-viewer/.gitignore | 27 + memory-viewer/CHANGELOG.md | 46 + memory-viewer/CONTRIBUTING.md | 52 + memory-viewer/Dockerfile | 61 + memory-viewer/LICENSE | 21 + memory-viewer/README.md | 156 + memory-viewer/README.zh-CN.md | 92 + memory-viewer/docker-compose.yml | 34 + .../docs/screenshot-dashboard-dark.png | Bin 0 -> 99988 bytes .../docs/screenshot-dashboard-light.png | Bin 0 -> 99424 bytes memory-viewer/docs/screenshot-editor-dark.png | Bin 0 -> 140768 bytes memory-viewer/docs/screenshot-search-dark.png | Bin 0 -> 109717 bytes memory-viewer/docs/screenshot-viewer-dark.png | Bin 0 -> 113563 bytes .../docs/screenshot-viewer-light.png | Bin 0 -> 113342 bytes memory-viewer/index.html | 26 + memory-viewer/package-lock.json | 8390 +++++++++++++++++ memory-viewer/package.json | 83 + memory-viewer/public/icon-192.png | Bin 0 -> 9015 bytes memory-viewer/public/icon-512.png | Bin 0 -> 37206 bytes memory-viewer/public/manifest.json | 21 + memory-viewer/public/sw.js | 60 + memory-viewer/scripts/build-docker.sh | 59 + memory-viewer/server-dist/api.test.js | 41 + memory-viewer/server-dist/index.js | 1134 +++ memory-viewer/server/api.test.ts | 50 + memory-viewer/server/cron-trigger.mjs | 99 + memory-viewer/server/index.ts | 1466 +++ memory-viewer/src/App.tsx | 624 ++ memory-viewer/src/api.ts | 404 + .../src/components/AgentStatus.test.tsx | 42 + memory-viewer/src/components/AgentStatus.tsx | 236 + .../src/components/BootstrapWizard.tsx | 209 + memory-viewer/src/components/Changelog.tsx | 33 + memory-viewer/src/components/Connections.tsx | 275 + .../src/components/ContributionHeatmap.tsx | 227 + memory-viewer/src/components/CronManager.tsx | 486 + memory-viewer/src/components/Dashboard.tsx | 228 + memory-viewer/src/components/FileTree.tsx | 252 + memory-viewer/src/components/FileViewer.tsx | 708 ++ .../src/components/MarkdownEditor.tsx | 97 + memory-viewer/src/components/SearchPanel.tsx | 245 + .../src/components/SensitiveMask.tsx | 77 + memory-viewer/src/components/SettingsPage.tsx | 305 + memory-viewer/src/components/SkillsPage.tsx | 67 + memory-viewer/src/components/Tags.tsx | 311 + memory-viewer/src/components/Timeline.tsx | 242 + memory-viewer/src/hooks/useAgents.ts | 60 + memory-viewer/src/hooks/useConnections.ts | 120 + memory-viewer/src/hooks/useLocale.ts | 40 + .../src/hooks/useResizableSidebar.ts | 75 + memory-viewer/src/hooks/useSensitive.ts | 23 + memory-viewer/src/hooks/useTheme.ts | 28 + memory-viewer/src/hooks/useWebSocket.ts | 44 + memory-viewer/src/hooks/useZoom.ts | 18 + memory-viewer/src/i18n.ts | 244 + memory-viewer/src/index.css | 444 + memory-viewer/src/main.tsx | 18 + memory-viewer/src/plugins/PluginSlot.tsx | 25 + memory-viewer/src/plugins/registry.ts | 116 + memory-viewer/src/plugins/types.ts | 20 + memory-viewer/src/test/setup.ts | 8 + memory-viewer/src/themes/apply.ts | 84 + memory-viewer/src/themes/builtin/default.ts | 6 + memory-viewer/src/themes/builtin/medium.ts | 52 + memory-viewer/src/themes/index.ts | 9 + memory-viewer/src/themes/registry.ts | 67 + memory-viewer/src/themes/types.ts | 33 + memory-viewer/take-screenshots.mjs | 77 + memory-viewer/tsconfig.app.json | 28 + memory-viewer/tsconfig.json | 7 + memory-viewer/tsconfig.node.json | 26 + memory-viewer/tsconfig.server.json | 19 + memory-viewer/vite.config.ts | 37 + 78 files changed, 18899 insertions(+), 1 deletion(-) delete mode 160000 memory-viewer create mode 100644 memory-viewer/.dockerignore create mode 100644 memory-viewer/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 memory-viewer/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 memory-viewer/.github/workflows/docker-build.yml create mode 100644 memory-viewer/.gitignore create mode 100644 memory-viewer/CHANGELOG.md create mode 100644 memory-viewer/CONTRIBUTING.md create mode 100644 memory-viewer/Dockerfile create mode 100644 memory-viewer/LICENSE create mode 100644 memory-viewer/README.md create mode 100644 memory-viewer/README.zh-CN.md create mode 100644 memory-viewer/docker-compose.yml create mode 100644 memory-viewer/docs/screenshot-dashboard-dark.png create mode 100644 memory-viewer/docs/screenshot-dashboard-light.png create mode 100644 memory-viewer/docs/screenshot-editor-dark.png create mode 100644 memory-viewer/docs/screenshot-search-dark.png create mode 100644 memory-viewer/docs/screenshot-viewer-dark.png create mode 100644 memory-viewer/docs/screenshot-viewer-light.png create mode 100644 memory-viewer/index.html create mode 100644 memory-viewer/package-lock.json create mode 100644 memory-viewer/package.json create mode 100644 memory-viewer/public/icon-192.png create mode 100644 memory-viewer/public/icon-512.png create mode 100644 memory-viewer/public/manifest.json create mode 100644 memory-viewer/public/sw.js create mode 100755 memory-viewer/scripts/build-docker.sh create mode 100644 memory-viewer/server-dist/api.test.js create mode 100644 memory-viewer/server-dist/index.js create mode 100644 memory-viewer/server/api.test.ts create mode 100644 memory-viewer/server/cron-trigger.mjs create mode 100644 memory-viewer/server/index.ts create mode 100644 memory-viewer/src/App.tsx create mode 100644 memory-viewer/src/api.ts create mode 100644 memory-viewer/src/components/AgentStatus.test.tsx create mode 100644 memory-viewer/src/components/AgentStatus.tsx create mode 100644 memory-viewer/src/components/BootstrapWizard.tsx create mode 100644 memory-viewer/src/components/Changelog.tsx create mode 100644 memory-viewer/src/components/Connections.tsx create mode 100644 memory-viewer/src/components/ContributionHeatmap.tsx create mode 100644 memory-viewer/src/components/CronManager.tsx create mode 100644 memory-viewer/src/components/Dashboard.tsx create mode 100644 memory-viewer/src/components/FileTree.tsx create mode 100644 memory-viewer/src/components/FileViewer.tsx create mode 100644 memory-viewer/src/components/MarkdownEditor.tsx create mode 100644 memory-viewer/src/components/SearchPanel.tsx create mode 100644 memory-viewer/src/components/SensitiveMask.tsx create mode 100644 memory-viewer/src/components/SettingsPage.tsx create mode 100644 memory-viewer/src/components/SkillsPage.tsx create mode 100644 memory-viewer/src/components/Tags.tsx create mode 100644 memory-viewer/src/components/Timeline.tsx create mode 100644 memory-viewer/src/hooks/useAgents.ts create mode 100644 memory-viewer/src/hooks/useConnections.ts create mode 100644 memory-viewer/src/hooks/useLocale.ts create mode 100644 memory-viewer/src/hooks/useResizableSidebar.ts create mode 100644 memory-viewer/src/hooks/useSensitive.ts create mode 100644 memory-viewer/src/hooks/useTheme.ts create mode 100644 memory-viewer/src/hooks/useWebSocket.ts create mode 100644 memory-viewer/src/hooks/useZoom.ts create mode 100644 memory-viewer/src/i18n.ts create mode 100644 memory-viewer/src/index.css create mode 100644 memory-viewer/src/main.tsx create mode 100644 memory-viewer/src/plugins/PluginSlot.tsx create mode 100644 memory-viewer/src/plugins/registry.ts create mode 100644 memory-viewer/src/plugins/types.ts create mode 100644 memory-viewer/src/test/setup.ts create mode 100644 memory-viewer/src/themes/apply.ts create mode 100644 memory-viewer/src/themes/builtin/default.ts create mode 100644 memory-viewer/src/themes/builtin/medium.ts create mode 100644 memory-viewer/src/themes/index.ts create mode 100644 memory-viewer/src/themes/registry.ts create mode 100644 memory-viewer/src/themes/types.ts create mode 100644 memory-viewer/take-screenshots.mjs create mode 100644 memory-viewer/tsconfig.app.json create mode 100644 memory-viewer/tsconfig.json create mode 100644 memory-viewer/tsconfig.node.json create mode 100644 memory-viewer/tsconfig.server.json create mode 100644 memory-viewer/vite.config.ts diff --git a/memory-viewer b/memory-viewer deleted file mode 160000 index 1b7f2aa..0000000 --- a/memory-viewer +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1b7f2aa57a8be41ee66d93b714c4b416fb6b4dd8 diff --git a/memory-viewer/.dockerignore b/memory-viewer/.dockerignore new file mode 100644 index 0000000..e1fc743 --- /dev/null +++ b/memory-viewer/.dockerignore @@ -0,0 +1,16 @@ +node_modules +npm-debug.log +.git +.gitignore +README.zh-CN.md +CONTRIBUTING.md +LICENSE +docs +.env +.nyc_output +coverage +.DS_Store +*.log + +# Keep CHANGELOG.md - it's imported by src/components/Changelog.tsx +# CHANGELOG.md diff --git a/memory-viewer/.github/ISSUE_TEMPLATE/bug_report.md b/memory-viewer/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..85e7ee4 --- /dev/null +++ b/memory-viewer/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,28 @@ +--- +name: Bug Report +about: Report a bug to help us improve +title: "[Bug] " +labels: bug +--- + +## Describe the Bug +A clear and concise description of what the bug is. + +## Steps to Reproduce +1. Go to '...' +2. Click on '...' +3. See error + +## Expected Behavior +What you expected to happen. + +## Actual Behavior +What actually happened. + +## Environment +- OS: [e.g., macOS 15, Ubuntu 24.04] +- Node.js version: [e.g., 22.x] +- Browser: [e.g., Chrome 130] + +## Screenshots +If applicable, add screenshots. diff --git a/memory-viewer/.github/ISSUE_TEMPLATE/feature_request.md b/memory-viewer/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..063d3fa --- /dev/null +++ b/memory-viewer/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,18 @@ +--- +name: Feature Request +about: Suggest an idea for this project +title: "[Feature] " +labels: enhancement +--- + +## Problem +A clear description of the problem or need. E.g., "I'm always frustrated when..." + +## Proposed Solution +Describe the solution you'd like. + +## Alternatives Considered +Any alternative solutions or features you've considered. + +## Additional Context +Any other context, mockups, or screenshots. diff --git a/memory-viewer/.github/workflows/docker-build.yml b/memory-viewer/.github/workflows/docker-build.yml new file mode 100644 index 0000000..c70316e --- /dev/null +++ b/memory-viewer/.github/workflows/docker-build.yml @@ -0,0 +1,123 @@ +name: Build and Push Docker Image + +on: + push: + branches: [ main ] + tags: [ 'v*' ] + pull_request: + branches: [ main ] + workflow_dispatch: + inputs: + tag: + description: 'Image tag (default: latest)' + required: false + default: 'latest' + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build: + strategy: + matrix: + include: + - platform: linux/amd64 + runner: ubuntu-latest + suffix: amd64 + - platform: linux/arm64 + runner: ubuntu-24.04-arm + suffix: arm64 + runs-on: ${{ matrix.runner }} + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run Tests + run: npm test + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Container Registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=ref,event=branch,suffix=-${{ matrix.suffix }} + type=ref,event=pr,suffix=-${{ matrix.suffix }} + type=semver,pattern={{version}},suffix=-${{ matrix.suffix }} + type=sha,prefix={{branch}}-,suffix=-${{ matrix.suffix }} + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha,scope=${{ matrix.suffix }} + cache-to: type=gha,mode=max,scope=${{ matrix.suffix }} + platforms: ${{ matrix.platform }} + + manifest: + needs: build + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Log in to Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=ref,event=branch + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=sha,prefix={{branch}}- + type=raw,value=${{ inputs.tag }},enable=${{ github.event_name == 'workflow_dispatch' }} + + - name: Create and push multi-arch manifest + run: | + TAGS="${{ steps.meta.outputs.tags }}" + for TAG in $TAGS; do + echo "Creating manifest for $TAG" + docker manifest create "$TAG" \ + "${TAG}-amd64" \ + "${TAG}-arm64" || true + docker manifest push "$TAG" || true + done diff --git a/memory-viewer/.gitignore b/memory-viewer/.gitignore new file mode 100644 index 0000000..aeb92d2 --- /dev/null +++ b/memory-viewer/.gitignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules/ +dist/ +dist-ssr/ +*.local +.env +.env.* +server.log + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/memory-viewer/CHANGELOG.md b/memory-viewer/CHANGELOG.md new file mode 100644 index 0000000..825f2de --- /dev/null +++ b/memory-viewer/CHANGELOG.md @@ -0,0 +1,46 @@ +# Changelog + +All notable changes to Memory Viewer will be documented in this file. + +## [1.2.0] "Road Trip" - 2026-02-01 + +### Added +- **PWA support** — Installable as standalone app on mobile, desktop, and Tesla. Offline caching with service worker. +- **Hash-based routing** — URL updates to `#/file/` when opening files. Refresh restores active file, browser back/forward works. +- **Mermaid diagram rendering** — Fenced `mermaid` code blocks render as SVG diagrams with theme-aware styling. +- **Auto-refresh polling** — Files auto-poll every 10s as WebSocket fallback. Manual refresh button in toolbar. + +### Changed +- **Express → Hono migration** — Replaced Express + compression + cors with Hono (~14KB). Faster, lighter, better TypeScript support. +- **Monospace font fix** — Code blocks now enforce `var(--font-mono)` for proper CJK alignment in ASCII art. + +### Performance +- **Gzip compression** — Server-side compression middleware. +- **CodeMirror lazy loading** — First-paint gzip reduced from 535KB → 310KB. +- **Vendor chunk splitting** — Separate chunks for react, codemirror, markdown, icons. +- **Tesla/large screen optimization** — 24px base font, 56px touch targets, wider sidebar. + +### Fixed +- Code blocks without language tag now render properly with `
` instead of inline code.
+
+## [1.1.0] - 2026-01-31
+
+### Added
+- **Optimistic locking for concurrent edits** — When saving a file that was modified on disk while you were editing, a conflict dialog appears with options to Overwrite, Reload, or Cancel. Prevents accidental data loss when the agent writes to a file during human editing.
+- **Changelog page** — In-app changelog accessible from the sidebar footer.
+
+## [1.0.0] - 2026-01-30
+
+### Added
+- **Multi-bot remote connections** — Connect to multiple OpenClaw agent workspaces from a single UI. One-click setup via Gateway API bootstrap.
+- **Markdown editor** — In-browser editing with Ctrl+S to save.
+- **Full-text search** — Search across all memory files instantly (Ctrl+K).
+- **System dashboard** — Server uptime, memory usage, load averages, today's memory summary, recent files, and monthly activity chart.
+- **Live reload** — Files auto-refresh when changed on disk via WebSocket.
+- **Dark/light theme** — Toggle between dark and light themes.
+- **Sensitive content masking** — Blur/reveal sensitive text with one click.
+- **i18n support** — English and Chinese interface.
+- **Syntax highlighting** — Code blocks with Prism.js, copy button, line numbers.
+- **File tree sidebar** — Navigate all `.md` files in a collapsible tree with grouping.
+- **Responsive design** — Works on mobile with a slide-out sidebar.
+- **Bot identity display** — Reads from SOUL.md / IDENTITY.md.
diff --git a/memory-viewer/CONTRIBUTING.md b/memory-viewer/CONTRIBUTING.md
new file mode 100644
index 0000000..a4a8001
--- /dev/null
+++ b/memory-viewer/CONTRIBUTING.md
@@ -0,0 +1,52 @@
+# Contributing to Memory Viewer
+
+Thanks for your interest in contributing! Here's how to get started.
+
+## Development Setup
+
+1. **Prerequisites:** Node.js >= 18, npm
+2. Clone and install:
+   ```bash
+   git clone https://github.com/silicondawn/memory-viewer.git
+   cd memory-viewer
+   npm install
+   ```
+3. Start the dev server:
+   ```bash
+   npm run dev
+   ```
+   This runs both the API server and Vite dev server concurrently.
+
+## Submitting Pull Requests
+
+1. Fork the repo and create a feature branch from `master`:
+   ```bash
+   git checkout -b feat/my-feature
+   ```
+2. Make your changes and ensure they pass type checking:
+   ```bash
+   npm run typecheck
+   ```
+3. Commit with a clear message following [Conventional Commits](https://www.conventionalcommits.org/):
+   - `feat:` for new features
+   - `fix:` for bug fixes
+   - `chore:` for maintenance tasks
+   - `docs:` for documentation changes
+4. Push and open a PR against `master`.
+
+## Code Style
+
+- **TypeScript** — All new code should be written in TypeScript.
+- **React** — Functional components with hooks.
+- **Tailwind CSS v4** — Use utility classes; avoid custom CSS when possible.
+- **Formatting** — Keep lines reasonable (~100 chars). No trailing whitespace.
+- Run `npm run typecheck` before committing.
+
+## Reporting Issues
+
+- Use the [Bug Report](https://github.com/silicondawn/memory-viewer/issues/new?template=bug_report.md) or [Feature Request](https://github.com/silicondawn/memory-viewer/issues/new?template=feature_request.md) templates.
+- Include steps to reproduce, expected vs actual behavior, and your environment (OS, Node version, browser).
+
+## License
+
+By contributing, you agree that your contributions will be licensed under the [MIT License](./LICENSE).
diff --git a/memory-viewer/Dockerfile b/memory-viewer/Dockerfile
new file mode 100644
index 0000000..b4ed061
--- /dev/null
+++ b/memory-viewer/Dockerfile
@@ -0,0 +1,61 @@
+# Multi-stage build for production
+FROM node:20-alpine AS builder
+
+WORKDIR /app
+
+# Copy package files first for better layer caching
+COPY package*.json ./
+RUN npm ci
+
+# Copy source code
+COPY . .
+
+# Build frontend
+RUN npm run build
+
+# Fix ServerWebSocket type issue by replacing with any type
+RUN sed -i 's/import type { ServerWebSocket } from "@hono\/node-ws";/type ServerWebSocket = any;/' server/index.ts
+
+# Compile TypeScript server to JavaScript
+RUN npx tsc --project tsconfig.server.json
+
+# Production stage
+FROM node:20-alpine AS production
+
+WORKDIR /app
+
+# Create non-root user for security
+RUN addgroup -g 1001 -S nodejs && \
+    adduser -S nodejs -u 1001
+
+# Copy package files and install production dependencies only
+COPY package*.json ./
+RUN npm ci --omit=dev && npm cache clean --force
+
+# Copy built frontend assets
+COPY --from=builder /app/dist ./dist
+
+# Copy compiled server JavaScript
+COPY --from=builder /app/server-dist ./server-dist
+
+# Create workspace directory for memory files
+RUN mkdir -p /app/workspace && chown -R nodejs:nodejs /app
+
+# Switch to non-root user
+USER nodejs
+
+# Expose the default port
+EXPOSE 8901
+
+# Set production environment
+ENV NODE_ENV=production
+ENV PORT=8901
+ENV WORKSPACE_DIR=/app/workspace
+ENV STATIC_DIR=/app/dist
+
+# Health check
+HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
+  CMD node -e "require('http').get('http://localhost:8901/api/info', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" || exit 1
+
+# Start the server using compiled JavaScript
+CMD ["node", "server-dist/index.js"]
diff --git a/memory-viewer/LICENSE b/memory-viewer/LICENSE
new file mode 100644
index 0000000..85bf460
--- /dev/null
+++ b/memory-viewer/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 Silicon Dawn
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/memory-viewer/README.md b/memory-viewer/README.md
new file mode 100644
index 0000000..6ef4904
--- /dev/null
+++ b/memory-viewer/README.md
@@ -0,0 +1,156 @@
+# 📝 Memory Viewer for OpenClaw
+
+[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
+[![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org/)
+[![Version](https://img.shields.io/badge/version-1.2.0-orange.svg)](https://github.com/silicondawn/memory-viewer/releases/tag/v1.2.0)
+[![OpenClaw](https://img.shields.io/badge/OpenClaw-Compatible-blue)](https://openclaw.com)
+
+A beautiful, dark-themed web UI for browsing and editing OpenClaw AI agent memory files. Built specifically for [OpenClaw](https://openclaw.com) agents that store context in Markdown files.
+
+

+ Dashboard (Dark) + Dashboard (Light) +

+

+ Viewer (Dark) + Viewer (Light) +

+

+ Editor + Search +

+ +## Why Memory Viewer for OpenClaw? + +OpenClaw agents store their memory in Markdown files (`MEMORY.md`, `memory/*.md`). Memory Viewer provides a dedicated web interface to: + +- **Browse** memory files in a collapsible tree +- **Search** across all agent memories instantly +- **Edit** files directly in the browser +- **Monitor** agent system status and memory usage +- **Connect** to multiple OpenClaw agents from a single UI + +## Features + +- **📁 File Tree Sidebar** — Navigate all `.md` files in a collapsible tree +- **📖 Markdown Rendering** — GitHub-flavored Markdown with syntax highlighting, tables, and more +- **✏️ In-Browser Editing** — Edit files directly with Ctrl+S to save, with optimistic locking for conflict detection +- **🔍 Full-Text Search** — Search across all memory files instantly (Ctrl+K) +- **📊 System Dashboard** — Server uptime, memory usage, load averages, and today's memory summary +- **🔄 Live Reload** — Files auto-refresh when changed on disk (via WebSocket), with 10s polling fallback +- **📱 PWA Support** — Installable as a standalone app with offline caching +- **🔗 Deep Linking** — Hash-based routing (`#/file/path`) for bookmarkable file URLs +- **📊 Mermaid Diagrams** — Render flowcharts and diagrams from fenced code blocks +- **🚗 Large Screen Optimized** — Touch-friendly UI for car displays (Tesla) and large screens +- **🌙 Dark/Light Theme** — Toggle between themes, designed for always-on dashboards +- **📱 Responsive** — Works on mobile with a slide-out sidebar +- **🌐 Multi-bot Connections** — Connect to multiple OpenClaw agent workspaces from a single UI + +## Quick Start + +```bash +# Clone +git clone https://github.com/silicondawn/memory-viewer.git +cd memory-viewer + +# Install +npm install + +# Run (starts both API server and Vite dev server) +npm run dev +``` + +Then open http://localhost:5173 in your browser. + +## OpenClaw Integration + +Memory Viewer works seamlessly with OpenClaw agents. To connect to your OpenClaw agent: + +1. Make sure your OpenClaw agent is running and accessible +2. In Memory Viewer, click the network icon in the top-right +3. Add your agent's workspace path (e.g., `/home/user/clawd`) +4. Start browsing and editing your agent's memory files + +## Deployment + +Memory Viewer can be deployed as a standalone service: + +```bash +# Build for production +npm run build + +# Start production server +npm start +``` + +The server runs on port 8901 by default. You can expose it via Cloudflare Tunnel, Nginx, or any reverse proxy. + +## Docker Deployment + +### Quick Start (Pre-built Image) + +Use the pre-built image from GitHub Container Registry: + +```bash +# Run directly with docker +docker run -d \ + -p 8901:8901 \ + -v ~/.openclaw/workspace:/app/workspace:ro \ + --name memory-viewer \ + ghcr.io/silicondawn/memory-viewer:latest + +# Or use docker-compose +docker-compose up -d +``` + +Open [http://localhost:8901](http://localhost:8901) in your browser. + +### Build from Source + +```bash +# Clone the repository +git clone https://github.com/silicondawn/memory-viewer.git +cd memory-viewer + +# Build and run +docker-compose up -d --build +``` + +### Docker Configuration + +| Variable | Default | Description | +|----------|---------|-------------| +| `PORT` | `8901` | Container port (fixed in image) | +| `WORKSPACE_DIR` | `/app/workspace` | Directory inside container for `.md` files | +| `STATIC_DIR` | `/app/dist` | Built frontend assets | + +### Customizing the Mount Path + +Edit `docker-compose.yml` to point to your actual OpenClaw workspace: + +```yaml +volumes: + - ~/.openclaw/workspace:/app/workspace:ro + # Windows: C:/Users/YourName/.openclaw/workspace:/app/workspace:ro +``` + +The `:ro` flag mounts the directory as read-only (recommended for safety). + +### Building Custom Images + +Use the provided build script: + +```bash +# Build with default tag (latest) +./scripts/build-docker.sh + +# Build with specific tag +./scripts/build-docker.sh v1.2.0 + +# Build and push to registry +PUSH=true ./scripts/build-docker.sh v1.2.0 +``` + +## License + +MIT © Silicon Dawn \ No newline at end of file diff --git a/memory-viewer/README.zh-CN.md b/memory-viewer/README.zh-CN.md new file mode 100644 index 0000000..8a2f9e2 --- /dev/null +++ b/memory-viewer/README.zh-CN.md @@ -0,0 +1,92 @@ +**中文** | [English](./README.md) + +# 📝 Memory Viewer for OpenClaw + +[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE) +[![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org/) +[![Version](https://img.shields.io/badge/version-1.2.0-orange.svg)](https://github.com/silicondawn/memory-viewer/releases/tag/v1.2.0) +[![OpenClaw](https://img.shields.io/badge/OpenClaw-兼容-blue)](https://openclaw.com) + +一个精美的暗色主题 Web UI,用于浏览和编辑 OpenClaw AI Agent 的记忆文件。专为使用 Markdown 文件存储上下文的 [OpenClaw](https://openclaw.com) Agent 设计。 + +

+ 仪表盘(暗色) + 仪表盘(亮色) +

+

+ 阅读模式(暗色) + 阅读模式(亮色) +

+

+ 编辑模式 + 搜索面板 +

+ +## 为什么选择 Memory Viewer for OpenClaw? + +OpenClaw Agent 将记忆存储在 Markdown 文件中(`MEMORY.md`、`memory/*.md`)。Memory Viewer 提供了一个专用的 Web 界面来: + +- **浏览** 记忆文件的折叠树形结构 +- **搜索** 所有 Agent 记忆,即时查找 +- **编辑** 直接在浏览器中修改文件 +- **监控** Agent 系统状态和内存使用情况 +- **连接** 从单个 UI 连接多个 OpenClaw Agent + +## 功能特性 + +- **📁 文件树侧栏** — 可折叠的树形结构,浏览所有 `.md` 文件 +- **📖 Markdown 渲染** — 支持 GFM(GitHub 风格 Markdown),包括语法高亮、表格等 +- **✏️ 浏览器内编辑** — 直接在页面编辑文件,Ctrl+S 保存,支持乐观锁冲突检测 +- **🔍 全文搜索** — 即时搜索所有记忆文件(Ctrl+K) +- **📊 系统仪表盘** — 服务器运行时间、内存使用、负载均值、今日记忆摘要 +- **🔄 实时刷新** — 文件在磁盘上变更时自动刷新(WebSocket + 10 秒轮询兜底) +- **📱 PWA 支持** — 可安装为独立应用,支持离线缓存 +- **🔗 深度链接** — 基于 Hash 路由(`#/file/路径`),可收藏和分享文件 URL +- **📊 Mermaid 图表** — 在围栏代码块中渲染流程图和各类图表 +- **🚗 大屏优化** — 触控友好的 UI,适配车载屏幕(Tesla)和大型显示器 +- **🌙 暗色/亮色主题** — 一键切换,适合常驻仪表盘 +- **📱 响应式设计** — 移动端支持侧滑菜单 +- **🌐 多 Bot 连接** — 在单个 UI 中连接多个 OpenClaw Agent 工作区 + +## 快速开始 + +```bash +# 克隆仓库 +git clone https://github.com/silicondawn/memory-viewer.git +cd memory-viewer + +# 安装依赖 +npm install + +# 启动开发服务器(同时启动 API 和 Vite) +npm run dev +``` + +然后在浏览器中打开 http://localhost:5173。 + +## OpenClaw 集成 + +Memory Viewer 与 OpenClaw Agent 无缝集成。连接到你的 OpenClaw Agent: + +1. 确保你的 OpenClaw Agent 正在运行且可访问 +2. 在 Memory Viewer 中,点击右上角的网络图标 +3. 添加你的 Agent 工作区路径(例如 `/home/user/clawd`) +4. 开始浏览和编辑你的 Agent 记忆文件 + +## 部署 + +Memory Viewer 可以作为独立服务部署: + +```bash +# 构建生产版本 +npm run build + +# 启动生产服务器 +npm start +``` + +服务器默认运行在 8901 端口。你可以通过 Cloudflare Tunnel、Nginx 或任何反向代理暴露它。 + +## 许可证 + +MIT © Silicon Dawn \ No newline at end of file diff --git a/memory-viewer/docker-compose.yml b/memory-viewer/docker-compose.yml new file mode 100644 index 0000000..5062679 --- /dev/null +++ b/memory-viewer/docker-compose.yml @@ -0,0 +1,34 @@ +services: + memory-viewer: + build: + context: . + dockerfile: Dockerfile + container_name: memory-viewer + ports: + - "8901:8901" + environment: + - NODE_ENV=production + - PORT=8901 + - WORKSPACE_DIR=/app/workspace + - STATIC_DIR=/app/dist + volumes: + # Mount your OpenClaw workspace directory here + # Update the path below to match your actual workspace location + - ~/.openclaw/workspace:/app/workspace:ro + # Windows example: + # - C:/Users/YourName/.openclaw/workspace:/app/workspace:ro + # Other Linux/macOS paths: + # - /path/to/your/workspace:/app/workspace:ro + restart: unless-stopped + healthcheck: + test: ["CMD", "node", "-e", "require('http').get('http://localhost:8901/api/info', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + networks: + - memory-viewer-network + +networks: + memory-viewer-network: + driver: bridge diff --git a/memory-viewer/docs/screenshot-dashboard-dark.png b/memory-viewer/docs/screenshot-dashboard-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..22dc986e0bb068d9c575bab8f025d4f271a55624 GIT binary patch literal 99988 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 literal 0 HcmV?d00001 diff --git a/memory-viewer/docs/screenshot-dashboard-light.png b/memory-viewer/docs/screenshot-dashboard-light.png new file mode 100644 index 0000000000000000000000000000000000000000..c1ba8dcff362ec733de2314b76624c4669c6bcec GIT binary patch literal 99424 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

M~=nvRELk02-2{fh-i^SE98$fYqF)hp9{Ej$G| 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�JKkUho&Z3{%_)j)Kz|$8-D8@K%><&iG;`17>TY)WmtMywF{6CNZ2tWKw z*4=St&}ZV|7ui1hTPq3h#$g*q2qr~Nko1avAxS|kCY7BV!t47{O$P0L_t(Bj$>X!Wg(Yf| zYJ=Tj$Uz3TDNjEGo>#}{xw4W(qM!7Nyl(d=$m1t-6jbtSk%$GF}B3=3nloEXOROE=D^o>WeO+(NA}-=N~D8?Q}~Jc2A?%%$gF+BoHbZ z{*26y4S=04qPzcNqxeAVgp%MN>3y6BRs@5acOGw>3{%gvfro;k?gHyT2_l=hmh02Y z0qs`PqFIkMx}3KUGTp(TA3AvRkA|+EOa1hpA(8G-SsL3n2v4KwJ z#x`SiS3B`E<7x#1*|Jzg(Rq{*4_+7_&l5^%2E8hNykr3sP`Rk;r%bT3)8ujj?}dpO z3mSRResD%vi2eAKN+({=BQ)1pYD&mBn{qTEcz7w_NyHoi$y6l*-s*-9WcC16>6xIr zSL?0tze@k^l0o+Z%X8grHm78L9p;ujU}yI-VG)l15^~s$JwqmCeJoT?{Sg^i38Dk zz{|~>0-!EB+=Y`b2bw(CPv8{O{w5o`xRLu~zy+Z`O1xoB5Cf8%n}*Ok5k5kW6XM6i z^-U1XP4Jxob}Elkk-85iaEdgKZ+axf!<4r&UA4U&c5(!&uZp*-)i{J@@K+F$sHTdn zL>~S$2L4qg66^rB#_S-7>hC(Q%t3P$o;>eG@eu1|I*;!1R0U>!Jzeto;XO>@%0Da3 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 literal 0 HcmV?d00001 diff --git a/memory-viewer/docs/screenshot-search-dark.png b/memory-viewer/docs/screenshot-search-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..32ea4af4f88294a76c822f6e5d9ce0e68d88bc5d GIT binary patch literal 109717 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

g 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

s_>yu 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
^I@`yD+O0l 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 literal 0 HcmV?d00001 diff --git a/memory-viewer/docs/screenshot-viewer-light.png b/memory-viewer/docs/screenshot-viewer-light.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab2453e882e0483caffac8a046647d8c51d4df6 GIT binary patch literal 113342 zcmb@ubyS;8*EdRODWzB`1zNOtad#_iae@bTcXw?|f#UA&4#f!)THJ%Xdjb><5(xRY zpZk5@b9fz9fB#hK7bKC;LSW4GrUweER+c`s3FH zLc0nL?G>8b7fB88tfN)TkBMGun5Pov=yGqVU(rd%Jxk8#)^I)nYU#l%=B}z7nwpx# zs^@KMd#-ekCk`hxJ9XD>D|41KXCfk=>bJg%&#w>pz*0r`L(w~z&i;u`GtD|=#1D{j z79{<9CvzQjD{)y-!HkZEFBvG^VORU`>`?|ZG)i3ee}sAbOyIspd-@;hW6M`Goc~a0 ztLW&Q|5EPQFMj_^O|boce$br+n4G*@d@Bq9NtTvZ@FuW#4`)bQ)xWdXiz%EK9?oba z`5!(XTU7E{RR`VD_(g?-#~L?v^`>P>RCR2scn@%e9V9K$A$>ie+p|Z+kE9X<+d<}`ltbMLwm9^T#J zqUa^^uaP_F;f0}O(a}zC`8>OOD=I3~;|It9DA)+ZjL_*UJM&$B<wg{M42f3(e76H#bYALQO0;$~kwpjPE-O7cLlk z19cf@91`?cWlB*NT3${f&W4&ux-XI#n>7Sq7t!(Wx)&;;bl-oNwSW?;=;}>#{eH^IYx-X6*JDJu(*&{^QZ5x|)BdAdlr| zyD!t0b8B127|FUgjqtv_H8WyqVM#UF1op%RKV@)TDkUw^e?#_s9rO7jVM5UELOJ;- zZ}6X^orUj+$duw7LC+m?cYE7+F7Y@NB7S?*fhjN2gB*{C`M4~m7Ed~v+Jt zl5p%~uLrP3E8fqS29|2p7B3}@8{G9_rvxr#{GighxAVd~OM6%gCHZ`G=sCG&we=Qt z@|v)zE~s~hH7U(c($009B9hNz|0-K_Jky{d96j|{GMQ#Nk2B8zkoW>#X-E4~`$2*K z{?3Lg^G%k1!+oUN%T%UHFj6K>j7j0f#iJ*{d*Ze{NF|f_*#`QK3?Oi(T|uBXh2So( z*r+OdAGy^0B8eDmR` z?{mLW?)jIr8Sohx=rka;CBf=Gyb%65pp2fiE4?b;sW!kVOQCZw;lXJ(%&)!=Qj2tV zWJES6XY1V|+UU+$$i#iRLmD%ssW~hJUpVOADI4phVm=y&_lgD(7|_1ia51TRg%{Ix zvf2?x@*v_hyZ-$3J7T)~3*SD^ zrBV<$FtF(9vxlcX8fZ$QF0AmeyjOSMdudfm?#VV7*~_TDVk_17p52bQEWt`A3EEqb z>qF6~WzL=?+l%ROqiFRaYYA{hAoXm=V7ysfc!N&Ry?=h5-lfY$9kV&; zdQANg)iUHiTT{$LGa{swR`~u4t6_i62a96VovlgL-onKN9rX;i#SmsQRY#m`?~{?f zE8N)rHNSIp@H!oXT`i?(u9zOIhk}+Z5}l30kK` zB-CY~ch$I1$SSlof1nMUNup5jr?&r~;AwJQhppAb&K{|Mq~{d~qtZx)YOY0FHwxM8 zZz--P7afTK~GI*-&?PqUJ^d<#YJRkk=k4N<#r0%m4#v$P|SQ~O#nBx&8% zgJ4#~jFSY)Z}kU9;Ns~u+TC+p&B%6V^L5ShRUU~Grnn?Jj)EhPLKdVuK?+da5msL+-p*VBR7pDuM=RfTQVvZJDbX-pU|*6Hed9hUCjk z&Y`j9U0{abhl`xlVRp*a;v*ho#WFX-6OoD)H_U{joTvRbl{uAT5fXs~6a3~AgHJk^ zq%*Q!Ji1oWu?|8$WV2M~_7|fT>Nr-s@K(B z5GDNKzEbO6b`3;fWIrPT&qmSYv%;(+w$tR0w>#8+8jiue2{^b3Dkwlyge=qa4kHyO zJjn7EAE%0n?LxUq&qm%03_&^ba^;6o6E3C(xyxvyc#zu!QY>N45&m+t!1X@ZskoAJZpWfqlpEeKCfw#K5!Z2fY|)q ztc5%__@0|#z1Cy4uMUVzDkc|6mPMuxw|%>Yn>Jrl35caxz%Y>QAQE2qA*oAo4a$v{ zjeEna z+zJUeiJ~6R8aG1vHSax)?XC!S?oUHa6CUogFbR2k0~ZQ{*e)5$C4%nF)ZiTY4|R~P z2+dQ5Du2I%0i!EmwAA9p|&| zLMzI(BZ37Be*WHv%a47X*}?SSxdWkybf3MCt!Yj7N1Ti)Ki7=Avfn0&Wx0V*F$FoP ze#xt2TBzmt(ERPsrt!%Em#bT86ct;Iu3?17#8P>xy{FV#WLWg&K7UU0>TJcooi<118T(1;eroF$=WMl1 zZd-q5cyNI&BOlP6qi+g+m3lLtCBXfg_FzaLmycep0BGIV1Ry{yvh0WWEVMrpJ%iQP zX&?>bZ}b$E9Q3Ltf&yC}qJ0R%@OYEG4KS6cXp2i2WU^%ERoL!5StnPz6Q2NfWSiY* zcF_{^wHxv^imLUgHW=!I6Sr1Z}i;%%fZmtfNwaXlieXv|T zLqBUkJzVzX&)Uoy3Oi1cP$_y13EkXYyI5Q|jd~_W8QjELeAZd|VOCf2U-`dHm2ibn?>@-g`tt64@kAq>3&J_1nUxCBs`?@b z+u=p_ywyrxd_E=RYt>wnoEXv&wPG6+pKN`(iz5-|uY;erHU)-9G=bU$)Dew(>AhwL zGvI)GdJ~?f1`6tq=ILwhnflt9$vH(XR6-41U0qtJ@}B;f*POV3<13^{2^Y+qi6nMy zvMjXyudsvH_xUUWtvqb;nnow`DtoW!Md&}Zsbe83TF z<yn6t_q_rXPlZJ*3}zwbs7-W zL11w2aw#P5SAMnQ=X96Ab^P3_`_mpcX6+8tt}9oC9*G!gmoVt`y^IVx2CMpC-^ieR z?U0Kd`~eGg4Kk%&8J#DI${3D-CVJ3bEsLie3cz_>V%4|hYtHI z2z+jac<0TWhyrW3rIy4m(aOxpR;HZFmPiZc%>7N1m%k&pr^TWw+v^*=I}ifU;;U1v z^=cz}M#^w`f8m3{A$Qww>I-Q;0~rgySfAnR$V!)p9|sHHIp>DV)m3oQ#7n|s^6&-O z{bGORKhW{3dWuu8?)tZ-5DB{F@65mg!nLNSMW+WJ zZL5SR3c%bX%Nc;5l;=uB>4)sZgKy5f#n$5@*Aw;IMq$Iax ze=)IpVU>hdsb5q=(S=!3K@0$h7WbfIINo=5V`|^H&%g+}W7bjdHsv~j#RvHHqQh$C zKDER`A9K`yYXQ1pj{AR|WIC0TW-?1gMu5)GYRJ1?PhlLq%G@8gA;qcAD-?pF`4Y9D zT?YzuMh&M0?TnO4%L|ZwHn)N#Awt6oQt&|U!oN1iA|RXAoWMZLKEzBvz6R^P*$&qb zy*i?rS_YL%$fTTtDa@wr?{IV`26zF~Eb|1qd*N>LJ3rV%Tq2cICG$?#=43Q_%Ot*)E@UG*oa;fAtCHe3?LEMJ19h zFsH4Nuynej7MG%M|H*K6$f8oDlmC!8D zinbY^2N9EGIv;&}m(1ovtsD}*2*>$-{E-BbvuaZ>R53M*+O zl>#Ko>1kSmw||LM-V!=KCa#woCyC`^QG(PW$+i{z5<+wB>AXWJc$t)=5$!6kF7CoV z+_{xduKrOD;q##0c^VVB;1~OD4+${!g$ynY!zaLLt!j;((sr5`PvEMJWNTC{J< zo-v2&W(2EjJt&nHGxk2E!(Ka0j0oLJs+iy;HTT@@w(88wbm;=+<9H8Vs^!zBY(T9V zdpFGS7OTE_lcd@uqNcjN9_06}H(9D4+l_YzjHaLB>$-lT)!5quS?BgACrZoJZ8~p> zWI^5hUB8Xcu09!|5+$4RSAJSOa#R&C*(I4Ha~q7gNws2XB!`AH5m!;Z{Wix zcr_V8OGLlu@_HvU=u5^bS6gr-OXb?uFxu<-7cD4^_n9#o znsp*3n2>L*Y`C-4sG1Is@>9ES?sMj*Tc*w2V(lDfpm)zc(3C6sBC!}ur;AoHp|}UK3DTRU?gx@MtQtr1eEp$Jbx^J>8+9-ih~(GxiuZ7p0pSCF3U|&a-d6 z@i7eq3aiSB#XW!4&cXIaZBy-vP^pSp!E8=T_h-Gj-bwmocKrf_nmv0SXn z_h+W|hAi?1-{-0w`{m?l3kk-2iGK4=I{pLK54v1o4nl|l*j`(K;+X!aj814;^YtlF z!_P?NxT3xCBpKeBR5elnEIEyw=52$sr$?M8u0aQ9H-coa$L5#igVFkiRgNocR}d%ntdxX)?x=U1)3o82WEiiB6` zr;4(uCkemOsSQJqiW(yvSA4z86+ZbsE*otu9-zzDoJ(lJ|VoH5~8Mcc6cmK*=R4`@2Q9Hvx3^Q2~#IY=`p= zuYwXF=`g%GpVl(UtcU^}Z{P(g;~SZ^>R%4>g9qyb8IkV+eQCF>9kH(u$~!B{Ko}YR zl@1TcmbQB`x;juTg;!09->=(1 z^?a@u?2`w)8M}>dd0*PTBY-3@=-~OwsPh*I-T4U*)}A0?3;8`vi^a)1CUr&YeqL^{ zQX`J=OJq>38E?=bRcK{z7wRjF%1uZsHBtW~T|V+hiihBu8G0YS$WC+77?oaCH6UGx zi8|jiA~_kTtgJk;z2fI}Vr~Hh0(Ek9i5se>UfQ2&?y0)jZwdy!+0gTKXCri{)}Xp7yhB<_v%G{aE9q%ss}^jQMm(2s@!+U~!)* z(_@-y_~FFgU6%$9Og0|uP-VkC?jer$VUF{9D4^l%{Br{t`>WV6uuICxwP0bSB$@wR z9$g*XV6h{P30##(0=Q$vCEGSzANI^UG$y$FZIyGn)*xgHnI*>``-6>9wIKjN9z)i< z4knb9PmCt+Ka5n{M2xv^sv3zC?Xd7hhd!Stwj{B}T3&On`%3?`{fGF4MjW;(-NV^M zIr{p3%klj+A+EHUC8py2-2zHqkjB?_Q+6JcVmH{*x=BbQYai4)r(|*=sxRz%+m_!b z>$rgs%6!0@8{VaN&zay2#emQj#m>XiW>}-mKL#tQ!&3!RhsIBo)nuOoC@nyN-}{N` zqg&)>pIZ^Hx;H6<%k?zIRuf1$MjMHi7D??ZYTXMOK=x_{<-9A`94?6>draknTtNn7 z%*iZJQLAZh@*n-1ORq7K+nUZ3h&63)aJ{6i`bPbU0PXt=xa#Fv<#by3i4WV1J~Ql= zaaN@%^#=5c89ovQAyG%Y`nzZ&tu`|Z^DR}JdLOsxHHmoN1;yL> zALA}(uChZN$ubAuztND@Dw1MO#jR=)|)e(3R_WlQOcqIy8Jgujiya#gRR3 z9Vk{}wyp!|e6209ky3Q%{=-abzAhcQ02bNzOyI{fMg=0vdfWFpXQN9R7E7kZ%YwEI z6WoQfbwe8Q^h7-oDrnF1rM& zR+Jo_r`I2J;u~h4fBj>-IAzih*7il_jfw?d1?kcG*PeI$V!iHy zy)&rWa8*;!3z6w_7Z5@TYm-8-;C;t$uBQMpBK)iaNZZ>=`mH$C*LRvNPYqryuc6Ar zAC|im?rHZr_-nqBv`x*di)S}}X2~e1s8yRgTUf_q0B>k@O}hqm|4}dhA;3S=<6dht z{U*g7QID_aBjT54y4Qe7>nX)XDN<^3Z%Lp&n|3O^eLcQXx6bXE9U`r#Irr`1Ub?AD z<#@vpd_Gs!;UTuw)-!1J)K6%l(I;d^ge%ny;N~c2Ck|BqVFW0HcnQL|O)AO?#fuF#4 z)rVmbz16*#=Hr1qg&s)bN~ z!G**^QSK*g*jNH*O?JCNA`W*@jj_6iF&vcC_@qO8yuW>3{k$CiuSPU)?E_*ab+Us+ zYx?5zrZ}(OKSFNiE|l&079ba{L}jk4>@}<}v<#L~lt^0-#BGQ5^fh%Sv+9{_dAD z`@X-LlTR}w%L$^SpB|U>nJ7#LUG8gd6F;4JCmRy#TZyOd(Pj?pBr?K*_|-j>EY_F= zq5f{H3%n^RVb-RkiS_;bna{T3i604x+v_;dN$b`;243+jUs8vHkZo>4iCcxKM7SQF z_nCE1kB_kk8^s&Zgrlb=5`^`~MnV29A#a*j*1_9=^!Do@62HLZVGk3(xtRKUTf6!m zROkIZFHM@Lz|ljklW0G<&HJD(h~n091f*&dlzk6Ast!l zTLmG|Y+4*kUWdW*i`aOJZES@1RZ^E^6}_Aj1&dacSmS@%mcH8NrnxO{F7eaPY?EoL;r+W{t&L$;{bXd90NX63Suk8Y!sb zt91H3BTUo(MACgRHr60gfRPc=pT%*J=$Qo^4Il}qwmqF2!>YF1aruOE$0kiOM z)vnSE_JaURLu0FT>9U5HN_7bSeaOO^*VIni zgE06f;%5?ke)5IwZeqWfns4|}vD(aX)3*_d)gPFu8$D_yQlt|{rpZ4K zu;Dorco^o!m9C%j@NF3nR4`rfH*f;p3cJ<>h3ogZSH0`}%mx|LTI74n+P+A^Vd!Rg!j%ujKW=r*1U_?Kd%tc=&ELmv_FzSRdIH5bG9T z-#r`~1=vwuqn5i6^O*yQO4%PMvwwnbLzA5L__Nn(rqE9odqHiQ)&5Bk+lWA?`9<_f7wdqk z_B=;_S&E%DjT~X&*Txlw zYCA7GdP^bdL75`kP$9l;*QTF~7f`2y%)c(owK;H28tu8acANcwfE!;2h*HcQC;IFBHY4-*{P*6nE#$l=lG2sy8M5zsM4v zn8Hd;18GW*wwD+Ks$S$!chAL{^?-J&qO)ZR5O`?{a`#l{7`^~dNk?PF;R@N%a7MrJBIkl9UQN#N!L9y( zN0it8tG<3uu*v7BY~cC-4}Zj8-d!DB$wiKu=(0Wc+RP^!8YWL`jA7vE6N5{WX`yN{Kr@mGWdgtI^cteS}c~8b_Pz>kB>|t%^XK)ODFo z{!%<@B4vQJd5qBQArLWGt5YseUi!RKe9ygi?1rW2c!9sU*^|6l+U#Vo7SP2cH;?UV z@h=t!jnXK48e=J@hlezJCb+w!ombdlxN6_aX_eDw&h2SfbTI>Wnqp3;x}L(=+#GL3 zh5nuU=})ZY=B(`XAWKj{JX;ux`}M(c(0dzfW+BuKybB~c;KNb7a5XzX(DgU#{t~_7 z4-(Z9zrS(0)SgTDuPJyddVIprhApoHjzCU#EgHSYgs+Ym&PD4{rNhI+J$`|W8UYY; z?0sQD#0{>sdV`o~hk3dUy!6=*93A*=Q0o0fqSu^5%H{F?WTk)&tp{kT55OBVBrgLV z8DSA;)nYCS-&dxrQAyojACUtGrvJz(msazX(>Xqp@7CAB|pb+BzH<2=cXUGv>NR{l|t6Ky$!?b_o1uy%+-WHB!%#7t_G zb=}X~xfyzkp&XS~iVrMKsu|I;pUwY^^AlCGrV6~FhH^enTy)w{VNRu7x-fH8Vu+Sb zCE20x?N1^enRa6Iy}l}i)f7eB9}5!M?hZ*@`CXouQ@H~p>K{$YbTDm5gCNa);iStR zl$ss5J&a*1G0Pkh%_eh1PmPwH-$Az?I>7j!v7K5UWW97|ld?Ih{$VGSUQT429I5i9 zc&p(1ijkK;>L?+()Auf(f6A7*%)_bQ=nR{Dh4KAQ3$skdcDGH9FUAL_a>{JKn*Um( z94hYbZed#c;7j~+ryv*6wLOSen_5?P_3!%t=ZD_3>=*0Yk-|TI{=TSs`icTSM6BzV*vf=&Jq56JIrx z5E~D;E3p?bZPw6N)(xacjaX0e?C~@ zXTX|f3Oy2*!L5-7+wJ;7m%=Oi9vk zX)UUs${4F@O}D4F&|Y5n)k)vhE;M6`<3$iXLM!|fh84)2CB%%V32nziy3ZS1OcW^81_m z_QFi!wcxhu_z!$dayN^Sk`7Ham<+yu(sUqlzVAEz_A?*xLx^>2*2DPZpp!&06b49G zz>LD(^F-EKJ}NpRcIA{jZlh)Z<9~Bg8)ha8k zdC53Vn1k0M`uLfXlXY>c>+6S&^I*S|iHI@^Xgq5T6$QLZc{O0}B@a{0%^IH=py|?| zs_v05qUYKGw&&xN$yyR66=r*M@m|!_pu7`j67*Qi(qG>qQ|AuR4L(FJu&Ad~xqiPN z2z5zoQjjm|u9;gDIkx_E73nzT+g=S&5b+uN_^6jQlE=k)U|Pk@T;=8l$G|AD3-Gzp zsGr^4=Q7Z@)@P3%;Yz8DCbC@?2N%_=B__+UDOIZhZ6d%kPcx#U>nbYLYON|*qAVhq z83!~S)Y6ljp&7f>Rtu3iiTWbUXV)vgHL&5 z@7y_7oDF!HN}t(v^h)Wa-hD>vqSlwfj>M9wMG@IP{vzO|l#P#%g?+wJ;y{ho-r&XX zff6nxYWFle^0RWPrej~!fC;lk3HM2p9%EvtLa^QZtknRWc1(5ij6c>Hnke++mGUnhzm0hCNYO^cVXZ>r^ai%UAo3lm32yo+9M@nYu4mFR)QbBEK-qC39Z|-U!Fg!mIec@}L9fR^&Z7%U8h@{5Rh{}z>q>;VmMHc4h3%&CtGzpUDP;};m2a?-u z{P5I77$T3SQ)~dt>wD$~XQ!Uq@#i`2N;xbRO95YwDTF3c-9I>Z+rahXt@~k&M!Ad5 zZ|dq-Xb@AFMUGZe`^7C6D_RAZRL`;i-qU6 zfB3iz6TO%^5Z|pz-%~R(0E!*vpUjE0#T*A626E|&=Z1xmbUos;ciWlcQKez~GbefZ z0MT}PUAR%1^Plfj5{ah2IMBX2Vm-zJA5%YJY@E9mev;fjt4dew?05v^NA&LkZ5n$o ze@c6~*B4BBc%6{SE8vE>GNU~PI`*CP_H~#|HOyS`n;XB~J&IvHKoAJXmeOgPG^8vI zybiKN$Q8fd%-eu*tDlAZC?cPdT*_)~Qg5k6?));!lpgd}>kolL5;b%9LT?OwHG4&tQ#;>U@vC}P^CAxt!Ed@V9f*(GHr!=BN ze4NK>?XD(U8#A8dCff)o&$-*4QXG%cWjlYRSU`CqO;>`%b-Fj*zRV8Lj0k6H1Tn%F zRr!dVwiMYyFR{@k45XXQU$s8^57IJ_g+)cC zKyqCj(YtrNWMsC)K$?=}B_87F9VU#AC{^xhFLvZa696}5-% z042n45s^9Fu*LJA(Jgh4v9|S7fK7nN@2Xw z->R`X`=K&%Gsc(MwmJL9(Kieo;VP*Vfxbpj-%bUUz9ae&Q*At-iSWHBm()n=7AQ4F z3bTZI-j98j$v}t~2*Nb$g{oaT zvgrfK8EjMnR_YzfWa#Bj; zFjit(R&wIPEYk-G@lqzzvt7O(ucAC3Oyd~FOQW6LH_!~>3|ldKvq&lHb0x~^TZ0!b zvySFd9Cy&rPPHXTtkDkC+=X>POR}@BwFXU=4U21Pwxrnu^!hdBiEbv;!0lo;P_uX^ z)|hT$x{XF9pwEzng_%yB$m}lem8k;&7!U93OJ=4A0F`h;Q~V^gRH&KT5p{0HaZe*T zv%VL^7A`On(qycP010pET3>iCy6rR-}#o?02Q-}GGrYB zB*s5cV1zWfd*{$W%aIS&*(H|l^NtKect=e9(L-;v5_>{8#*yc=9O_tyPSlAqQug8{ zn|I*>$RCR5FQx|}4+3?*Kba(RfnDP{G+ccW4oclirPt|Q=o49YoAOIhSb@>(+Zq#? zRXR6N1ylA(5(B|bM2K6;XrY2U0Eol88Ua!yKI_VujKWAD>Ke~pY~3A~NJ*4fsVB#_ znrR%9z^ek&x=X@Rl}~V#OAV{^y6&|ePu-C6^IsP995LMOEV*^qrCt@cGjoosav@?id)-(V>5~p$hWM+*9eF z1oWt=?4Ae9gWNF(n6t-|yy3nMme1Q$1%O<0BiKKalU4K0BfgZdRyzryrS4{n8K`HT zUy<8`FXNf7@UCg+$F6mNeZ2efv_$%sx$65kQ=& zqpm$760mDtbzwe@)O{yrrDP=1u(+3OgSCkoVPc@z-60V)E76njjkdM0;R|pKABg(3 znE>PIe|?>f%(@s-9`j*^&Mg*A2L8cSE?NIdvZr06Z*dxiW5mtqvWUN@^(CKK^B^4i zb9xGCs$pl9v)aM}gIQPJU!D?066}5pARIUtJ;@#a6 z+IAY>++(xMoJ!R)E~FlQ7NF@bVdBg~8^#m-eEbDB)rV!53G|>LrIFbY_jRF%*M1`e za+b=j;-De_FS^n43bV#kjXg6Q2@7uCuaNcSI11;cY7Km9a=M!O9>~;VksOx*!RrTV2woI4Zgu6`9uFqII-3}DGwG~mNSdy7(!^=vh zXUeNaZ)7VMTu`M}XwufI#*t;irX~d_I`alV&A_6N=|L^++*IlWv)B{nyzqUP6-E6uv!%?FT`LN1C<;N0VoIPt9@Sp z*N?zY)bW{jr4@?7#+U+cD{H&#|n|QjI@GF!JGu&3U zrdV#(50P4S=Y;A}y}fPWMw=HQo?X0d;b^Q4VBtG>X?xyW(0BlzkB2hCxB1rD;S@3s zGv;pTvjQsxZrVkAeZ@QmOAnoVBPOTh%1TMM^X~yEbd?))#hTZ}Bq}y>J*?Ip(qwpX zvy(`tYmVnOd;aIa=wW`08N)LgeIhIRXY7@g-XhU>IB&edHy?wN4QiWZk@A{P!2CEK zdqMY<=q5JEa9eWA#Iu9PbTK+vx^vQ6<&F8`=`%$#yl-8^!K%;=V}qKKI)}0o#F6@`XfWOBp6I+s;w2 z2A?NrjSXK+iWhKwd|Q#SeO zoWH(5*3XBYueN>x=_$gUYNzAAeze6W!`x^lH^%k>1BK5cB{RfxuL|lCvwFrnET_lX zMvA~TE=?E?u=cMhVdj{R$)*7r`Y+Au3A&ApSjwTRvNbGii7&jju*g}nn|inMr2M-6@rQu#sMy>7N80m`j85Q znv}6!bF^lP15m1J!Jb8UHR6x?i>zt~d%dFpHOq>>b7INKC43%|<$ra%>2+k4<@~x! z`OjdfCv=utv4y*w#tEe}kTC(pDIVxG{mCGy$Fv3L(%`Dn+(dV7aaw>QcRV68eje91 zE6@%pLF4x~cd86hJ$*1_^p|5c9D`1j1CfxPPT4Q!N+S=EFbasww!5NAxy@+u>=@-V^aCBOJ1!DDecU@$`xns7`8v zd|GKkMOXj%Uml?sJrYmR+})~ie`_3Tl`>hm313r2pc!Dn?`nZWdOCVMi)Bwy9%U7^ zVzu(jTy*PIiVE|q?J{1j_56&6)9_9ZXwK79gTH3VwtSd3|hZ78glQ~vV2vHcxXqD0=LPTz? zrqB#)08E#Co?uf~(A&#~x)JNHcb=+luqk{ROor3mS5I<-OAsf6roOSEk?5A7w9mxo zV)tEEYAvKA!*JMMAeCQBmW?fwHk*M>+K_j;Zm+qHXpzMHIvRa!L!s9n3;NS{!1O(P z!Efr=z>+P*c%0xdpTWCKF9bqogs+PRQa4ugho9WIQo6u#sOP3{Lmr(0Gy87NJvq>3 z1B)2jo?hL+No-E*wOT%>7YE9sx8;R{Q1DVtlS zW0qP%LTdE8d;CR;HSOVeen+t^khQzA2T1t#c7Pp?ldJb9&uuzmYmIT+2uUryx*efb zEL)l9<051^^JVsxicz|5^$NDK~rRyonu zuoCE}OP(E9HT1p9eAm;ZcXk#3v=lpehoBq(CAmE)T-C%Q)okc8 zS2iZ(tkFGpT->*~4aK9t>lykAZuFRR)dHzf8h4A`lRD5w-}39jIMCNIk$qLw)yK!- zonj;DMmah8EUe~&!rTTSbNnUvL%KTrJwVxpx_od2=d2&DG)$5xk$&DToMS9UA;_fk1SnqjVRxhFG3|8SQd}MODN( zq&JBTx$~7UGl_D65D2TVA(n3cW!1a}k}*T(aPL{}xm3}u*%R7_KYPD;D=>{TR}JAY zQeMX^_2u=Og&|6;!OTp@=1Ju}x4V}eqMGY!Qa# zuSgluK}3Yg36SFQiip@o3c0dsrlEoPBlGPutTq)>Zl5CKt(lp&)_9QJ>$+0ua?P*AmkoV_ZT=> z^o@BETC_&vk^ME8{^H#W(-B$E2(mVcl773ha!>+hJ^M;uNw37mmU~C-dR!USe3S&l z|2j%I{$PE-A=B>17<9QaTN&4_``=oCooJ;ph~{JkpX3@Dm!=1l72M9P(G?NrPVv|drru^18hd4RTKzequ7rV>X)m3Fx zE3~aKD@EGd6WVTicXUfg0i$=h`daKJVL;vH6o~_Ma}zkp6*WtGT53Z2N{Rf+W=CN} zS_082;&5-6aW@w9T$Ypw&u83hp6%wcDdrjTz$R5^vf#P_pY${Z1i zpJR0R;ka;D{|ke`_g&BPBesu)d{)1YNrc{t`5H+(BhhW|BK)H8yj1{ji0JRIv&cX2 z?8#Ec8Krph;a8W-k9P%_f>j5DYb{wvAdMcq0Z-8?$`xFX4LT`XwIA7j|HZ&^u7CtJXv1BE1@xvFcv48n@_H0ij*}NtK~dyS<+{-g~ZZ8ASnLNySr@` zDkWdRbpq=oP`w(_<_oEqm4W*Hn^Fqn(g#y(!dQ-U=W$nj#?9{-nG%WrhqkwjYpdzr zMyb)3BBhk#a2JZZJG4-scyadz2=1<>NYPRtxNC5iK#*d^CAd2TNpP1pwDqWi#^ zl^`9}@>9A%J2O)y>ko*N7r^)|2kEK(Kwrlqpmw4cR}mz9$YDQDsCuhw10qen(-wDI z{b;w}AUw3XU?$m35GS2V>=LCn=Jc8iW{Hw%k!c9;GOThRU zvkHUR9g}c_9{hlO&w_czH~q|8B?<+MQ}x(O1`h1E8;GExX)aZXIJpz6J&*IzB7KS? zk*)IV6J`#TBPu&4GW*_)XFO3?pRfw|J*qc;(N#+B%R|3X={}XSyZ@Ve8EeB)GUCoj z9<6j0P96)C0=Q#ffuZ|pv`H<$DB2AkpuLX>#`lXr7uR=55>m`lrzcI(OAR#s5Ebm% zN#>*j!Jt;Vq9&6xo3?oEpz{?Cb9mhDrd{MFuF7^bE{5O>uo5EpiT}w7(bdX+AZKU& zm8EMYy}W$o-1c|G8Z8Fqj-X5Aota-wlM!Tz0+?u&(v4e; z*^rO68sSaVTGywSE9m8@14FRV`v9=t;<-w1UgJhGPQIZ&D9zV&N!}TaaY6^Qk7d`?r8#{hdV_&zg@3NaHnuT-6fdEUC zG~||}Ug)U~4NcjNriM@OwSPsQl5k3_91e^07F5}$36xUQ8y1{pdlSfSJu`9FN{n9Z z$ZnP!DZ&`<7)c923ZjvVqZ)jMYVAFqwll@j1Sc_;MmEmb7Cjc(-Ip8VvW(#FEutYH zBg4)T|`Tb{|_f9Sj>o^1{XN-mOvWzL%0cJ&s=uge*AxAC7ry*? zc27$KCmpO21>oIqw0Q+*jzp43Y=ry zrIY(yGiY1-DC2c$hBo;z3W{gfbU#F;P4LRpa_?z>(@1KGhOMO?RaRrz?a=nPw?-4xfzPRk3-5j0js_2szv&6q>^9pb(| z3}x70dOuU{ETp~?7_@RePpg=qPVjvSaL^(_7Qs^e8WfSV(y`V5Fo0WLCyCgbz0y>` zN!n#FP0agt{%3K0c=2487xSV@2ThK0{tq()NTNcAH~Txfd-LDd!FnXvO7gy1o6OGX z*76ftGK>k09x6{ipG zgj`iNxPQZPH(TMtq#n=Z!cLq&+lr>gm7F?q<6KKu#VJtWZx}&Div`vX2RQPF8^o`Y z)bo2=zE2{64455WNKKHroLz$8$>*3OsWJHOHAg_}6Nz7?D9KDAuN`sfhiqIb_QFa; z2keB4;(6)q-(L3-;78w2NjY-hNJ`dGSABm|mi_({`M0hU_}#~{1&Qg4O4aFs03`x= zmiLQMhRlM_K72gr2|jo?}D+OC~) z@$z*1MJ-_AoE_6KkfsieL*?Z-CEZYP9l1@)06t4iHBGSOmD8I@?#T zk|51ft->k+E{Jc-V?(~*6nid0`mF-9zn%REe)IIcul=NCX*|T7T>=5tNA^+)LHt}FqM9k4 zWpuws-rIm0@X;Q8h32BhqTh_SzbZyJ?-uB`7Nli+rDZY5+1LFe2xakBSn?bK@{UWJ zk+|IpD*cc+EgLSj`qJ8dV~x8C=mpkklMwaWbhjs>7pjUX1m@yKa$QOu;nM>J}WSzKcIP?Casn})re z9G*<|_F4=l5HaZtemAJ=;jjg(h00_rDN(i%d9tuvhTvCN$Ww8V(AEm9njTk#Kg3rH z8h<@67urx-d$46Rls7HwdDzEUraQnH;RT?Re=gc=Ho5okQACe1VP6~r?4$e#v5iz? z?-=IUvpslLoL+-|L0%eBEH94aO*3n5>+o(Vp{jd)JF9^LJuh=sZx~M0_XeQ5uDMS! z*UK#ia|QoQykG$i`6!|80g4b5=WuWKfYU8^sp_)p+Sr9w-HL5zno8^&C6(ghlGMNz zCC+q4`u;Fs#}0G0<3lVf@NBS>%>i&L$Us=-Ll6{O48WcWdQ3a&~ zceW&F6v|+Qy`g&-r4tk5xf^30jL!)apJ1i$PB$(FO!5}Q08ETJc{c_6*n%SxkG9-ESJ|@p9Yoh{8iU#D=pLv%*8hCE>iOHsv20x z=dSW*4uq4M9~^iO2-Mp>6JjZbV`hJl%62_gwkgCdr2kik1#Zc>D^+a$=i#t>0*@{# zOxfAjG(|5->baK{+&3k+{7`-CaEeqaS2vHDHMh!YR^w@&MT_bs_cmAUAmziT^6H}C zKkJ<<=1f+S6#UPY>x*``P%DihG0G_=*& zV+H_~{Qq9g;F&}J4(O|?tW}O*8=clAPPLIY(bR%HYc(k;9MuGlX%J&w-p54}_c0;r zt{^im6o%U{(Eva`Gb{Ht18QFg3Mcym7dLMhl^0N?h0%J5{K;(Q1hjt9+TkV4mc07u z{S^X9`e=N5ZfEO}DHra(>gw;8u((_S;^1y)!%<7u z%I{e0((Po~Bh!(TQrbZOxmIWVnPH0ZxBqr`=nR1$)}f`RLKnW)nVa#-*pH-V#l6CH zn{yG3-+Cwotf}ue4RCs6Dw##njMRIf54<)fyBu;_E%J%6Ap>iE>s}^GZsjYO);4bMOV2MUwTe;&^#38JIR|J319bE+2*{^vha|AktA*Z zq6BGi3wGHP@xh`#cBUv_2;UTUL@!(i{k1Qn$U*~cqPLPmt+uq(3KgU& z%w9T|#RP=Cvnux*$V+*eqt}3#NFPoRzRA;829Pm0ZzCk;KgE1I0n5i(#b=n&q7(Jn z?(x47$4R*e54K(%(B@g@*@!3?!Tu<3ZS1=d_i>0k)8!BX=Mo2+uHk45r8@e0ysCp^ zjqi%LlLZ`sjQ)cK6#X`D%9QM0nKntF5(xi0%uZT+4LIcrX_^@u^(QavGkY8>*Ef7R zf)1~luvFI8m#rAUhwuD-uO@f%gQrynNYrvKv>K*?4XywTYk5354Odo$wm3Xj{2+DP zS`R#Oa_l_$DVfWNyQ}idSAre^@NbBJcK3Qz&G1o?_uS`flMjENMYOHandogU382<` zZ5lbkn+u^7uZ$;q`5a7Ku2jNa`O%7jqY$>DkoH^c6|u(3Y%*bl1U%nInzzIp$#2qQ z=voVCjPz+wIJ`N~xO`lDd8nN|^Ij9xc*2OA7y4e;az$e^b@sd-r_foR8b2KHtQn8)};LJdYYae z1-7lbmYK%$xgAF*MJc9>Y}~ernVgO%>~<)Z^b~z%|S5Hk|N4NC0e(4Em(fZ5(X*cZEQMaQrJByiYlaft&1Ecp-uLguTUfHcqSwU0#RFd4^EKdpj;f#g&O%3OS9AcfzXv9{&-k3iD!X8KA#^?L2Gfs{noNcvz-QS$tE z6i7Z4ws_UkRnmwgB>cv*3vaV!X|$+}+Pn79;do9aimcI6RM@ZWk&P4rm0F44M}+$c zZOI~NPKn(s>(=omPs4xf0{qJRZ1LC$rH!XN~I zuD`$P;1v&ySS>$pb0Z$Fx#(#NjrF!Ha@~B&I8)_>A?a&4<)g)#U}2~!h*LvPTk~W6 z*ds|5&++RC@BqI0Fj=5{d>~`!q0BR>*8KRK4UK(oZ5eMs9ToQ4S;Eb(BUOsL^_eSe z;+^Y^YE5pf53R!_R_^3^r!0D6%g6oY*qd_JBZcoXL(+@a+IjfMv?&*cN!JaMqwD_e zg&`@qMFMeNuK4BT`5&&*{SmK5zQq$XmmE%@hyObggXp^~gV*3W49jc02yv1-)4)*|H=H`PVqll8ncnSAj6W<7SI zPEdZaepQ;cP4SNzb9=9~TJNBqyOf;{-htuG`KiW(%D$|Yp^D7}(>;crx1%{ZAl&@c z_{G#;cx-uC<(4OYMmgTUUd zl*?mxY209yPrtW%9+47%c^`Cj-Z}JHsmUWtKolCXKs6R8Po{Alm=l^76aRQTc6eIB z7+V--ZVqI|1N5%D)tpr)sw%KBXRJVn+vvZ{th^izf5X#(;C4nBqw5(s?R~_Zx6Wd$ zYv8d0j}wduGxsU>P<_P}CMB}!Rx(cA zw9ya^-{Xko?))P0{Iy#7kF;v!aD&$*kTD+%(W$O4e7uT;!zBVFgZq8NTaY`CzRZYj z2JI(L$sC-7P`GY-_FrGk-sq)p4JG>BK^p-wP4)Pj6Rwv2)=b>JwK zV5N1qFUADH;gx<|)Mz}B!8-ayW{c8oS+V1iQpD1{iXg_|Uin_y>$hh$CRwa9 z0@YVMp8ZvdL5WpwaIy7|v&zy|zgTW(r@V#PdCys1&M9Zs{cffBV$m%W2J@ZSrM*ef zUSP}uw>ZN#PUr2DZ+5L@6ROX!u^b~sRlY!k5{!~aDp*rF52k@ed6%3Odt@slc*#ku(RSJHdlm#T!^ECq5oSa!P1h z4sxgEH0JD+J*ID<3Szyj;}t}9Ws>Ea;B*|HrB2N1tNl>Q;Uer8&V@UXc;Zw%qW4$| z;(F3^fu2_Obm$nx3Nw%GM$+HePJ2fstrH5J1a4k6j_sM<+&krr_=y<1+Ag2f1k#8ogcV zl<2>+xiD6f9rQDYgeYe-CiB-!BBst$*}QRrdF~So(1cU#MEv~VnC8sLrc%`uIi9D0 zuwB{M#YwFVU4sv^xYD3VtuKtePjm}i9v8pRyCK{|5RbALerP>R!sTQnzn#qh9l$}) z8THdhZG^%}W+vYw?Bw&hv zdh}HI;^XDyQ<)cxn9$epuHLvYI#mLVcm2E|J~s0Dx86XRysoaId@B4t$0YO24X#l= zNv7*}a%w-sBoOU7wIlH?;0vEj{d>i6d{Ju^pI(}j7No(QkmCu5`poCly|91!!R>cj;eXJCp=yCXi^ z_MV(|uC_t!PvgRD5w;V0PL|zy2Z34V;}>B;ZW;#5Rt0p*YHWO@$q<{Kzys+sE04iw zha`i(>V(PyRTG$_-5msbh#2b6MoMbEg}I!-+d=`eTMhd9)cTWw6KiA0GnzwrcTF$f z7g+3kEIuFFy;zaIn=FZo`%atx%$7#f8=W8Gm%{_L7LE27e&A1TERrzGg~jw2oM*{u z`F9{?i`7-@!d_4u0}-}@F>=^_p$%`<)$3KJDoOv|XQS~No^GCuNprcr;Vo{ZGD@V& z&v00ysG7?}?3Xt{E1}2Z4TGN(VpTt#XBsn%0huPzCnNjkuJyU+AnuM%&5d>GuFgMH zib7AEXs@;#3eg2k=;}R|3&Y)n{y9l3Gg@#-Cg<6Sn1-fqt2M~)ZK)MvJYv_&vLbF{ zT#-xc?f{CMGM4~sMn9Pi@8p4z`cTb|J<(s;i8}0c^>6Van4o_9QejDr!FKQyyNTSs7Iv176u|gZ+V-2346gQZ$>XnHRRQ9BrsW2_debCV3!Qw ztg)#=?Gv+^;K5yoazzpvB6{|ME3GxhLhh&IDx%)atRURuH94fIgWC&|!i64BdX(ew zl#NF+9I6ba@Owj5ZTbCYeOgr4L@bOIZFc^4;>(502N}tq33AuWu{wKNY^6(6HwZ8L zN8Ot>#GCjklFq>V?pZRuA-=yp1yvgC0xuI#{5m1%8$(D9K zhEwx71G)w4ya|}yMRJs$NAIy4Io;*lR0!U(PK;$(-qD&Wk{I>qSw*q8U(u39UK)G9 zHu^3eplhWm!`inOf-ohh*eS)zo516NYMj~5uYNxWP&t*l+1#N!3MGYaxmVp-V3eom z;{{*QQ1I+wo^To(AC-|eMjMHGIJHA3H}wSF{t=fD4i$w8Hk%f%r^#Xd zdU={Ga&lVx$n(}aG|6JpvcH#fNfVcy@_7dBG^ z)&-`lVH_N4Jo*a*u4^v)$yaN`*1?0e(@qP=vD80Kd7xf3CNiS+_gIb_lNKu34lbJ8 zvqR36)VbWp0z=R$PfLo%puu;kl4T6P>6Kpz5>z;5A5<`eBHn;1NRi368R)1;G?vKf z!bVIXdBSpCf4*f6nv#X_XufNF-0LnUNbc+b!z66a^Vp&MZR-0n7G@?6yFhCp+K$iB z@dgETc+beJwCjvLdB-vWUj@R`+EX2tP`3C!Ar6qf2izVBF+FQdMPxoPM1ATf_4=XR zrWi^t{HOd6z#)OxezId9Gr5IdIy^6uXNLE^0Jw7T2zQD#=4~<}dhx&Qt?47lBLs4p zB9hDt+!gZicnns$X!GD6{=>3{u#6keZ>;$Ha`Nk_Ck+#8CLcy*Wu(Zfe-dIb1wm5& z2MfRtZOoPM5Kvrdt+TvimL<+OJ&o+m%O{}-sJ#cA(9nclp$x%Uc*hUOdm7OB#Y+cq znk6?6HG%agPxi33oTNJBhka4zJ zAG~Ya)TOqP5fatMKyWpYI}jRcaE6FKttA8YEvvz`=5I12Nr!NSu8SrC!S>_U>UdWKa@8KjtC?9zNMeA%6g#&T8I2L=4z} zIecNc>5*vB*~2bc8Z~7@q>T%(H-a>qb> zfP{q@&4HJ3>13y^acLgC_mv|v>?Dvk%3%0>F!i?My_Dm0>|0`f_crKUSr+R%#nbIY zuK>&-$New7)8DDOgPVkkjD&0wn?HjTzhz5>^j9Rd9btKzKEDZSK9E+*Pn&l9j3=a( zKtx6hYYbGtIjV{2mel<|R9Jq3NqFP*Bc56*ezQx;;Clq?*o(^`Y_7i`ESlT5YFab` za8HfrnzVtjNhFwotb(#*(5s|KTM_$R%uC#5UV{(J()=;tvlOPddbnqb2syLLG177{ zUG)La2gxSW6W8KN;8d3-Vzg{C$!yWORzkQY1=%{hM&`TAH;;ru9wHyHKc>`p4w1eM1OKFsAKDzoX-)Af&{_v~R<6|VNjp-Cau#Y3H;*XghZ2p(2 zdSLH-QBH9S*@qHecJj`XF9b5>uM?+~M~b7;NDvB7;An6JMT#Vd*~(j3&`+EySFJzt2vK@wZ+$O69FSw zmA#BAF1?%x3#TTS^r<=u0z5R^7c3ie=GkLeg!M^%hQf~1B5O}-jTp)JcHrO2u*vxe zPIcLU)aWgDvAn!E@tyfJ2GV?IdlLpkX{#FjiSRz_rj(L^-)(aZNo}=&QFmcdCP6DI zL)Zy1bm4Qfu8aqEJVqgH*sq*YTARN>m7hyxWhLb>7nOEkqx)qc(M>GwOKr`XVHww7?W=OOO< zg*am1juhvOu&6RN!VNNjT~16lFQiw);B2_da_)GUU6gzgmzG$1<}2ei#m5`DggE!> zWW8=z+HcLgAKiStY=L}ckK+8{m^|4o%;->fyvR`wn6)C&-3$C}?brKE!GKMYe?}<; z$kVoUcoQ50nP}do^F`rKy_^qljhy{zAgGi3&I4GclLgG z7bid(rJ?p246!~#0*)S&whJd_HBl_isRrui4gZC&{7%K5)Wfu5YE6bi7IYt&a)vPG zdr+SEd1$LiV8-P=Ny-^&N%~>SNG4pFURE}Ch{xd&Qf94h)ud|+q2x8(fKhh#Ky`fT zQ&MtO=j4U2+9Tzku9vP#9^+{ev%LlYsA==HeUyJXh9YD;Yn$86f<{z^zR**oh!QoC zlS+844U)xk%AVwvd%tzKd(JN2qRM}A zemiFTFUw&r%4kXKuP~nWp?t2s!(aZ^yAa->`pRXMN0Ss^M#IkF07pkKMyIJ*KrG0y}EFu82ZcKuP;n6llO)$o$Qu z>qP9*Ia&PJntuV??F>fcYH$dv0lRJF@;_v}n}KHi$&3T?5iQb>jV}EobMOffj|iB0 zXAk!#)I1B!1_KBld%Vf}cb=Y>=Zz>mKsc$ZsqMiv6-t~GjTlaO#KwI*_dj*R@m<&5 z0mM4~pWdBwmgbJfzuAbd(wlD}ThNqH0yX^_)Ou&$z8A909+!@bTw|dgcK_cA89Akq z$)rf7Kmh|!hSrW_kC(2Vhx=@92pb{S!+ayYXCJY1IH&f7bx?b<{yg=5lEoo4+*qmU z6hB?i4gY+Ewk4--Ix#VJhv&w3zx$+bi`@(R&*E#&`hSH~`qS$FAQJfxRrG)0vn)rY zOAC(1C58V63}|leoE6YSGO3li6Lo-iJ z$-2~CEj;{uJu1&LZb7sTZ|en~i^@PVDwv=T_&X5q2_~LD;8W21VfNY9iKHQKzt>*v z)Jeb0lpt4Z_rELtL4k~|Lx0o`l?$npr(@|9NHu47x@MEXZ0ayRST@xiQ{Knnmp@ss z&)k6bkpz9z-@4J9KGHs3vV!(@CEYf1m?U3mZUd8QRaF4ThIVdT>Z=kbft6mAs0?Xe zu&XiCY^OM7w|I}8j*64JSNZ9dYNy7&=3KBZ^PmwJ=6dS;9v&j8|Wrd~MErg!Pv=MI(Qj z`qGcqK^T3CZ&q`JwZJj8WcrRF99+OvYEMM^Wp&g|Dd_#0%t|CO1h<)RgE51HS)9)< zWLT((j{Ae;$Er)g2}Ow4;yA2%FA&HsYu%WC!`}G zt+%6NFx+65S8X~&->qd;Tz#8%vJ_qm@V|GWwYfVxH0JIO`*#R5CU4PnGc+sf(I&kK4!hcelnOF$qtb zm5E4myk>(KrvySse|LH^2;1-GSlW?Y4x|cwun_{{B?9m@`~-o z&NrR|GhV5TW{nk&6v;ao^He`r*dLa^?Bh8sqcL=J`v;cE{^beopV{aMAU&4osCSo~WOl zhO->-CUR_$uJ!-x;)=F)I72F6GXBKiciFTiti_4UqdNoBs8RJNgP^5kUw|m@FZ>gn zEFYTwUZLB8($z*hu|*PNs-+*JbJrXz)CF}J5LI;=3=CYIXKoTgM%%# z&6LfOV8ig(>`#CDb&Dki>c3MJMj{Bu9+8Gs4+j+P=xrZcjcG6v-wHZQDxQk)rSNh z!=kQe(|R1;ayr|-IvtI@%rt%+{g+!>2{L~>GNZ2wC4r&bi_2xy0ePBMn6%;vDUQ-y zj{drKs4Wt#0}u9jNM!0}u5xisHnr+CB*FiAJ@q3vH;YbI-)NHwm6F)6TmLWD_NT(u z>`d_oD9uDC5JPIJ0S~Pn=WiCLR;pa_I`Wm#gikGh8y=>Dwv_BP$NLocFc)y`^fS0*&fSwQcm0hJm{PGDd#Xx?^dDPG;z9AGVf-(rR* zDwl|x=1V_{v`~j}ctA@krsxj?&CgoXqoT%`#1Y*U&Q30g7iR=dF^Np)3ki#r^yibE zxVt|IJ7FDq8&{gFii{Dvk44VbVE{|TuhR$zyw^N5MeXkT)}jS}+P--;S?))RO#j0d zO`#4NLmNK1KIn^Fed@zpHY~LNLI^ri@EP34Sm}Ff>aA7bHC9av?%jVhF_KGtbAEe* zS#t6H6D>K1Ku7cPtI(|95zi}B{g`&xZ-<_>23^CR`|5ti^WQn&d}n<62;{SWYZ;bx zn`|}X8?lM^XVMNwWGMcF=ERN;y_Gqphqev(A{bTCC$>*=0RSnNJvl`gH@ho1YHJgW zO2RrLLhC?-b1Cu(b0mHz~wB_!&(jeFh`9v@>enx?6Yw4{8J(|k*$pSSs z;^W6?7N31lrvVCV>%6rL0ClYxn&*ldbd|gl2gJ2aoip+?GLDwHuK)J$dcPvj;j8mlzGG*w^f$-J)D-vdIY+!kUJU8B1g!6}JOxB&x>mJ{o9xFbcWfzcMwIGZDLd)9mAoCjjy2dV&h%R zBxZ@cYbw{;w6v-f@4_W=Jc0BPH~3s^ZbcZI%ZiEj{XpB zAp2Ibpyl;L->guFnyj4qO4Dl(fs#;54g6h=2Gc|Y{JW%-r?OxNe$BTMtb@}6?Q34> zqoG)TaE-YWP0akSf0O|iO8Em?BV|&e?0q8!bHP%=BlDLAE|GcPJNwG;w|+fTC%v6j zG|OYsUotFYw0v=D)8AW`Ru+D{=H*0u(n{lYQh%qLcDHB{9FCKf$g$SN>B(BXtq}~T zxYR@Z@*S#R7shpKrf69+pHLZy^PPpg-~qfYoTT>d)IIp&Q)Wy4$_gVlm;LFXAoSVX#tknlcm8(1 zI=$M*7R%kCIvX!}{Uh06qrbPNDm|a*Wp(B0ZLgf~VrSU_7?$30Ho9>(bmtS1w83^X z|D*ZzJ`~MhG#5e3zJ4)`aet3-y)PKKEV3K!s`5S8hnHk{HyI4TL6Swvpvn2g5Dz)| z%)FhGk0lk`i?eetWk)znx8`^5B1Ed3fKd6I{ekooB_Dj&e(c%`MyS%j5)!OmaFF$$h(x-&&ld0$D7 z&iD$azEOzsw@hCjtuA=Q0h8EimB58M3FBuCnTqF1fr!xrsKglW^U@dSLquPfm+o(+ z$ow{|q)>gq=y8T;yFqWdY<4LdA?7I$F+m)@ zNTbmiFi*H>LEZ^YN}wYaTJTA$G{dDcgW+>BCv8M~_BeB=DL*8^s>Ocxi1Go)#EYMVtFoxD_x+^5k}PUijAqJ9 zic7q|VKn?4X{n=MrT)T>h#US{l^FBXg0OlUN#*2Gl*}(@A;8T$reS6+-{iSf95Ex7 z$~`UylPBn2XntEI#07d62jWUfjdkH>Zf#uttO((-hE^7S$S;2<4I%4`b>lw;jTR^Y zdfRIlEd~w}WPa9?TKK?-rasM-l3m#U|GOZe)({HX=@BVysA}FB%}q+^A%HdbMq(qftqns;qEmx^b-w^#f>#?*O-t5yDqzs}bM7`4iq2cLEV@x+VV&74V zbyR-&E1rN7*53|*N@9EcP^mn-j*8LMkpH9q^<&9E#bzp|CG?dWkmOQ-)rH*IeMYU* zxW{NqnVBPSm5qKuh%j(w$&03)t2ItIe>;(V9GX7N&BC9E!T8Mdd zqKcHkQ*bvT9~V=>B3P3$VAF7<{z)K0JW_UBpuk@zYpmG)`e*olb;_nL2_{Mvb-gNi zP>7FmAJ&8ZVWPpw+J=waPwWyRcWkKcr|R&nY?hLnZzq?QX{DjX%*aI$_ncrJ)IA@+H{~I-y^-_GZL>9!DLNhYTjt6G-qdGF2d0>{I+=agU!InG6s?1heF4$Lt5U&eDSB%p2~ z5*%B>+3ktrhRNREkO-+Csn$@*HEDnYbJ21~Eo0Gdg)&1o-WhQ;^P(TP*_Fzh>EZJu zzMlcvY?kubS|cd+u61>&f+Du=%VQ#ubnUtx9;^!jn?*JPJ&BliP-2OX_EFK|3GAx% z^1Y#Q7;qiiep*3Mo53!sA=~0Qwy?Vno#yfQnM%FxmK_p)RxNcm+p96M*(Y+6nS+O{ zQS&)%ta2P0^3&Mj`mZS5sPn&V*;orzjLp5K`ZT8)>zK{*7^WLQx*Jldt5fZLeY(dK z-x&=fS$Gaky)uZ{yIeDCx9t}sVeGqbxsHUs0p<+s{XnIPhK4PiNAE48-rlySJ z@lEYFo|bm5T2&D^hO;Fd?`%4JiUJ!nIaCKAuq{i+J)2HB*HeN(I*G5}T}Kz&u5WLU zsix`R9|f(AjlLxiCG_3^9Kg@w7o}M(>q$WA(gYwG#Zv7gV44oSsM}E$k%q5;I`5}Q z0UE$f_!QDteOo%XAf~E05wC?+MhY!Myxv6OBR3N9bVYq?rb)V+a{=m|L<7jg^h zTBzR)~T^DAfz>~)%y76)k}IORqdIKMy?rth@nz>7~CC5K2m0p`vZ(i_K&Ylc&F=%%nz1a;^}vmcuRzK^=XC?oTLgzYaR9cEWG6S zP$e=Xy0bFC&~ob7)oe|_(^tGW`>s^02;!Yp@LPoD%EVyC18XN+ zUihJY9JT<+&Ru+BYq;6FK+!E}6h?wrKR6G&ecS5I@_?MkbyNk5c%V7^*aymZft~l# z%1j45G5m|_V%@@0C%JcF!NMXGu)M-ip?I)K;nV{#47FBzG@>H@R~q4#Y8G~R%KWBfpwRA_)^zcG(~N9|%C%-3W3 zbBeaM0<)pbm*3OWecP7KqUYSiG&6$P_Fy!dAl&^?`Xw zB&UHSqP#fJU(S6FY6;Jxz3#tx?I^?2N$BQZds&apjiqDI?Z=jUsWMigqvy?h)%t<# zZu*vS0+OIoG_ZxUH?J8ldd0Hima>1rCYgQuh(=&GUT+G-G^BoP=Yres6`a051N9bd zEYa*`7ECzpmKfc61UIw~V2RsKm|e6T#nxXC_my*zm&8ff<7SG@xl3^ukjW;P#nD;g z*EC*`(SqlCSIV*r1bt*~@~Mz& z@pxk)!r6)OySKKe;2mv=6_$o(HTE()BCbT%8KKt49AOT`6q8r|f+rq!R$J{tzHXK5 zg;b7ps7?=HX5Z+VYs@XjN-}q4Y~Y>`ps0r^`IKlXSV;}J6l+ug+!S4LZTlejYNgnY z<`v#avmfF8(ebXn@h&U{QkT9m$NuC;rjA5d1fvA8`BL#;`eFwccrMrG=AX)zMpU!F zX82+bJJMxsa!2M}JlyFpd=l_{Mdp(zwzs^P)|1o0N5*>}&@xuj&S#q{U}lI*#H{QH zEtw*nS>*U^c~L@go?4ebSSqA~=joCR6}x$H z#KimJbwW4Y z03_e))cvSvJ^p76`PZ+G_8qGf4|(;o8+~4;)p=8h%Bt6xhHOW)&Oyd0ayZO%MuV(D z-4oZ*S<^+jmQtWv)Qj|u)k2Up@q!Z^fm@+*QSGx;>iEOerlh37PH9B$Lha~$9S zo%kn;kvHVLU2-}RWHkGvf8z+}4KCUimuemsu>hr^VL`2!wFD-UX|BJdH%F7=IupiodK z^Tc4b$1(1^ce{)jhl71IbMD#o;lH~2>gD4HlN}eiTXFQ~XBLtrCe?HL7=p(e?KJcX zVi`lAyfGM~8wV*xPur9Y`YwTbi8pjgKXQCJlh%btqVF6tXCHf-jf%v1l)ys)vq|Uu zOYDS957AO1dh5=lbhp!aAXtCUv4XOJx(`{~kRXSm#!c&R4_LwwXjryFD1)YVaGG#T z-Nhydq-|8s7fIg9(gpUdLJ_a5BM=6)k{{rbzorz>3gp8a?8E?p`YC+rbxO>|wuv=hjI+EC%2DN70>uv#)vB@h z6FZAAA0?!&W2Yo3TUsZAQwwFp` zI94&DODv!#PZ~|r4O+nU&b*CZ-1^^~8iTQmWg22t)4ZA1^O343P~lJUjXMp0IDk)r zVXON5VYTWL&9Yh!RZSi8&(jG>ns%w3xHXj9)94T^>{v4THJle#988lflJUPtA)HR+ zMR7%(O$L}=igs7|&J9YIp;-mb9}W(mcyA8an;&kFpJwVS%F)eLu&&NkMdH01z?zph z4h`LPaxM*%)Z+}Fc!WJ%HW@|{TV}vKDX3e%&0 z@`a7np7GWRDKdqpeJ)%-85j$(`zy=Fz{Q^5)VV~j$I}N229^410ku%z4gc_D%fS+=`Gw!d@A>B$6he|E+0Gc+z7U#dS}*83zI z&#J8jOVIVn)z<+Iqj1AQ2FB;_>&yVw)&P0laUUYo({W$)x&ykAnIh|}0jNX`_r=MX zu=QTri7NjW_V5KpK3OW1QT9rrD@`Il5(|M58Uw~xFa&aU6~OX1?2Dx~NzGgu>b))} zPSqu8pEK)qv~%*09%Fk6O3sG@9iFg{A$U{EFJAGAfKwInX9YsGiQ#Op(n2c_$ibf- zG52OSqZ+xs$=PSK_ntXEUr_8Qc*nx2qpfd1SZ6YiUxr^ccv1sS1yS70=5emXizXpV z^8ZgnD!yoB(`*L&a(E4ElqpxzpbHMk-5e#1fh>nrZc2V{8znON$?+eK)}8D{tLnw1 zGq!!Ag^w7OL^t_MKOM>3x%uSP-)jUDgC{GvP)h!d?h{-=YzUNJ!>Tu<7Q3DJo!JqC z>yCWBMePCm6|a=l^m6?n{(ouGv28noEp$b!9IE605Tb*n|0P6A79?mixa`hj&%c!b z6D0)b%k(D!|34T|hOYmO0Tp!ltHD9rH-~GYZJbhFc!HN?L!#I2BuRsQMjAf*So#ie z9!aQv8P)PevO5kf2KX^W~93wyz`gwg2@Wv`7ikOCMO5Mm(^mRv? zFyDlKAtLzX(@B>mX(*pMEjT)@J?GnYPv*OP&%@Kxiln8rkbSU{vM#)4A}c_tLZLiN1LlW20m4 zKLm@Xs$RN15S5^TGZi;Lv~qiuHSxVIC?(QKZf81ANjTv)<^sXlsu-DC8kKukp8-~r zvCpG#kW*t$BW|{7UrgS{Fj`L(N5YBh>W=>L>!-Ba#cAot4Zi)neD`1p=k+YwC>{#w zkyB(59KW%~&0M_ODH3VkZC16E1J_5dqR_-<@$8jsA9{a;e^zkBY~6|zgz>djH=E?1 z*qe<@Iek_MZX}MBj!sWcetdfDY6`V})&#}1G8G$>;>C(&$-GOC!}eGEGs;@kk@}bL z=V4EY;yMGQD5gpM=*w)pBEznb&SAV5%Q$KXXcD~&FP|3;^|f=} z0OF!%&LVVpo^9wmr}1dTkFBxaKX-^HR?hr@^A9>(ACkfHVb%!EmyMt2i{6Ao#M5)K z3<2V9H_s2(n1d85UgC~8qWVm9!Y4+?b)fZi&RR`{P88C9mA2pQ{3l4$zH&($Oc6OU zxpk*39?gzjBuhSrP;GwH{kkOT(3;uEx&YL#3i4VP_7MMNVZ?;~rE6*qlnzXLdA2Xh zwi=Z!CqxP8b6hp;kj(Cjf8t;bLH-Qs4f&WmY)+w5VY(tP;@x)9j3+PH)`MgSt&6O4Osg?9>kYs;PibH>j!ca&-OjEmRXC7BH%$X{d(L# zsE}WWM(qnJog*wE3l%k?Cqu;lY_t)t3mym`PU&+Vo9vUg?*a(7jZ4s)`IpjBCEQ}< z_Ygq>8zO;n7aer`k3Mv4MM-g^P&!6!V?!|x#_lL9&v|2Scw3;=7FPU6+G-1)=@iK8 zIbj*oK_It;%6kvC9rH6)&r^6{x|uRahoJ7X{N8&3x@{qwr7n9GXNK9%i|YK?0BrOw z7G?mLF`T#*C>He=0jA`HBG5Q$%)eIZrN%_m0J54!A@}8`mu_=?P(JpPLLD7%_M^E= zvXJz<9VFr^vc7-Isp80$+);U>b7g0t*)_9IxnET!d8Igme4U#my>PZ$=j;_4dt`AS* zIc#T@*O@WYcb!bhOJyjzZN?eA)cxSt8o003bX?`hFK|n-?v0TRU^ETesm&XoC11%p(c) z6yMam^|}RE2y23_mmV=>_6uAMAMH+G8v3lvd7S>H!Dmb{O7A-;)Y>sSeF|tSSas5G zw$XQ7?WB`eqAgTV7KXsiJA{nlU(d}>#OYv6u*knW@PSsQCu#pV7+z!_ng3JuN{M6W zceZb%#io%r&R5a}yf|s+E$Ugu@pU{^$FHli+hs@ezUpJ*zq$-cX0!4q23~j~2KF_> z3A(d*eLyV5Z1@nWQ2Lm8K!ZyoUli5#!G4JECk4Ih%YrSC&e$kUa+Z?<{1e@p2GrM4 z0smqr$k6_3&v5X2RDxm%cwZ3;+tw}|Qr)#uOqy<3UTw!@8Z1QzDp9t!wq;HR|6Zn# zkM8nmaPm$XT!yxv-{BwbGB}gwP87}9!wkS=!uO~7;ozD(C)pCX2<#RdYk;k#7&Q+T z(>OQn=riyKrMyyF|H#mnC|0cO`c|`Npkum!zVY__z?B(NZ%Q>^&aN_kG|_KkmJ*WR zJaM*Ng&G*NJ5E$IIaHN1FINIeiAwsQ8zGn0sB(|eu5`S2kyYL?$gWRdSwl$%!=G1| zO#)dGGJ^@cBEj;Nhks{$q_<=|S#al-SR zR%*R;d=n831Rlez`y7;wZ@tBgp!y<}@v8{Gp2hysAbZMcJig;ayyqikrA0WqvPG)S z{qXmyWT1EB$u#ZYwa^=+3loLWl%wumTAvH)*~m>Rhy$gu%0`A#0efvt61X~XCSJ{`coA&9mcbIcg zG*VS{8Efs%o2<3zadPHekMhD#G#jk=t?5k}@%%A7%?uU|?yBIEkyZPxu}a%hDd}l< zyF4YN6VIC;S=`_AF2@A!+H5QCOoF!2nNn+D%Et@5M4=MT(PSmX)q`~+$>jq(os^Wj zmJ%nqkYi^No*}Yu z@)}yDlC7Wcpn0e?>6QJYWr3Tp_DRdry#6{$PYJ1$+zF80KFo=Z!35Rw&cUt`y=L)} zJ?waKV%#CoM@2EnT*FP_1LX^aijm{kYzwuSwTly{5veY-eERdnvE(8-5#QDF>V*?4 z&_{R>qHn@+^iQJZLHoz5A3@ChF81mTMaxn0@n8em>#rYU^kPz_TyHv$RD8-oiDG2k<|H{NnVs9%K;OM2%!l|CVi}%Ohy*fLVhsN z$(~liIAiVH24-Dw;^(z*i}lh%at4Z)q;xw$ls|rUHPhB|fd=%rmlx%P-kRM)3pmn! zXm3x&kbEcCSEEtD^IbZG^Kb3+hs`%G)I6Udl|Z7+1XdeAM&J4cmyvJr)!~1ccSO+Y zp=!E5Q(f#7T*9i9by&WBk*VyFaiIy~&{D$kDF&qLW-;j!KxZbxR9X47(AG0IP zW9RQ(V{0KYs#43#wZ&w3#HWD69)7jKjm1moprVKSXlEAset)g~TbB5ZSUed0f^Q{g zxA$N>?3BD_IVSMyz$$vuoFHl{wPf}D2|UnRBqINTjWrTGTjdbtQZQd?-Yqm|AuQGq zhO;xm<5&GmLs)t!rvs}HH8oQvikQ&~@K~bkv^?`*&j9P2Sp!vNC4eR}rT9-8FYJR_ zPw}w-<+vW}|N1)z`9I*i|DTZK%@j1fl9IP!AW>p@YR=7FNxW(nP>xQ zlCPs{leEfZ0Ou`m=D&4DJ@DJ;Ub|KiC{}~+) zb1VOE3X+}?Ohw_2kkIcysxJl#E3#8#^Zp*!MWZcCG+0awe8utiURwo+qp`b|6}zL{ zbm~sSWk&1W`FWt*GyPLw-qu%9E*~U>%YfaFyCat^Q1k!F5kobwxx=tJ8~D1Sdf1Cn zksVnDUH_@_$k=7#Z{cK<7c~GHYcC$a9_AN}ZJoLZvR=AL`x=$S#l=bIu0&R^%7d2r zS4geq9k*q6D@3;;QD+rDsB*8WRONi1)}4HePZ7v6C8T~*W*X~Wm8H| zVPavSRx@!juY6=A--W7TD7z`k-toLt}j?2^! z2_e6J6*cTQ$eynsG6Fx4_x54q3FdXPSaJ^i-?uaL!X@tkYNkfcF>f*wt42Kb=~^;+ zxXC>|H~WFvcta{oy~-D7|MTMUd#oM$^TfRUIETdlXNvJWM%idL5Lf7V-FHD16O ztyLTh)dqYPAE1mdr0%O7Zv*>|k}z?p^T)n!YP|3ok^VOsPb&D6i~~{X0;O0%rgw+# zh0f}yyiDW1SDT_Emottv z71({tuqterUq~?whEQIZ?|)^cD-J1pHXQt3#Y*qu2RT!K8j^A$T{jfv%KA7i^-e3# zn_ZjpBBCo!7qUVijBdp$G9{;C z=?ff#leVI$s&*bR2Xv;m0^r`PhPy@ysAc5T+2=nc^y^jsE1xGa{uf^UWm4!i3|jmq z8-ht!&sqA-xgbLT9MEW~j7qGPm#<;Y{RWolCxXmo67 zn6`qyDku0$?GwbdSIa;+>K;-(w1?W_*bcw%@JWO{I@_r z8u=+M`L)`i)M<4NbA4)57r~{cQ<6@O)fnoCu46mA(+8NE_mH;3y&Ux_zkPrBmRnJs41X$lE|3Usx>6L zJw4q=&=ng9Nl_NWV8vDa);5}be^FmbDI=#EKzzM&Cl1&9y^H-jGq3h+kDgzDMx#6lbCNie zCxdy^@7^z3I#W+H*6@~pVd5c7P21wS^oJT!IausZ$Kg+n%`V(k967Z7G!#u+(sVj& zCWFnTe(G~s-IV)ThkiWo=iT$1VRT?twES+4HFr;aK~(=}OemcN&)FvBmoZGgd`~YT z(9maO<4*tW&$))Px%&oNwgFC%bm-FN$Nuf!8H|aNSzk89EPn;!1aICO^x#zg{pD%; z{B^bE86tV(Bdh#;h{1iQ=J+ug>|k{>$zToUtnF8mn8^WOFgUE_tGSx(l%ubuzb8(% z5Xj7ji+Na>4r1&?n{~W2dUxzqsnCUa`+4EoB>Csnsi6>j1%2>b?s`kIyq6ncvh8iy zs0KRI6=cQnLys*MGF8J7c3O$1JGYZhUWg(&zeCjc=c1O?#o-}T37}pI1zpo`JVq3@ zTiJt1zrCK0lYe1-8ip(*6TOYB43Z{x7Ss_R59oNX{jiDN;=VxYUX=bg4Yqx(xBzN= zt3Y<#zO3aJY~wNqwJOtU=7&7>IctaVfzF{8?H~If9q@CA4NFB8mYR%JaW&zUd`&9n zVGDcInt#0g#fp!I>BWr6#~oO=3&G9RAijOX(hQD=h4<>^pt%R9Vh9Br=|O9}n9{w| z;#j=KUAh0gNQ~Srdz{bwT=Y)G#q~i`l-3#0TTI*41AdmU{A4C_;n&e6U>IF)l*A!fEWTO$tetVEcNivHfH=X9*8TOjkPsz(3`LxE z)6}{Yv&#?SU@~udof#Y31m?mijaPQu=JNf(dq?YQ1YD|zOl*cgqhf|>s!qG%QVe*% zGBzmGoYoUMUF&wvN@wK>W??4QW5+T$Jsyn81yJm&lWrLAnA^|ad0*7OP}48RvtIz` zd9_&8?Q840cJp*;*aHA8GuuNU@_XJOq1!(nvKyXhKdR5DwO)L?cy+pqG@mj1l*lTG zueg7)tnz2}CP>8{b4$oN6Dl%HAGj~5`O(MF$9~ravNuF{`|+ysJkxEjo|j<=S}MS% z^{*BHw6pWND9QVO-l)kqsBjTP|x_6PYru$Vs<~G-L4S`@K zZ!S6W+((>)cz;x;<_B5B3IxSD1k##rtQ#sgcT;Bd^5m!sySm4lLv5YxfCtO{GB#GVC8YL1QT9ht)jPKBrr`D($oXCu9wpzG>#3fE zl&z+wy6GEuRL#c&8-HQhy$o}${AQJcH8t0Ue$145hr7cyfNw}D74N){>dq69W(U!ejv`@q@c8(FU^0trMuXPczfo~!OT2&*5@Gu zZRK2I_YR#$k!vEptTeR5 zszlX4FI^3$P`Nqo_FAxCKYI2Qi&EHnHDQt7d$7QXkbsRULNxg;vu3>M0^{(ZlwdI% zJ6-z8)0hJ!&hU8Fe78br&omxIfs<%dW9QpK+f>VAlqPN(@{`gI>Q zX~pw#_|v7`teqL@)C^FF68K)+PwZXN-CPdB-dU`8xw!k@Uc|Z9q)3O8@fu10@?%$8 zo`@5R!Wi93yo+IYk;-2WH2F0s6yseO?up>TxH(B3$dr%y~)ej2TUn_?%vt z+?&_t2?L#AGD>z80)n&YK8+8MevmgEU1R84 zw|U6Fj+0+*!lgd@Iin6ZRevT_5;!{I(Gx$Y%3OK=*A(d!L;e+=*zS^|O41e`+m4be zOzZhne%sCyX;^OKh?vYvqDN8aU2Z2Y?BDEn$s5j*=bAlXOCVVt`OFG8?n%}xx!OO> zS`za;*j|1dvVLo#)~~H&Mk1EL``U7~{2)bhA4BYY8#{m1h9r{)wk9O~YU^Xt&&rU! zfu#tNe&3CmJfBg1y>o&ANM4?CD&s=w4!?rFqb5wQaFjrZflo+(FN|Albz;qczkE$A zQK0YLTpQ%s%EC0vOtbnp}XZu?U>3v%~1!VTgk)IvF{qG z#m2p#kSa6Tr?DT(z4l(Sd5S$y|86st;XK&B81_7o`>C_=CN6}?NfGQsD9mHTo0gskd#sl%ucB@Qv+svM#eC8k&aAL>%1DX zJwz{ztnU!jsXYrT9&b=24{ACdURL1=ag-c2#O0`YbeGPM#9A<6tS_(Cj z`ZbY;(Qdf`3GP3}&(5l9YMKu_!^)Dyl6R-Ra-{3>v)V1>5WAj*%naY6qL&LeN?8A6 zrGysoGYPHHNOm8$qdGIs)&6F+emgnPSMLwdqyN1AJxb%O#O?CC!=U1qi}FSNWj&Mn z7j#Nu)ECrmpiwgZnO%Rb|Nr{lS2ClKRc6zMscR50+bnM?ZtiH7ZskYQELl!{SNAFy}8uC6F|q^3zjP*~da>~r>@Buv(ldHnxuqm*m* zkB!oWa}_fhcq2-j`G?2L9swEP-5_@$Gre1hEA}K-lHMSP%XmWu1mmjjpg4KJqv>Xt zD81fAH>%tMkye;u1UIB)b6w})zU;xoa3jBRgK_imh%W84 zc0(uP*nBO1LM4!ze*}9}dQFo#bQgXa!?wWJ z9TG+2t(If&M1e85^iV)bOYPXzPJ8axfc%eU0+?98Cew>}h8-V2Bp4ZkXs5*P1B7I%rv=WsX+g{=wt#5zeRB z!!O58=ZejLLM`$nrh14OOXCR!<3jb4DF7qtVVy^WTxqzXK1hD!bTyLMDbN6FKePQm z1bz~s3jdqbSgenpV5fZ5XZ=n}YyKerXXT45lew~)O2KxbP`kc}$!Y~bXplc0<;?$` z-Kj4P*MFEoDl4ZdJ5)%~{3OBXUjqUSKQz{VM8YIepQ%r=)=W1?FYOGQa+XqX)Sp1O zCPSx_DLMFG-je<`Cci>#5IikC-YDm_0Rf2;J8C7-Y_%KYFQ_ z>PjaJ8RL=M?zJ7qsOjsHjbppp-wa2WUf>+<^!s8HPA~OCgQnCS%sERc)y^!^09waSG5Zz5+sbz(tYq)AMg{wY9kpr5;;WBfEH z-)|?F#%Lw|<>q7(2p@&xNTuV7;UBa;D^s-E{^Km*g^R*fq^7p~6n)&l#$y{@)%^q& zJ?%M+3i5L7rXfDJl4p|1)$UUjg=}T?zMz9HE8`=FxAuYdlSlIE(rI$a{Nd4G9I+P? z#TqeUTxOfPYs~LA%1c_gbMvX}u3u-zbV}HwGMPbQkc&+V1DROrqTHS75dh!&Y)^|r?X|S%-Jfhwj_%Fi6d#N0GZogJ7&a=>q*oLsQ?i7lEe`yQ=6uo`R47N z{ivpPi&s$f3U;%@sqv77FqUS&hbd9^`!`Oe?O+L4265?GuTvM^svE7ePFy1=?X4xU za3aqV0Kpe`Q#3To8n?%v(@C>?-`na3dw872W&$Mjwe2wrQJoajcF6hmS!cRag>dZz zJ-fMEHMu>8u`8tO$HQ!M{xU^aH`c4(2)42p<;%M&kzy?Y!t4(esh^J4Frg8CzixRP za#Zcp;5tsZop`+X_-k5V{v)(s6j)heK4qK+G<_nm zbM~V^xv#`G)2*W^bhkcwL)`zYcNR78al4Tt{Cb}aa$UPI^x;0ecJ^IEDKU;?D4xWd zuW{3TF*%#{r2$vGufWRP7H`{|Q7zoWqPMZkF63J7z}ph|KO$$@l)09LN4R!fvH9Gc zv*^4Ymp@}#)!p25PQVIrF`3qFg4jX+xDY*wSr7A0iqr!#&Oo&HSpsn=Lz}<3fb$H- zk6=cR2R~Y1`8t1bO6B(If)j6@Ot;D(P)A=*n-s@Os&qK6je8RCM6VoTV?5isIqsHGD1|A> z))OJbcTJ7I70!dhb->wQBB>LnNRIg$l7BgEpkE_2kv!e^;WvFU1iy{$;#=qPkl@mq zgqhiD-5LQD4YjL;sX-EVmWLU`BJ)GcU#)qsfCc6Z4RFx+K3fzGAm~;%eS1!2UXWCc+Vjp#c69J+@lo#o+vL@*UM2Gn{R&fmh7o8=>cre9!3);ilC*Cs%xX-}5Jr zp5X$ST$zt!2vFtLg8IE-NX#Z$h_k^yH!6CpUlx-3-80%FtdrXaj>&aCsof`1$z_}I z*?vWy%E`c(lPz9@1}UU%i38XdcQQ1(Hlu~rbP(Vryq<;$3F=VtHmbq;(NWuMo{9fw z5%OngEnza##r}l|i}rILOQ~0Ao8$shIsn++k-6%(vE2QUnt6P0kLd8XA-9f~VxnU4 zz)RtM^0Q?UGR?3`ml)u?kTucmj&o5xQE}rWjem%(f-Q`dzlkmEoDV>qku$%>dXc%x zkE=l;)DN{N?v!p$Gqq@Ru&b#6d?T>S{uh!UC02Uv188Yw|BUe}Br!9e%=gkbJV5Hd z>a(k2DuSs6d6KdPF%JvRWAU2vFL9NV{r-Ec)r?p}SK)8ON{KcZs&txgHBYi1P*=r7 zlav4m#(%;Em4UmY4B?$MiN(*HR9h1R-JE-8WG0#$*2XB{L)g!H)b@SKXSw0!6Q%uR z@h9d4c1pjK&L^aaKS`-)j&gzM{SHo%@t?+Kx5F$rq)g(Qo0hHYf$*+44_fL#uALZC z-_v-Le^{_4q-6+!k{%mDKjn)Zc|DYfNUbvu&G%|xW9Q&a9=EAh9z8Vz4*F8g5~7YZ zbX8+s06Z80GKuBxyS>4-+r#$vI-dNWJJ_irR3=iTj~T;GU#=yQ#6)SSXF8FUZKwKz zdF`6@B-N$X6w*o4eVRNRPIW~7hS=iO5H?pB`%R)5SMrgWlZNy9o{-u*%{h9%TR2kP zv$2lw?w8@0_393yt8+)y&d#-h??PE5+^8^Gx#3Cc12hj)pWCTsRFG9BYo_a5k6-@ot=IOsYYkr%Z91sntMtZutOcZ(>`-fSMB(VUZeFib5TR=p4{{5 zwrqeESQyyfV*&%Y%a;!>@3)_$c+-a6+t1@mtTQG*du}lZbVMyLzl#k7$$W1X`Tlz^ zL_w>%v0fM@;ueW1+1-29z4ctN0A&88a!~l+XgA1>{LdIXhCJc+C$$2ek1()9jA;mx zZR4?8E&~?2vJ(4>S$n(HoKh~_;tiwY4SO}0pETb&|DG|qaCRVSjQSA!DW=v3+lwW_`KwT? z`OLVK;a#3PuAYEX=gsjoB8E<(%ZR=IWKDE4pymL3=%%{%#(=UYdMEaXO^o;zN-8#^ z?7(`5_8$2k)Sck_WJ(xP`^_Qfu&D|fsJb@w!a17r>6 z;z~BO`GR0{hmW{UhQ9;``L%=#kZD@%9Lrz(lon=gOkU(RQ zKv}!q{KKhNQd@TRW}bhPN|_@fdTo80C_=baa=dN5avWWonjpd3uwrLUkumA5qLiUE z7GQB?WN}=f<_(t?USi$ye6e#E4UO;2-Cl3BGECc2iKt*UAOPN#HAvt4GmdV`UCzZP zYM{JOq2NqA^;la$1{eHkSQ$X5g{+!$c+LVrsYr@~MTl=YTryfdE~Hh9=Z?0Ym4`yG^vTC{~Q zN3*XuLX5n63zAKyxH&l)bm4K{Q#3p_dcWx&1;{hiLUjD{>Vp`XS_ zFu{@WzUaEs#HZgru~%rypi+@(OcbksKh=O&3mIs_Ta1t+kS5SEN_xl}w%CakS z3Dcw?P~Watqo`thy6{w2%e$;A0FSkAxp9>jCt>Blf4uT(33ZM%px0SmK;f^&j$%; zr1AqCW@q_Ryb60&!&$C9mI@@6EzCw{YSb{ZHjZez+@SY9S5I5vJ%-X*$u@868DrMs zw+v!lG@Vui0@y7kfN65Zn)Jt5YLZsJ87`1elD(Te zn{B%|0mlt$Xl}C$U%6^jT>dX1cPbvgsR6ELUy2q5{2%3UPkyQu7HyX>DaigB=_tW{ zV!{}I{3U}jP|H^!T@OjAX9ju8ZF(QrHI2|I%O%_t0S8KJE?{_X$!!u))nAy}y4_;8 zwoMOzh)dV}Jd0EGM0qV;)>%EVz_?z9-F{(jI-QMzVpm8ImM|{B>;>p!wrBBB!d4%pT3ZcaU467vh=XYlR(oWRLX&b0m_eafABd%F%)2>vdK zz&V-J!wq^a+XvAQ!tLm_F3tm3q^>_ZyPm4jF!8>6ruQ-}!z8Dwf=rgb$x(4LFevGl zN*Ws$HfBSH)9$`mN8YoR@;z%40*#4rwG0_LR$?^1V%GXB2N$tq45K$0xhBr5z2A^C z6UEwulv;id-j1)tAkCHZs(A!uxG1#E+tz3w$I+U;Vp1x8rPahl!+g89rI_5dr}NCS zON;AH=k7B+;Fn{1$7=H|&G(rAjn;2nM)Fz#Y2mOJB;LrQA44yktLGeFH7(Auv1EEt z|CD`GB4LyJoAgYit2Wv@if;tD%TbX<0#@n>(2=Ha_0KKmcuA~KU+`K)CPSUaYVU1- z22!z^tp3i!I8BamFj%O}ZfmTA%%lKPp$bW#u3cCCTH)uH{K0W&j(?ls4UM7I!56-& z;+vBIqMW9hpcgHNJv8>0jF_K?~flLxck>WSE6nBN{Rd*%CBvUHK)D(Doqe$+eld4_ zd-?Tzq8Rg4u8!FXk5eSGnxyWNiXV1USR_6aUE%RUgU*O~tBak_ z!(cM-K=4pw)#h9B8lS26il!YyhI(qpp^;Jz1)BJUzVL}BTB62U`8~`>7;eLf+GFG+ z{iew2(#V{p@qRqOQPr8Wo>^y@v(<0r+FX;}O8U80_k=I7-EVJcN}W?Zo9*f`ABXxG zD!+Z^RLy|H;lV`aKMq=ESqiIy&)rgU9sPCvgrsMj58DOD ztaatY7{WCO@eM8VNQu;ZUnJ<&*jO;dQ^jhg;_OO!ZQ45+M&gC$Y z-0>iuBi|`xte%e_caNuTh_gKi3z{r56tt z%Q;omC0SU1T*&obCL1y)$m1YaJcWRLX>eAq5ISfpXbmRc?p`18(x2 zQ=qh4`)3K4BROsv1*3^ADdb-_fi^^|i1j63n~y0eJ6p2}g>Bs&V$^{@+7`+BqB}a% z`9Iml^&cOpZ9>}Dvm^@XeAcW`a5|kllV__ygu5~RoM~V?vPvbu6@OC^Bs5wHUF*R( z2R45)6|+9G*gx#ELFnYhT45NqcyoC>vl1;gd7sa*7A{~W9XGt$zl`z9Nf^j_Am&rU z{K5jJZsb4rZtT-NF82}E*hql?7(Rg4{o6J3_}`;Bw9UhaCh8MgnqWGipa?waAv{_r z%+?p;1idn<;4V8%tVqIvDAOq#0jHo!9(wXotGYgkA`7a-RA7TXLhVf^sWtf(DH*pk z+&P=76BGCQHRc_Rp*f9ehS z=a|q4h9D7sEf_=R^sG|!R*`u5V>Ruli0pXuN zV)7_%9|k@MX`CG8TN#z_Pi=YXM(nHrWuXa#&oRhNdR1mRypC(MXPrwFSF7tO2T~;}j}sZfU|)#Ai1aY;-y*Q?~V6 z`m>F6QW@E49N3hhW8s-twDI2F-lvq(eYpNYu^4!EzAmWY$Lh@wkPMexUf9oQJl{H- zL92WnJa!V-wkQhlsQf?G){W(z7GDI&RX@F#lMAjpyF*lR8(T?H3csG3THR6`$#|$j zWV83Ex@J_(K;Ol#t3-yF2L}w6JCC z02yAm?&i?67sdauPpi*ad{RHdmvC2XC9kg;nO{mN$moF5NsS$OE{r9FTAtn>oACi|M4FS<;MC>j23k_ zFc!!?s7ZTyS%EXn`oW4xS7Cgqb~eZx^y1x|3=Y+@-dt(Du+aKgeiyr->B`P>Yrd|{ zNKdaGVVA0r-M0V-hNne&zlI<|;N#Xjo5MhnC%PIrp7K9SimnlH1+NrRWfZR*DzorO z7q_d`%`Vp?ev{ztF8T1Y2g}$v@rAzUs#(>w9_`~+bFRmn=_xNSBJCQJ)Q4z-!9P)T zp?7;J1s!@B4Y!xq|2%aAjTrjYSJ%V>S5$2)(Uc;=a@G7V;ok!i0d7V# zNOY6QJT*SU(`3b~a~ev@Y<)m~=n!K*t;C1U@Hf1?*`)b7JqXI=+UDzO^VQOLH{Se5 zWn(iLdlKLK<^r?4>2`#?1nOjd{c=2hH`>RNNN??#Ur$pCoYbzH44G` zI13pknjgaJu1~(sJ?3$r5sX_9@nhi?h5BK1)vpzMJvxifB{{wJ6g&U*U0NIgEY$Ww zTFNn^_$iS$BM=t}L%??C>cV*^zEKOnS2Np)dk@VXsGxq~3B~jGFqi7t2&W~?CSgGPwZV1QpiEWT8c9#{2ln7;XGI++&|`=IINDkL zl=+u{HwKQWoRVQ^9B-^Z@!SMt)Yy4{%Q-;L>)2%_Ftcd&;<|?si{`kt64!Us!i`m+ z-sW;OF5SncKyq_;HVy5)vlsC>6io{lbO+Bgbp_Xk&(X6L>e7lFJMP!ZzltZL+?i_~ z_tWX)8c{bJiJi2`l$7=7S(Rp`n5;UV)IcQ76Vq`WRWyfDzH_==Yt+S#BMtKR?*tLY zD1V&zVGqH03>5&I)V}ikuvyu9>@GTXS@`LYf2nmv_=OevQ9x-R;hp1!QHXkp+THk& z)F|xPl-tcgPrw7ZuZZ|4aEZ7p+uVBIb2Kyq3_B(!rtZSGUecLaJnT_T1vW&t{CnQpj0|z9wIlLM0ZF)al%MsEn-y<9f!jyRIq zO?fR@_01tFc+cHYa!vKTm`s96_cOh(L_Y|wiwfN`vOwV3F7s)T%0O`Lg_A_q4(gx* zyMS8OOq?$azJ3x?J`{Btmm7D?B;3 z19_SC=wF1;1voTe92RCSl+TXE5?Q6XAS=dZw4ik6-Mx90cA5NZIqJ4LB?;4uZkdvX zxOF>;kk7{7E3N%4qGxLM#j?CIW9fh9CDA3>I@nt8g&g&U{_qh^EyPaW)W|vNU+AnujoUU?)MkX$%U?|pOxuQfnQ4guX@HopU4CQcD#aaIb~4P ze%uD_ygXd9fJoMTpEi3Pshr4k%t?vJmy5fPEYLg5oDOK{NgTJ2d#rBFHq~8JF3eC@ zZdEYW9_mxKSEY^-O=aGVbYm1~dT-zjpM2z~$?>LR3e(-@R1wkn#5!JWZixK-2-@~X z(O~b(U*qgb6p0u;uGWR3E<8d8``Kf=ZpJ%vtKWr8EaBh*{bCcP)3XkvVLgGKsv6rq za~<}1W`h*a!|S}25uQdGSG)^2xTFLNXSd<59TyGlUQMy-PkrlYph@ z{lK*?DKyKu-E1=Lq3{$#mRg<@|08b>eO?l^RREL^aM5Ie< z_4Pubh~c()BDb~LLF2A_!4o5{dZlX)7Y?DF(K@62F@V+Tc4E}Ld`&3qUda5t7{VseJ=X~S%fLzD()%5Sm#`d23N)z1PL8_Z0qsip{ikAk?1 z0@Y-C5P{!!_U~1V)zW-@`a_5cnV1E+O>eh^E|WA|BG75<2-ui%_a-@~Q5%WI^E$hM zlw)H%(_zQHUL1HpU$(>>d1bMTd8%vQEm<7hzMY$+)6kwz?-Jx^}DA6$S%$bZ8^kZK&rzokf z>)lz6PWWR!c43ATlzv&`S%draZP_S-t}_Zf4pR*^f&J;)p1-&`O?cU+b3FV;3xK(K z&WK|WBGzy_g-E7TJ}6a?exK#q%W<4Zf+24&-fKXAoMWHATNDr*pK6%rKwj#jbB>&8 z2d)xI`EtzBY$E$xLAGR7I>o|%1|KFz6dzac+Pxf9v(nm{?Yhc&wi8_PP&7{EeuRP= zs+Q3TLU>Q2qb>3r^pbu?`*NS(zu@C~y?#0p9o^t=%y(;3rDCQaFz+wCC0T&!E~``U z_Kb1KBjV+o#ZNj*GwN-cWCVnQevw~N9ZfI$paXKV55Rs6w_UDWfpWuxtz znacD|7z#I*1CoOzG&yFZ{|{?#9o6RAt^HD=6pFMsr9g3qBE>1ii@UqKYtT}xxCVE3 z*93QWcbDMq@P)3mzW3d7&KPH(oqv;&kvwug_x#Q4y5_c`=MTYVyqC?(6)q&*=h?^` zLZxaA523PO3~#OyS&Q+ZrcqC4J!LAZt}C9Qzd(a$8ot%`LzjNnI3<_*3}!eQ&HaVYzDC3k^(YDFw%9yv?Y?U+F9tg0&CsTK5Bdy z-2CO0yt`YzMkDbK7QS3cUI1uMEr{k?SaHNnQMS9(95sse+VqaaL2Bj*%X6_7@QM2w zKdHJF^fX2tf$yiah%=c-=_j*`#oA@LezBT4+U-q8nP5#9@tjI$&&DSDvjmsxIVLt9 z_2tXW?IBLjA*u+Wwp?}%re}H>3pwu-Qcx+6?GT+#=W`t_SIpA*F!_yAXF?>OYhSGp#dTwl zAKZMdkc5bYhOxtD|E6Zb^{^oH2F+!}kLgZIV*!018@J;8y}RO0K9j%alY__6y<9qZ zq0>UoAY!sQ_nq;1=nmJ)>>{Ej2x%W|qwx}Yp&>y_*5m1z`|s*!9JK7cb$mIW2nbjQ zKko?iG6k^F0sG*uK3ryxwH3%mC|CYQ2nf&)rx!-`SSgBrn^TGy&qGLI3^~0>MbRx> zyTq$YR#QOZzaDNUe|&gIKoLGIl;f(8Wf|1CHls2dfsBNUSmtmfDD~N9%OA!LqP#`? z#A!0+r=?dyE>wbkTKDan#=P9*7q%2WPbp3or( zwK6=38d&o)43ISl2-O-mVsyCtB9Tnvdc?q#OYL$tW5Ba}BO>(6m_oiv-A$t?*^&L=n8p>genCqpr|8y18Ye~N> zI&g}#1TdV&Y6m39BD#98Qbz(6)5g@GgRhjO6o+6V9HXllw}m!dt#KAP8MFx1?mc)M zM9Kb0Mz^Sy(#Zd|kJx5U05~N6QM2nQnX)(UAqz5u?BG#_I#GGSN(YSRQ zpBRSh&o6sxT1&}Zka|TV;-t9}ge-sXhEuP7bF~;p_X4Kn3Bm9Cs}?Oaa;4g6e-tV$ zPRA7-mB0g*o_UKq_W+8olZP&Wk%yG$Ted*HZyHQ=9KH)N@7J~t+7%2*M58-m=i8-B>Lbv6XCD_P<;Zv`zq`Uc2Pv>RR805_Hsiu;@m7(fyD( zKRIqRFhE+(w_}>a^%UT3o=IGi+(>)2+L_c?ta}{{e_F&!87n?7a&r*UigsmUMiCVV z6o`)?%lsCaXqw^9DL3{$XZx=5Ri@J6vVGIlv?ho}8iNF*z#L>>1Q_6KAF4!SB5J;+ zO*XNR!$4-*QIrptNi+T8EMq{9fl5x;3`*N#5u-7!4ll>3#wMy(^&<%)s&7!5}3{f4lH)kY?%j9Ni|mezq@N zLUXfWH$kDokgxpbp|MfVMqH-7X>sMnE(r|HcPbnQe*Q{Q1k2yN-yok%vNOaHQ4_9q z)yMT;k-(m|k%#5C4=GSyU>P~!d>t_r+{h+hU%bA7$3orVR=VL(#7}Y|_Z38^%9wBj z59yHG_fUZWb@d$5`>pYMS!H0A@@0np* z_Fh2A*nPG87uO{#*Q+ct9(%`4sbq%!8Qp`MS6u9HM6z@N86C1~ETjHrrUmE-i#?Zh zl}5k-#x^{LpMfq`QDoZnHo*L~he8(Edr;T1)kIhLaTNL#DC@sj_1p439op&S+p zxZL<@s;AT4-YQ*|5@SO627+>GdXN~SM~dB}fQKG%G^U|KFo2>3Q#Cv z0;#Z8uoM(_4WUaoohNgcDGMtWpVuHwgCcPE*q9NQ@{ZbWvw7-lPvx(BJ^k-%c% zAtdeH zr(isCbXNDP8L8~}Awz|s2CBC?e-pb9fa|f?Oc-8>`gA`mVUz`8k=Y{a5=auU;Bg+k z#e4dOWv5+&LbztPTKiQ_cd~F=lFcw2S0sev*se~w_cE0&?oRezZB_)so5yeoE7g+BKD@b^ZG{h_%_La zSNm%uMC56E@S)Cd04ElJTVphi7AY0HmDT&95Iyidp~j9@?NB4tUh&r z=4u=|9NVdja(8Jw_j+cxbSAoWD@>!&umM-(&S4hBkHhgsPPFt;z487mKGpIYx&tl5 zTwguVP`ZXZjJI>;)8MNFU6$fG8wy2EL3`JuwAK;<+ub7NP8?><9#{670!Wtg-Pk5i zGACM-(d5F)E>o@>NQ2WMX3MLK+x-n4;_zpovO{h&A)ZKUVvz?~#P3d@&RZue**}QI zx|bhJ?0T#5B%-@0T2=TDE=Hc!*>GX;bWuFqnZQl?(iK+TZNa0LYl~i;Dd@YnmWxKV+lTon4yQGU!@IaO zVwgjBfNkATNeH*_`!7zt+h|`^jE}-%g0b9P(rJa@vadf}c0aDsso&ZJ(N)0zz3uzKf|~wI{QsPrY;RrC~pSG`R6*=+dRaV)pzZ z!3p_ADqZTNpjGq_2NQnlo-qr8u(@n^sXaDBo8#|$N=tG7YM+gy5C?^}+4RRExl!ut zx-|3f94~>s@~%%wADK4@A=?@Rex#9fdXKzrb@v#0wv&!8BpzDKzTZk1RHK0BXt>>? z5R~h}fLoirYBwEh?h0Fao2K1a63?IKZ9aYXFxrTRg2fC%ZRE_@{yE)jZ!}SQAT{d* zRrh*4v!k~#RX>xeocE9qUoX8j80+YekB{uDf_HN^9}`b8_$_Dmb=>%54i`b9U-nX* z;1T$nbNx5~*mjwfF3C8@IVf z=YCl!j+CWd9$H{Gya{Ya!Ma%DE^P|dS!b06!oj#rhy=eW3iwZZjVYnQz%B{Q6Sjmm z>e_-^bUiiMQo)XV0pyp7t4kQ|nBIyzIoxaqII#1WS_O$b#+n;sfg91z^Tte&^JU+KBwd|9mi%rezWK188Y-% zRfTRZ`I$x#qhiVzx#|abeCkaK{O(Y5G7G_SO!}Uy!2Hv3CWIX>C-UGns6xQ_{Y&ki zF~9z5%B@uYA{_bCLxK7Cp4{_h=FjVYug&*A`O1;!aH4xy%2TFy(a+Go#kmLO)%U$K z8b~T}4qiCY?dARNq*o!4grI*0R3Sp4|y7`nw%fVPS zn+Z0MyW<=cSvN?&Hr$$n<8EHMEM2{P!z#}u8U9{)TC(PiT5s^Z`Pvn$yu#5=XbHD( zJ6RJCNGj^~(&(#3t_Kw1cE3ZrJy>AQJu5ti`XW{ar>Xh;T611m%b9u8UhI z^4Hn2B*}AilwLemCj#{EsC+W!>saj0#cb({RB9QfOna_zS{IAtZ%|4IxS9;p*Y=X% z-OfaI*`iBol(A)IhPl6*-|Y0GUHqG{BDSlIncOp+dHc_g13PEKjx@i0tRZ62YafDL z3OSljov1pwfHoAr1BLukvZXTVlSRzCE7GeoUux$hFV|_7#7yvw3i@ten?PmyPlfKS zwTz>39TOGZY}7(3W4p_ToAGfqa?#NV9QPKg&G^U%Z=oCDH1QZh5#RtLs{z_t;0Gmk0(8S!tWD^74{F={dYW2(v z3<@TF7|ym5NX$lcLw&XhmS5`BEf+1rD~x0V1Pb)+7Mwqgt8xOxW*k9di!|GGOG61* zwk|YLDO)R>lijiT8ks$!&S_<@qR;VZi~REaf~T^OO~t^8yAN00HgK- ztzt&{^?)8Y2&0BQTMVK~wd2KSvx8q={Gb!Qnq}yU1d*c_7R7j8vq<^Os>K}W zaw`OLxYk9!+3XDHF%(@d8jC9?S6|!_4~sO!#uUrvM;6E(&?x6iVfZ~TEvo`Aj~ z$08vG_<7U`0WzsYeNfmVIxNEgpf^g%*GnwsrVNfnE<)nBqJ-Z4tUu&zOAmIExw7z(?af`$PIh6@f5Me@M{{z2uSLf{ihXwp$xl91qu{=*& z^@ayf6{PqeZBvb9@T!*h52CdrW*>i|6rZhEi_TT)#j7-V@)L2RiVi2mSFJUl9A(3) zj;4E?)YpuMNr+pvtG+{mpIPx)&t+!z;?=yIP2R==B!F7b(vB$9?QmSv$_{A);Lv?) zkT{&97@AOx@rTM<!c;>f=V!iV|@ZYAl9#5wyHqx>akO z%|#0dJT_-TB8R{ia)tw4f?)I`E7i$^i3H#B`_;=ez4F-v4EdLKe^99jYZMO`eg*Ts zXpHKa-{HqP)6HM2la!)B(FiRHas?TN%(I3AWge*lu}8I;!+AHyu5{1XxKti&caxUOm|5?m1Mg6m zkP{-Vt65CO=VoOQ=GBav0M%E)XQ*v4mQ-=oChgAn{P8v}gMHyW>QoV8@}{8fJcUH8 zbGL=_9F=5{lYa6vOYxK|0$1pCq37?*YfJ&lM5gTq<#fRKAIe;SqJ5wzwhcAThLNr> zDo@@`{(-Od(NL|1^ZLC?ls2~#`ev39w@9xGRRpC7XAJ29;4*5ymISc5Pq+RC`AYcw z9gIZfO=79#a)YL-tnHQLevW4`St-%gKy6{ImeTFO%=w;|I}aURM{m$l)s1;yP(Vz_ zDx56$wmCvP8bumfZ|?z5H+QCN1Jo1x5FIG5@~b5~vFT|+*p`Uzv|tb?uaaiH=d>Po zsIMWn7#btm?J0?dI(oU%=`Y*QEOQI$oIj#~)r)~5$#KZZQt+KWtDgxdFPbu675Fjh z!@g_Si9wDQC_)p*q_9GlJ^)z4?|Yf>Lz1u_)r{dkF-SODQ$ULG-dGuW*vjClzXwm_ z#a?e!kl7RgATQr*l_H64VXf=dfSN_9i+dnq+AM^sj!1t0Lj&=>^uJ@mhMDgXuH?&3 zH>J%&LhkJ6o8_&bTYfjJdzV`ResdZZx_3eMN331`Y0>vtGtq9K>JUNih_w5qlZS}T zMl7q_hvwCY)hBE|T@>M*CeiV}`zmvGx%sLkIql3!j|1MgI;MS|)xFr@a#vf%^J8uc z=|pmb;%_z0T8Q%vanwtf62|ryd>E%N7TN}k{E$LIYMsl*A}LE2F4!Th zVV&5tIeqaepV>T(Tmp9^|8lb zLo|PZK9S%(Hd~AlhoivAHX^uBW~6;O72Kq(GAm6ybB(;$d%N{4^s2-ai?<_=M4&Xf z%F!);ZJI53bY&ELK9=RE;!gesB}~PIMwV--I&9g#xEn3vkA$^jc<;#$jf}7 zkc*(DkpsVh1db{uIVmHD%Um%6-G(*t?Mwe0HDi~|A7C3gLhyJV>9;8%jBGV!&N-O} zLpG#)-KXzk##Dl+7f8q#gTF+9sgAd?>r$WmVa*bucd5Nodx_R0VFi?cj&1Igk;iw6 zYPoprTz6u1$Lw+&c1_p?@rQLvV!ZiMo$b=B)r@{(03Av4lT{kc|GN{x@($rhbx@vu zq^=|D>a|Cf!0Aq3L>={L5;9ud7StS9&QTA_=5mw1nJecf?z)0x)bp~EaS$oP5>%t z#PSk0mkmK?1!{RD1=EX912W=gd zs%BF;7b&u1$x;d)lo^5amTk1o@oGuVT7h;ExnaJ=%Bt5FemF}t1^Zc_)<`zyCwv_3 zadSav>ZAEtd5>HLhmUzb^w#Qrb)y_o>uEDMfRd&W#y zxf)z4fg^M@?p_+C1yggDB(^`rms)1$8SD=R7z7bh`6UJtV1}$M+aVT-WSGQmi#mkRBaJ0NaGfJj`@X{omn9c4D)*jC~^{u!YXkP$$~PECRExvDm05S=B@WgWpN}m{5(doQ%5{T{qNd!h2C|k zg&U@Ud4wu=*v*n1g*Jcnn_-rI2$0#l6r_Za#-ol1xG1xj717zVvT?8uYu- z2&Po^wH&o8Z|Y4#N`*d3V2q=;P`+s)hLd47Fr3{vG8cox%Rs}QR#_`thfcu$P4!}p zta~dg)^WsR%~0LkH;+eXe94=C39sR{0gOLXAWi&T3k>~R09%|7PL`78t5CodL1y?ME@{^hPg2* zY>{aOg#u6C(5pV-dvk#=OHJfF8r!X}hyx zD&bFwndiEudMuq$Gt994)2&@?t?el|D&ki=n+NjM8Xh@@Buv#Risw@y-9JVuU>}kT zpz#y&_8=DHY&qE8UO37ds^PvKm3TBPJEcv+{dIG7WF;rhoh%tAZl&_WhetME`GzW2pT%w*C}(|5TS>3d;L_qNQb5yYY28XV-zyEoO8 zP-<%&9f{%RSxV9iG0hIyfVn}J{yvM+^>il{y3!_kt2-Vnd+mIDyOrb@dqQYXjc+HaDVkIl6sTg_QD75*~mR3v{^4R#ZYV4 z^08*LldgZLEK_x|9ym|e7tV6|BWd=@kB?CR?as1MBy^bV0m&n zcTKBjY8}mna*6gy-wH3bC=v`zv2@jx3?i`LoI-79^+cmFe8~N<~_9if+DRIp4f$Ij-bXPR|NeNd@x*M{O`k3TWH^%X} z><=aiSs%tIjS&vYCtYQs3$ZG!_;*+s=|sxz@!0V^RD%G{oUldfd5e1p>H3YifoR9j zTlm%Bx5qlHjrGvKusnRp<%J?8%r6lSn?P}ThS14#(9G`^`&J9NaR*T?CAYYQck-EF zJ-`e3IphwxOfl{+Htvg{?H);e6;upuD+jma+_dw=L?z~;nRw+OrT*%2&enVP+?#n8 zcpsaJbLY}&c^Dl+GW(72i`CmMJ`W$lTwC{UJZXmVn zvp7srQD1E(q!w%@dYnl@!(LjR(4no+Ds)6IOM`+g5;VW$#Gk_^Dc`F}A?BYHJY0lc zByS)3e5ib)W`mL{n8CL%zI+$s{YzectlA1~5&e1ne^8hIPq5Q}D_E~0eZr-xCt;`7 z68!5&z&xTqWx^=aO0d;EN>Awh8S)8z=bGuhlo2Y*$J-PH%tq>x{)xEx*<8hQhQG2_ zbRCyiej@udx3F0YkgPzJe=WOEe2s`RDD(OJ>}ox3TGNAx-*9zCFU={eB-EUvT0WUR zG>F4fOIF@;YvYhdbSCpv2u#)QZQrXk-HcSsNaS`N$Yg8u_d-RoMp{%Rw>K^|)l|exXZaKGaaUUu-OsZ#uP3 zp#$}NZB&--Xx?5`T>wT^0I)i4F4oMTVgBK^NhL+_VZ7O!x^`*!r$dGjy_Ji_BvfuW zje=}IA%{$x#A4A^B_*Z*UgApVa05npSGsiM zJ;6GVDWC-fT;EEldKKH(NIbT1;l`-0qLfPjvuod~offTFNH?)A3=8i zz&q|6w2gm*cR$#mXs#u-WcLcj>Ex8qVosXj3&ul@i5|smb~Ki>%ABO;VNzdtpCMEY z?LJAdJ+^;MQ!O`0l@QVrBzD@dJ9gXuAk@rSUx<`k#_6zGfOc7Qzo~s~VUq)|w9*63 z*AD5zq?>bJn+brVw)2P|yG1~hwsNuzxeD#}YAL)wT}cFBQKx$qJ6ymnLR;CIlU=o;No=oOB%175zV7L-Zh9)EUM9Jy zy@@H3)1(eplUY$9(e7b#fnu9oTUo&Vmj9J__3YIcg6#ddB^_#$<3@wD!$B7=!fZPOEnkMosNYh z%?Ad}wx!IUiWhvAJ(nt0@iAY+sAdO~@1`demo^+`C_;O(>w{?8k)6dgzP2ml7ubmllx#bAPa) zS@H4Mxo515T4gTae7D4_P>~M%ktm(&Z(s!+hYBJ2F`x8$omnv{o6h?Cif_rMV69s5g&8&4<2(`2Y)-pzYCn^CoY&*!`TbF&|$wT$mboJw&Tw2RNHWrcjGSGe7? zxj0w<*f4l^M()DkP!dayhoIte3x5Hbxe}9dp`C5E{JoI3Rn=GkNv}!wDa%eoFtnKa zk|KPn$Kv6bzkXU==&y!m&=p@D)E+IzYHmaPycBUXKxjrvG(camA7q~u?KeyTMRgE& zlN5oR63xi~5z}H>EU~jmaa_qemwu6QuI9XoU{#6rTR4eZ{XHzRSor#Q8<`X6NhOTi!Q7XHmAc1KCC2G$#R3_#KOO>^V$$sdDiS(^HX!mZ|on(7R6oRGiI&}Tmjk6?= z-3zbWc-L|(Vkv*F7W4nC3WOE=mnu+-MFy(TdtKo-)Rh0*y?Hj1(=d7Nw%_}feTi#y zDqDvVzcsNP<-x<{Um`e#N)~&;ycuF=xav#YnXOLslNu|&%y)0gkGQ*H<2`nTTsC70 zie|)gv-hOa-5*MEFe1s%(~yiVQ$clyX<$QF2hIz+(F5=cT-y)ltOAN#2;PP2ekvm}SlILq^eYUu{tTEetRuSf_*KDs|` z3X8#7M_=kms$Xu5On*jbV04GYZH$(a8<)wLf8n&*t3{VNJ9jrwO>PX+Ut%^05UN>g zQK9@Gu7$(s$tOKBvAM@X(4p9Qz-i4{Tk!thHFG!}me;p-(^lO+l52Y*lSS^ibnyeO zwqKanbdqiQRWjCDe}8eFHMSxr>z^uqf{MyGa+1HP;Efg18R&Is40igLiFfax8D$t|saGdy!iPL_s zWV2c3$ox+H$}xsasd(*L{E@c|1(BUcOI}W{902fS$$C!Ur|EzXvS;$cO+tKa5()-XN3KmW&VkmCp$uI5p3wc% z_hz0W_7-N`W~ZhZPAVSm(uua1eg@)9ts=cE>_+>bR1&%LoOllV0=F5fgG~cNNo3@h zNhc&VP_Ww7P5Al#ex&Wk?pEId1Q^v)6vN>=i=&i@4gaB%`+O$DuNfrmC56&E!)C`g zN>A-Lz^e4c5W%}zA-Y33Gls=cCrFVFo(laMKL{#)T7|^juk!gvmB)^I$B8gV<@JGa zWb#%eZSNX+yi17+++>t{NVhoU$X!%M1AM*LQ)2=YxIU2T%Pqgog2okzkPEaxuZ*N9$MyWwv0y;}n5y!lwtVW+U)4-d^4pJIC4iz|cVAny&!;u?jWqY} zQ|vE&H}|_y(?38y?A8S>G0bo|nMzJnQR0ktZ8$_Z{#FE9WG0FUpUOqkdz578^J_%~ zb-YeHdyE15k0HVs{7ssB9_M!F>hNP$_LZ)gI*wOpBQ?*&LVMKBr!xCz(eB zPkAsQHoL+5#2-X4L-*IIg^ILEH@gw?$-cAd$QQt562tKVJbzsSdA5B_W`ozla@L3B zoR<$(mP-rCHlm=bbINaypgjWp?>x{Gm*K^EJ1Y8V)PWOlPGE6Dv`iZHr+G(DvkkMlhV^F z7Y_aN-%(ye$EBH4rUrI8tywBP{I*<%fBl&WP zfEMSd%bAL!L1(6~)%Ae%idZC1JuL@32uDj4gsqNA_2|rs$_UxcQH-?V*Djo2Aq-ZE2LsoDGiC z62|P|R=+ecLfz5YdBRNFCIL}a$9@J(4Ty^UkZ(3I(iig;wReLk64LL9XD^{a=U$&p zrUwW!;Sg1vS`EJ+6`V}M+JI{WH=MM}oR!J_9EEmz6`g9VIHQ&Z&>Wtty~GR&K|$CT zKQY6jFs&9_lUuZ8R7#YSh={qor1Y$6D5A*7a%8=jGg~VR#?(o>OSnyl40vrL1=2H^ zIO{?4P4>0W`BTsW`bZUe7=J1v{D*4rrji^Qh4kljo%;XJg8aW%Bx=LZL{X28F-<^D z`)cQ~EbbpbwHEXL%vidwSEYiX^L)G?DIcf7jN;8zqNAjw1Y*VNZ~s{S$o`u*H-a?) zv?J3{w~!qRMru4n0IHuV>rC~QL&Lw$$(jGuk}$_)#`*f@CCtqd^EIBHMiX@m{M67m zFTjkAxwr(*hh{BlDupZnx{*4k1HXC}*^?OLzHs~UfXnH|=D{*A8y;?&Akbyu*Ww-8 z-!4LD;wpI<^%FP%AkPk$PY8Lh+mJ~rC7>kl^Wb-lXq$sP3QbkX$5>OquPV^^BqASae__ zd;MJ)>g7%v5=~IH?&zQyYo#a++b^$&yQ?yyU8Sr2h9vcjaP!%y@yw_5D^MbL)47^} zN^^WWH_ca4{gYheF6E}Lxuw;P^`2?o8*WK;J;8h1i&8s>+Ud>Hohl~`ta|I&rjkle zUIQDy;VzGw7Mouclgvs#DD<1fUKHZSH&?y8AlmA?b^m{{7?(TeyLvp$uMohb;s1LX zU78q^6egOu-sr%&+Ewf`Ktma}_ht9sgIA`%G!OH~Mh&ndNDP=I>|4TPQ}~;7r!zBK zeW`Z0s_qBV#Le|BK`lWq;|KeTG=t>%IwLLd^toT_L$&%J&}x{5XBPv7$Tvx6!y>aQ z3KAwD8AZaq08-O~)9XZ6Rw2^S1$S7oFyzAr%ZF^?PM2GaXt(2j4KPubA$NoN1iUay zO5LYapj?KEUfyHh=3IrVq*Cmn4SQo2NHrNOU29N~l69T9Dl9v&xQG{scIjTf2fo;j zoael@K$g)gIQTwu?>B+i1rdYiQUz&`3t_mJ0`z zz}rfWmOa!K(PtGb7u3itb(`0ULb`Nxn!|M=p#m&&J_w5(1@`T~dev2*C}V)+=Auv- z(C$Oo+Ri2q(0Xy^f002^UK>QPw~17_PTz@X(_QLr^*e`_{>t0cwz;d@ zW_d-jsq%Mg_;ZUz?G<+$GVS?`A8bWq@O~VAytWJnv!855YRs=6ZRdR&IA?tU6Vkr( z*?Rpw5%BksFhLW6`z2^!V8_0xbs(GB@S(fnK294${Gu7tJ1R{>V+oLkMukWsQ&#cvETDy#65XRJCx*A>-F zOq8Ebc57~qLqYVFc>5O1_?!dMFC24A)Gq?Ksl^`r0T(-~YcwlyQDa$9VpT2J>%fiHVpQasLXss?#9?BzVv_9>6!-M?AGI@#n& zR_}iI$V3X1je;VKa`y)A1MDp54r#_Q2lO$VXQr8DKXkAIkJHFm@eNbEu$1%D^%xGg z=8*`UW>*t!h2o5{0s|9y$j=|Ca3dZEwqvPPq?@C_k9_VUi(7J}eez^d2Bl(K>5Kg1Q&WV*>7a5Yu|q*54L2w`3+OY{jRl zKqW!IEdird8p53sIoB2@|is??wLy{n1~VBNJx1THdJp+0lp!#C%!s z=PO9)WCfw3(vjmByqC|)!?X%{pIuwb>QbX zF#HdyAbtx6r9x2-^osLyG}GSlqu7*l)e6tW_kf3r#!BXp%lUc}Nh44zKIZa`!RFL` zK%$eRZRx($KX_(tWk7y+mNHqR7)hXPq4 zqQIsP6gE~#*d*vrZ!p2}fp^HhanVfRc_p=KfZp&&i&8OL7*h?KGpY}R%iY!=suQ{{ zP;5_7WVgG84`)%aFpjPi$;B$guLzHjSEe5Ni%SS#65l(d7u8V}Q}xpn!gEZL0wObH z+eXQh!~(~H-p-5Q&Z=719Xb@~J5|tN<^BkCGiUaWnyiQxW+&~)PQR`GzgY&0LY!&} zf5D$@Bdm|T-_c--$G5DSP{})>N|&X8#q-ih=nw~16D|XToqog0d{zS-;h5n?>zMQS z8kfKkNvgTpv+0A@pqp+Fe1`Qqg5CnD_O+Q8h10|DZ|mZz^r91d%H9Ad*JSiX5q3)4 zxr+Aa3_&QV@)v64Qs|&Rav;6_pP@x-(RS&C^G)#8Do?X%Ai-1Jnv&V44yfDm<`u`7 z-Qj%=?MAFFP)Y$wE!HpF`L)#&`%kTU(?OSR$z}0k$|HliTBw->?>tc{xrDBqa+EMe0nuc%$hXqUcLLZAs2?q{pw-)?aj!^O z)eMax9630F08+eqFc~T5+N5r~qU&NX6(>5DP(dqx;0gswmiRmm6sfne>ZFY|24{WM zu_RP{mD&}9{rY1Seb^%dF=qS~rRqOoWkyX-2kn$9wKh^F0kz0W;#3)dSb@ZJfdQ_~ z_@9z@l?rILBYnI%hZX~+Lc;>Mup^2~mWHGs<|-Cm$n&g2u~iSVcT&_ao(P?EbDrWh zopd7JvhB|GAm4hM@+%3LD#>1yj<2QTkx{=-qU)~&GoU{H>7o6H?TQ1Z=njVt5-ZM( ze-ur+?GP0`?_b~48$Ck939;}3MGUO}(5VchH{EhOr8rOKtZonWd$oFe+5pD#>mlpZ(v-Yu(j~p?Yo=sl_MEa zm1Q1#<6ZyX_DA`1u|}PlGq6fTQPr=6*|eQ!2jh%!jom*;E9VCJ*W_PJ3;&{Ut|b(k zjrXEF30%iHnvYyJjo(mA)l}&r^wSZw=x3V42ixV9PI@7v9S+fU7tZkzo*|d{=jTd@ zD%Gon9NPR5$yW!PyXkrkuqN|4Aw$2IEtgjx1mHsHo~C6io;ZRNP8Cs@KAw0SWj0vg zUb)>QI#SymuJ|q`$Wtx4AD1Q0*IM3gYv$LCEZI*r&Z^3jxRR+R z%cbfIv3)RNOsJ%yM9qy1&THQ+!WGCcr~?>@C2}Sdf+&TrkXjPr{o@2wit<7$8CeW`FuL{%Dj>~DiO^{B~%3ch`x>_^)F?S-cQ2_!h& zsSu!Upa}_CcC=8x4KY0f1psl5ZiNGu?0}`jCIdFlb6KS`vtMd+h7J-8rxNf0c(>x3cNr}gxB15^E5-UuKEcKI@%H<49WuD=BJ=d>`6d`bMtUPOE=1Y~NR79g zc)$9Zu(&VZR2*?$6if^uTlC?v>;}D7(c z%HGg*fRA7xr~|XuwoJ#7|qO2kQmb8}D|k;{%AVk9}xva~Ve|^{1kM z@cIz93fl4ZNw1EMY-%ABqc6GuiCd)^5!HPX=55)Nv|UV6^Wz3Ps4VB#EqeN#=ACKU>Hi1$y*N zP4Z!8vNXWWVFbyMw^{dq2cz>5W3u))@Dk_TaCNr0HB4a-r?T%tgMRWS1Pkfe*~_bi zaXdgSFJgQ1oN~g}BD;HK-~>_oORQ8_ObaNPaE%rLc}k10#0fCQ25$HF`2=IH5y2&V z={%(#k1>O18;nGUU#|7G+*ga^KitN%iIP;Fos=w8c%T<~Vj9O(TIZdeJU}gE=Lzym z84B@~9G~L*Kke+bWE650_53ZMN)uFxi~PQc>ir2q!nQkwf9b%|FBSw=DuQIGZ2n&? zS&{%y{tHW5>gQ=nF)7Y}SD*=dk(o4{`VA10B^LK87r`8tVr&AY?u%fwklU~3M;Ci? ziT1#bI6e#p(~*!5oEc-DzY+uz=ancm_X|rh_1&(Zhb*lIvjHxyv+DS8baJ@6a7jw4 zv;=7wcCkTx08f2^9m%f=Xgsupwsgi=Z@ncr>u>d;6eTtURT&k=7!TW$S5CR=iChe%W|a1Z+! zbAHGvD|4#mRUGCRZ)^8}T&T|TvLec>yfksxc!gvsq1J_fMllUStWdv)y-Ek+v4ezn z$Ws5XfV+_0Q{A14&`kLwfvOQ8^uQi(nVhJkX}#MzeDzIT_kPQ8p(%6ws%K|O$)`h!<}?!@<^e*yohrCqq1nL98?KSrbkcFsl)t@JuTP3hyU|>L-li&XiVe(Y?+ho_eRS)=B2gndlDBPH- zwn}5n=Gqp?>6?o;I-{LL;7tbGa?&5s%S@dgg)JJ4t*Eqh!eR@`UyI{5N`(bXg5uenbzZvGS@3BbgoU}LABZ%S*Z}XUfOftjq90eVL=2TZ| zIarGRtJCF2uBGlyKCni)JPinNV5k@XEBvL*^9f&(dA+|NYfa3ic8y7&S=ei2csWc@ zQ={e%M(*ThV{GW#eG)iq(O-&S>&JLZc)&0oBK_5qvptH~OKB+)7q0iG;Wit2Jrx=qXbJUlj6WB9DkF&ajoEjG8uq5!J%Jf`|o?K{$ObB>Pb zNqq`!{6Dn4WmsEVv@T4QDzs3b6zhfp#VPJ-OM&9Wiv)M~;Gt;o;_d{O;ts`&gy3$) zEx`#Ak}tG-pXVO^?z!jQ`7_Cr%(XJ-Tw{z^24TFyLVb}p&=EOT-6+M|N(ndXBJG*n zyMU|ChI=+TGfE1BH!qZSO6OCc%H1(4SPl>JsO=0OaKBj#?LvN{X;|D8ZG&HAFFRe= zh&=pCQ6>#)agdxN9i{^MS*to0DjnkD%4@M6kn_~ts-(D)zf(^w4Ah@-+B5~JwPa@l z39}ZL+sQd=9{(;ydryiIDruz7H3)sIyIQigj7PML&0d0Rs@ZH(wDb}cm;!bop z+;6JHJ;8FQuFhAd2GFcyvsn`5y?%mi^8s==+J{ZA%4E{KkgG5&Xg#Z!ua>3k_4dRr z_E>ID850t=^uFhHKFU>QqqfJ=rt5K9(wuOnzbyyt$t(Wx95n7R`T5mo#Q$TEbA3a8 z6G~lGE^?+Tze3%dK2tEy{tZ-osf#vp*|FYRF1FgKlv%pO_V5t?3?v()wmis0L@z|m z`ff&H0*5VA)9Gl_T6*V)N&H-c)32XLzxEDG*zdl$p3)LqF^lURHJJ5uyteKS~7Y)K8}p zDr62nQ!^o~vs0f)1DT;}oIt+ZoScO?u4Kvu)?Znl%OTA3%KJ~_WpNxCJ>Aw2gn`yx z9uHNVOPf*#fBa$MdAHW6_2KZcC3)i8SPw&2@~GB|xReBRW-DCRW~2#X?ToHaTET?Z z*;+oROFbS;xF+a&3E~(nXXu%qY-V=eTQhtJ(rF>RF$5h5wnzertPj-?Vn7u?oj+de+0OQ$d5yROl~tmB zO&9W-E1EHleQtQSMg=d=wHL>@BMHXWwuhS=rk(+dGLWYIPe0GyKe62&nJzPMmCtKJ zq4E;9$~SCcipG^6%@rs~Xj<$z8}HUwQkq$GvI(n5EvK>Vz4r?hdD;ZO1qpNKmmQ{K zg5z&d5xE}F3H#0-E}DOjJRHkEF5HZ#b|r9a%$d}67%#X2M1$L|4u|Kw6 zkalL*SDbMooj#Yp58pgZTPJ>$6&1UhlRq|gQ&N00Mf$WA_qdv->|-SxfL)&>-_x#= z9{RDz?i&3w#bY7Di3fnaHmA&pLwYmR!YG*kHJHh*{6#7)U0qqqKm+vM?cCQyGP3F| zv}z+^_=SQLOZ560N%E8}pXI}mm!7gQLeOtQoaMg+XNJheU8{G^oKGt&4oS!o6NVDB zKysrZs%kaVuEp#-hTrLNY+@cL4y&>lI3Jh(te3tbGdEy5^R0Tb#nFQ5o2kL`>Wl#% zFgK?z(p&XOkHxEvUNBoZAWf2B*zP2Z5n5BZD;XQhx0ETY=Eb9V?zRLl^^^FMC}65z zFl2n;nd1~B(uUafpBF;V^ysh@2!apig@)}}yD^7-#URR}*NwT%UWM%8pmCm^8P%%lgm0yYOOnvwTBP4DCP>23; zB4fqCU3ocx%*A&YBXQlfd7t*o%Mxb8V6RX1gaeeqS@I@T?JE*752`I5tbsSLTcx~W zr+zW%nUI5pd>0+nu|Cr7zB=?+-_@BaGbM$0X^U5ouvkqprDTA$bwNgAJjttCCyIA> zn!zzd)#Zpop>2mOmzfEpX9X?`6Z{!M#;#(T;>k61R?I+2LCzC!D~D^T^#iVAlnV~#g#O+e!Xt9UtexvNYNqGMZ z!?a1FV2=cOUc;}g6Zmkela0=}*6~8!$}iG_ne|;^K{<`#4VJ}jk3eH{vhN@E-N#b7 z){a7p#DZHj)i*?ncOQY!U-?m?7*q^F^3Ug_#zdFBA|0qMsb!_o}KgK7}X&Y6&F3jWyZjTlz}YN6mivUg4+j}+L^!8iulH&X+RY_$Ixb3ESmzs^gWk1_Q zli}u~gzF6H!2~Bh%|`3V+5`I3OH&!ZV=93wUV?b7tHZGwPkZ=|Gx6?5m*Tna{thM- zs(I@EBSVdH@R|o%A{qj=LCfU6W@WJZURiBeSy=(ebjLFzQ4<<;*`6!+4Zle%=HEGO zVY}G(s3f+LD#BAbNh!;@JR?>}?rZ$aY5GdnxL>uZkHY(R13?xCVl5qf=2wuht@{eS zalY~A^`8}s2I_7F$g9q)Mcco3{E&W;tefOSf$nu_aWYnpLgP%m-Po~=qYjqRJJpz| zHa@ohuPo3D9`sz+Dbof28wd1^akJS>`6yT7jv1NEZ;dtaMP)iR{S_EdpteHPrNrff zH#X*tcwU~VeDE2w7H@-mWi#aTSlLT8SR`D)i7V^Egnw9J=1Ko(fnbE5QQuCxTtsXE zC2BD`G%~H)T0FML<4R{8#7gu}Ex_uY$@*p2Vs4m&zHtuu1;Q<7v)*v86n;tT}DJ zhta)cW(qx@bdpu>{RN$x<9%x?$6-(1DnvyLd~vxp{<9@}kwf54;m@BjKe^ZvgjC_f z^!~L+aES+WVUG4I7~q3&pGAZ z<&{9Lyl(wZ=_<+1jkB>EAArC&qRf$o;^IW7SB*r7JJ%5+O_d>zR_1xDW-Z}raFq7K zyo*+#q)o(YCG#k}JQ}uIi#!ulX1&8Ae*9RI5{Xc3+~Zafi~Rc}t)*i=1o~gmgOgcN z-2wD5_rxC~3{@+On_dYrh^Q;hjklIHcE}F5un}7F$slm{C=tC1dGfn7DX@i=L=svm zEznX@@D89ae$XpYqe^&zqLY$3>)=lov%%8T(7;DqdR0a3!5|=kj4#h)v!CbaTL=>>{i{ z%Ig^^Buje=_M*w-3y)dvPKz$5=$kc-yMbbABD`o2Q|jcK47Mu-smibM7~Fc+B;B&& zkIx|W_Y>Dg>)CXaA{f_xfw`d7J81RAT3ibnVPv>X**wEl1XN!8ZsIxix(%vhtA;;*;OH>N~&mxsLT^HDKz4b zq;~aoS4mM%NQf-#&93l}XmL5kPn~ofUmMIB{@fCsQaqSLq8j0&nv-K{^WJ*$WKYOl z)>KV9At5<4?CM$heRqz+Rzc-Hq9lwEtWKi&`v~u*21|oL|C)KT{~T7YKMq~gII=3< z4v6HwoN89h*E$M&8~$4Kuvi<%QW-EVE9^MNduLvFFNc<(w`LI_`3p%jgQfL36U}JS zTwr5%Z*kKDoHGFZpvlJSc$3rjT2J>~_H3y_2q1Tb; zfb071l3sXH=>BNY>?BZxWbY)Csz0}9e<}7>p^YDBwH*hPK5SpnE(vX|JQ|BG`S81? z0Lh39bc@cCzQ51Mm|Tg_DNzHc&B#ifdeNw6l=n9Y<^J2Eqtm({eI#JRu0mQ2_m)U@ z*lhk`(a!7%ItLhk|AePT8ozR|NwPugxq_XwoT2hsE$}b_>)>0;^Io}EstVJc4mfK) z4wY1$Avde1uKf_*`3jz}>%1DPe(8+pl8uN_4)<~H3mORruk+nGE(xwBf-zF{9Sgy~ z@xdX>jAjK%&%-QuFDhF-&p;Hg-I7a|FKM1!MxUn@Y|^7m?ENde9*Z9z5#a&d^UM~H zC6n#0N{{PT2RcMeD9z)OoD$bsbtO$|=|u9c8#ZesW5NBvN1NHNy&~TlafBsTC<7fa zKf4JfQ`(N`8!L-Q6f<8kFpPM-C`pon$f$l8Nc~I~AeA^Ylbn<|dx5ksenf6YPI7~O zTUAOSh^l|ir^Bgi)KXGZc1)qQE^|;VYD*TQ>KwkQCfD_Yj%$>pp7{l#lIe{nikUGg zRc1xaYgzAmW&mTW5gVP)@08>3sX`Zyo7l_qzb|Ze#%MBVThDW~K1zTyjpo6KDmI|| z7Gr~EORrT|!0u|_9N0F{@JGX2$3?^T+zg)kN@Ft| zm3yu5DGyiyws`5y`#A*n2NFRqeWdO2ZS^+;A}{m3Snsc$h^}NLzV=A%#F^fUM#2bS z4D+C}yD1ea+biy`!B?jpme9xX+dtmWjQCJ<7swREJ(JAw3l4S?i+Ief_h^28NKtZy zduy@WcOLpNJF$X);7|rDbZHE$nHdoZDt_uph4q2(FDz-UHNNLKQQ~Z!{WT~Y{8E%$~(@KEE#m-(z%(mqf8TbD#Ha6vl)qnXG=6eRiCGJT$Q$98}i!EqB?e62FalF)A#t>@? zTm``1m251E-B2p#<9mAo&WHU1`pjI|#rC}IE18|nN$?nxrsw+hArJmPWENpu?DoTG4{h7Ss-*x1DA)E3Tl?7@4}uFc51 z0(*by1x9sU|3gE>XaR6dN{e+MfqByn}!v#$++XM*l$NeF=SL6sTO-0Ny;dhlb6V;H=1Kb1J0w zc81EO=;0!dv+xXuAS#l4c+g(2xti$Er=`F|oq>L4^-ko|y=Z4Q8$lLW{l$Li=?#;) zNR@~M&o3KX-`RlAN~wdkB7>S6PK}-@U3wGw{AAD%;^MSKEwJOI(v`Rsm#Ta!Giy(p zs!nZ=fZT~BVLIx#+1~!#xh?XG%}$f%_?WToH)!VUxqt1Nz=f_k=9KqpPp+Pvsdwtd zcjS}wOsPl`)ow2lpJ9=(=b0n-s*!dwsh(BOr#CtxnN!7HAo3If<$CPg`zIlS0B(+Q zuJw*9(0QEdBgF*8oPrcR((ga~1COuM`{xkZwb2hrKx{z_gFZ&{#cXv?EExvej6-|4F~Hs`ZZfEtUbn;KR+-zN#rcDcHmAkvL+?8 zW5i}q-VRjTyE0)Hmp^Ns4VI1Pmo9f7SN;-39@>#v%B8J|*)(44EEGzRD%n-U4!Mq) zfZdDA_?%=Py3@cq8}?6 zn0kkDsJFD_HJfWQ6=w}!v$&{2ZPU%wCFP`o`og;^4ZZ=wjH%WNPve9rv*q#=Gaq{! zH7uJL{7xYp=APBN^245=A|5X)Ug!It)E>(Dbm?ojAUClV9U3y4Nn-vLn-Ni{8fWb> zUbonXm~TYU94g6xnW}=JISYkzTAePcq-ra4e*UMzj}9E%8%~@X+;w5@oSqvd=GKdF zdCbM9#t1eR>^?!hl1&b+c5!88{pZIMoNHtRuQ9hF7Z#C+TsUt-KE-1z5*vw=W?)S{ z{k2jN-ZGyp<;+B-q4 zD>lu~!9{c1d)0a0JN6paB~}ERo1OPH5qve+x$Vaf`5>`v>Fn!p>%>&@pAi|sw&m&N zO=|S2=&^5OwTDZZ?l@=C=AvBeA=fJnq9jUm%CeQM=?@nl!j?Hmd>{KlL7QhDe#o?BJ=cvz0J2L=opF zo|1EF&`1>+jWnV33CZvRt=_%JDGQ3qBaJelXeZ{P)|sQ^3e(lg&Cp|SeMf6)Y^_z^a2I(r=u zqTmS1naazUkfT>%Jm@EeZFrkfuUxi>=JaG&g|a<*s>b)J+8GtzBx&2WRhCQ>2$q&C zg8?;nK2^+$_+tI3=#*|q9J;`sXd>4&f{R4Vkd2G(hyVEMcpb}NM^goH`t6-W83irH zWnB}CUSks@X;CEk2y3ZJ%E4H@0WQTIso)1em6J;?v7{PIAOPiM99P~4xc)mP*OVu0 z)mV$XkfQr9N^WQS`6LidE{Avo+KpXE7mN~SMX}(r9XXWes3zLsK1wfcD5G2R+q~y} z!rR8RBY=uN@Yos1e|2@^`LOuRPUj0&?g8;P@wxO1e2u0kH!e}!J>nN#kq zD3Y?1m~{2bg@(l!@&m7~`u?DwI9wUDx0W72G4l4-wrf0y1vy9}*R1S%fHD z>wgPa5(SZ0wvtdmr#27fQ)_?)})uQw9;(4M$> z5hmU@wOnOEq+7X`(u7Wu1#OBS;tF2Ju2Y~6>FkypKlkk+<{fB_$LRYn?6+QFw$W71 zBCm%!S35iB_)XVdk*p-;A1fXp1IAvc0?Wuc+i6XE^F1w)rJ?0je~F!Qm2K(ZIS&h? zr~eyCKGgM}B>&HH3#fL%L8TLJR5~1*FJOVS7GdWE1={hEMhWN6*oXA8`vztmQrQ<5 ziUszvt6GZdLJrRR>=Lr#XIta&9oF;^f?-O)N2gfM>=pOb~Cn@i?=YLVG|u0MjyrJyCLsvqQ;g({Z>&? z`Mp?5?5zY9qY7$$L?_1^-#6HV--Wishd3#`cllu75-i0my+SkCCB<^*rY!H6SZ_})xqw&YP#t?*H^mZ^ zCHNsA{jbqDVbH7k>u37)czf&Lvvi9#7=C=9YjLCX?+eNOU@aR|tYJKDvo_azlk@$? zF~&s^9Vgma5|SO4#OErnO}?Zz{E6Y=!ao0vsIWX}Ak#A-cFtVo=p=TjAZ11x8QgGESCtvzitlSYqAEiKe|P%*eG6QKu~J8wNTy&V z#q=0J891IP%(xx2Ww>kk83(L>&pR2|rWERg{iyfEopk!-e-+^+;rGvc!D)(Hy)#`W z^6SJegwV0w{~-QtD&0+JVVB95KhQmn3&sD<*yZ=E|C`p_E|mGE)uiff6J-#%y47<*%KyQLEIhV#vjUe%nIbkj>B24Wg9ndaA~YA z`?Y@WMyZrsjPj$KYuz;>yG`xi;m}+o?7SLnVa-e}4caLE8_)%tT_14Mo{8)W(b%KK zkVuSY%#72n=1pTIpCF&WjX^CY$4$({6EzP%KaFPvCeEmxS*ECMBvpkc#*Myk2ta82q8DEW*Z%1Z(Uq-MzOW{a1NS}Iv4qyb!gj$KKq`gA-Qz0r0q%Xp zcUsazDcGRxEtBp^ZQ{cod$Zsxxg7?D7l?ni#wPtgw^X+>T z+dTk)s{g=&;wxa`Q^i^+GeOXsxWYbOHK9twl z%I<#}pH|^6k6yB3BOz%?F9XW0#&+gGtZ(=-BT&x|p?i|>8A-Wa%n7#bqs@)LQqno6 zqX94;+U*R95gBkFbl%prn2=MFuX(-Olg?`V`SQ$(tEf<;axK%hmGVk>TRW|`WwDoPO*v%Kli7x?~IV62^86y`t9du5r>;^IY=4n%+cj zR0NWMTU9#`sQ9ZmFI`Wofjc}HH?*XCnY9odYwJWVKign99n#rzazFO`a8EeIZ|Iv% zIDK^)ilwlRuX3wskLID^@pkV0>zP3sKup`am~+o2SBlsWB{N>H9LCqGPnn=pT3v98qX}he zvv*eKiy^}WMJ;I?23J{k1zE3t4Pw%+U`w!;q_;SZnWH5v1^DSvA-FWSY;KymVwp0En(k&boo)j9Z`u604@I=%W(baKqYkIYCFK>>QQwn!Fne)|JcgY>B;i{&4o<=N(PP;pxL@q9p z(RjBrf}LQ!4&p)=2+O&_bE@5(X{RmtJZS%CU-H~0D)NMttcx(-Tb-(vc9ZujOc_EB zy!K15@}&HZXqZ;g4GG$l9W|#FNC?2a>^i`??w=_YgB!d~L@+R5ArT>p% z(dUnv!G7ca&vLv!d0phCb4XNrV#2q>!&6iSZFE3ma->>r938n9c+_Zm?mpto;zmaD z>gL8u#6(ji`B}@lyk+=0H`L0OsojQn8B*|x7tDEz>kP~8(A z1-gYs6PRo+rcrzO9>cH%m{%%_2Ah7r>c}njs4WT;*qK4x`qh{{r>1)P1V@7yS_0co zbLN85knJ{{A{Il+NWInSgVD?Kxxw#QzL%S1R)sK8ng}@|rrt?>iOPDvyvto@V-zsaHy_c{ zLJMV3X#6}RMM>W&ZFLDdST^?&XKH($`EtFp`iy!}kGvYKxP9!GZ`j|~kJ4f;P%)mn z(LrB?D3atqiBOZ+ar-yyjnCi>$uDOL@7&AqdqCrJUSgo*bfM2p9NQIjtszuJa*zKD zqWN{Iu0-_jGWF+%iw>y3qZcw@^(jylHLt@SfZ>&gJJjI0BIVi>4G?c*Ji2(Kq__Ya zeB6@m)%ZQnxk~lRD+wdBy|;+PVkOb-#O78KM=z%DfU?4jV4S8;E>83G7Fi#E%utE! z=_q{H-s1ptAl2I z0M5UVRBwW)SC$b(IzZIb(%PHmTalygR-{O^YMvEL`-@Kw@Hg{!@!|G{d-Ihh_MKhC z!hyQZw@gFh9(glyVL&_1K3WPR{f%UQOg4<9poX}AvoDf(95!00SPNY9SX~%d${ovj z^USQ5Wnqlfj*jcfxTWji2)R`)dxb4_yxF$}JrRb);dmeHUH8V%^0=&ZTG1VMH|v2D zp9opKl4c8}zW#MrpiKQOZvp=TR}yL1>sN^nxCWaWRpuprTPaV1` z+l09r3&L~J*>dSq5`5{+J)CS(B6Wx#+(eV$7!su2TqK3-9ab}(w|MjoJjyR?Fnh(a*0322EKAcC3Ps#{T*T_zI4uDTLK%lG8}qsgFnHMu zABto;o$P6!>y@4w(R{DS7|r*v7MD`=cz58N?Y>vY)Y?`z{V>g_Kxv#<9RyWc<_S1h~l|7@m6icIVe;7%l&7mLQ^Z@SE|lbls}7Cv=cLN^*&`?yKQa zh>v-}EM}M(tZ25-#%4o6-x2~rAr^$y^u;|ZirG%^S^v~(hUDIUlo?3%Rh6@UQyL`2 zMg+F`SfV%X)cCH_8KfsM*Gk8VHE>fXj+<-v%S(08OSN<&GN@)(#5HF9RQInu!|5-p zrC;{$)+ZC%uufMCqrJlW+L+ObmQO*~79XID;6F~GSVjg8)Vr6e(ZfjYC$9<8!ztBG zx)PaIdARZp@3D>K*ZChXKvqpobOZPP#lZP-c1sdj+J#KAtsb;(N3hl7`FC_6jJ=V; zR2`{#4A&?snT36o6B=RtZc8ELFxXTm#4?{bXvAsd0k%eUEw%!W1j{!$>f}KoA;@Z@ zZJpY2wfPWr!_B#OMXx8-&=;iH2uQ|fM*trIVy3FQc)%R|qi;-vk4pjcA=kx+f zbDlq^%)Vd`vb>qcC2q}_VNHf)FreH38k7`pLFW1J4T}3YhUCk)qhpKKc*{6u8F zHScL5|Itn6VwDC|>r_@5K~bv?fMR*#;*^ra+eKb>awoS) zbr1o$j0bJanNO#=G&OmewPY)+8RB9dUD}#`Gl1h@ymGGH86JBP?m1Tg&56dt9ag7{`o}v6cU^+wNx8pOThP2EGmicX zSc0fJa@7>0js^&@jea)&{WQ zO3(Wh?*t%A1->isZj8yjiF2NCHPb5ju^rS?3@5eZL*O z;s40xRXFUMdc!e647MhlFfgJF8Zdty#iCZ!FKe1xl?1@&qPwZ%Z7gOYFqY=4h81`0 z4Q5N4kF>?=*nCPe?k^P(5gsZLY@qhM(Vfi+4}0+(w%Tz2c;ZVDo`#PCNnR$?=#+D@ zpmX<~xd&sH4`-hh?pm}`HGA#!oxD%#Nhz-@x%Hx`>(-JxG8*FQ&uznBqY6Gkn&p2| zus^#nI9R{(jXz#%NqCjmjp#HWp$*|2r<_sFyHF3{i=M)-@nP^-ry?2s zKa`9+VSgwYFKM?xWnY7Ib&=ZH+_gJ#uhQL=2X@B`?qiH)u}-9}xgS*L=EXI^*LDiW^a3xl3 z)~Cy*oOL#Q5Qdu-oO0_Xg)|j?2)8F!^;T!LkMNP)!qvImuSWT)rb!*$G?1%}VTJ$X zE+umZWXc1eGnnSkn4J>;=#-tUp$4gJ8Pst`87EMg8<4~vfVLhoHIjUqR|bh`7F?JY zV*7<`<~2eXc&1kAIV&9QxvzX>Ut$3mAoMb>$q)uv?J#%G=bfBPQX<&W-`gKtM&G)-x@~?2zMI*0eZU?WRHiM-K>v!? z-a^W7oTJ~1X+w@U;i*6#rYHKami)pBNM1eG+3S9|jDsH%Af>(^0K5OqQmFZSr9Y_) zUVla0l$|OfMRFzkyyGpeDTN!jF2`drjxZT8s%$wAJX>(rR*6<1`G;1JkCQMYa3-6c zNYUUldAOJls`1Qq7nF|v8?|^oq8P0k3jm|{bRwo_Hd_*D*jkr-&Gr&D-3b(ZrGj(r zm@B#C6}>^W#I5IT#Ew|P1+k_Jg_5$*MS;{TjNBVj&nc95^5$u<;CoN#kDYtby4;Nb zD*|S3y0df{`dhl#I!^{6YiR3j8K3c8Y7v2 z|3+C5ErmT_ZZA3c?+|Kh*73cg*Lptm0IM1DZY8*G>$p^{yw62CN#B%aYv&_Z$Brh* zAN`P_{{KK!RP{ggx%*er5Du`J(f^(_9+=QC+3=mLMSuR( zyQ0o6O%o!#l3Uv6v2rA4k-85!`)PbJx0YS-yqX=o(R}HwgD7{ddKg>7;^k;=q8xrX z+dqkY0{Sm!2cGVVtSt-mri*ea2fMlND_4x>!&Fb5%9&$R05x#kP9k(*hm-hsx8&D^ z*syzpZWIG#v-6AD%nT9(Et<3nURDkZIWX#q)PW}3^0j?Hx8v>#UaN_*gQXO^lHLA? z=~lbOf1YmTzm7@xUqI2XLjM*NW&f*~@{0lR?qSuuuATe-)JA1R$oNfZ(bTf}h^STR zRvZ{Cn*W?E%ZR_QOd)6BjabQE%F*;{yp8B_uvoRd-8VZ|9-v! zEVx74`Q$}UGiEahba<>8VHn4%)qht&M-YdVtyeBsKJFRlWN!yyt5mhuf13<1TJT3> zpu7Fp7UAW+jY_1;x>zsnBt>2B@KnNG^C(w);%l1pB$0jFe zCQWvR{P(!e`u6(z2=XfXs1Q3@Wl|+}fq!ZNZUtxVqKttmSdRLl9qXx`_6<8c4T7cN zgh2~+=X4?Sx<=Cf%qnmB+H#M+*s~0bTPX0ybMGy|^XqFwb8W}OL{VsNF(A#x^4wyh zG_pRa8DjMG`9WzX3AIn|c35185116b^wemzqlvbKQ+RntC}Tm~f^Y>*sTQA^50x|- z&x`TNc&S(mA6OK}Mq;IJAiud{xqO+m4(ME~X)@4@IhnGxIjY?)3xs-Q&X$z>+Rd7DDDD&Vq22!mrY)CPQ zDhgHA7Gv8vq4{0&3m~1WWb7M0tuzYXAIb03zoooV$me3)lDP~|g{!Y}zl431VKjDg z+&b1czKd3SroQFxD3K;R>a}QE3V)v)m~3!_Zcro^8dTI2Y^B5~YH+Uwtyp=T_f`~T z%r9kvpApB*H@ssp9GPM7bvPe{7W{fT2(aWRuW+kRIc>Lfb|`jw5Sv)QU{81Q@LL)P z*=H52tIH-DA0|Y@pUUTQVEg#35*EJ}GJH!Vb`ZivA8lr>{KjeciiS-7mEB!f`tD$< z_D3=AoSb~WU_Pc+Ma9_O;IH+B{hgl}2sPZ5I2|-G+TpPW)L|>sOCRQ?7#I%>5;d>g z!;)Cc@`D7nNy^&nZS%b5+>gIM2D%Dpt%}$rK-9C%dAQ!F{(}WC77ZsPNIZO-t~I=# z$SE%sv@@U+Q9`P99`erFeWiUXu(xx*r-iEbFAS4W)K{Zu5{dr%TLQexQzTgF7e#5C zJ=q(RtBVMK=U2RL^PP$G{72!G==MwSi+a&Y1>@AkvtO-UY{Z}Udj>wYxKz0licI$^ zv88yJQn1g=#x=d@IC`oOLA9)w1NDiLZYUR38qz(xdmD!<3}!Sh6FRtK4ILbfkao^`CK?60Wq&Jr?_ z3p~v}mXEJPpvp@M%u=J0blk@L59VuN+FELb^c%l>Pl`@GGM4%LlkUV%cz(li!hL#` zeplz90eEYl#GsRJRn1|~>kvA7pBsSeloWr)D21m3W?pCl??<)Fk-&B#<$?!OVx-Fh zg(*cB*zN{X5C0)I2m54g%UDT9evrz~|ExAN^@;FtB<-RIh>>4M1(;eN8+J#5B)-)R zTAgssa5f=Ow;R92@|$I3aeib}>0qjlPB{-RUPpI+n2RH;3hAKQbe<(;#cA; zpRE$D(P}**0_}FQJQ2(Nc^~KbgeB$}&B160V{8HT?{A|6-)lRcNHuTPM%7D_b+5!U z(e!*Y7!nM_pi$sj(yv}Ol0>nY)HE|)Dw=wN%ZQ7QAoo8G*{LP}&qH>f`@M}$$HyfD z<$JP-LE4eC><#@8=F9t*1vRD@7OEt)m=@mfd$$%2D><^Bz5sdi^3pM)uxHOZp~|dP z2Z^YMW3uPY#2F{L4py9s`}ii(V}?tjgU$308xo1+M#f^>9NIKrD+4BzDzJH;8oF#jA$Z(lcCNT zL^&v`&57(8m%*}bX*h9^qW#IL6)BL<=I+K&z*kQCuA?UZ>WT)-w6|07QrJNF^p_N& z33<4PtEPbJ$EC3D@6J?QcIL&VU2s23BQ~PnNqCkkM!Wol_YL6l6SM(!{XQRw_$H~MVC(#I9+YBdkbAn(e zs2hbKQ6+Eqma&hxq?SH9>#QkxGe=rP=c>52hL0DxD^EPA%@LP}ZNM7%3VN6s4NOlF zO3!zsxbXU96SunDrW79?oTz<^u7zqT2z99Ax2`DkQM`E(^73%Z|5a=?Y?CzF>9JyL zp0b%T-2;sGb0S za^*WL53wCG@;)}N$B^1>45o)mDt)i>yeW>qRYXdtIX>Qd%Fr{|(_3=Ze&bz-yGnRX z2?}?7|4u;>&{N{=`F@N7=6K=tn!<)8R%p+XK>LQ|v1Rugi{u*m0q5njnn&3YlBw8T zzUGKP`9FuQJ>%-$zF;dy9Bo9{mj;KaMA)RF;Z2!EPv4fs_5CmD+u6CxHSdJGi0PxI zu>1`=j)QR~hP737snv<**-0}mo-#p4Y~c8eJ9QMZB6&3s4c4q(>tDmoN~@Ruti|6I z)22w=^vmI9N(ieB+6CT(tlcH#ykv2a5cG^;y+~#csJ~n~m%gZ6!4Mt}_qkG8O*@QM zEw(e*)Q`T%uYb+NkM^<;ZvQF7TH?ESoCuT-M`(z+uF+GaGd^__G~jyW{cf(!f$o8F z7JQLX&UGt!`?|UBy@VDIlTP?pXC?0Y^%hR6@oH>WDaz@<$mjK*qmi8)M$4HtwGv-R z+kY*fC^#zH>XtPmKfjIWDdIjmR3HfBQ};YkMF(-dLhdnJ{dEowxd z@F69%?(vH^9)3e{Io&CeFUQ3y5Owj-ay(=P*klA~rHFXwT@GGMnmJUQo0m z5hFF&#RJ-IWx`Q%@dyc_hwD^QGq=nQR+3F74UsoEAx5ETr5lyHUb|=_COp!Co%K2X z__soS!i}zvPd+VvmC26{$psPM*?t5x9mM0>XMIE&&7xlwq2E)Af&tw9VtMaDT~XHW zam8eQrgTxUJqoGZT38H;v$xg!S&I9S9iw6@XC&jYnX42eB>+V451cwNdAV&Jugzar zcQ13}jwZa%%wsg(ndw+gO36pHq5Y54P%+|2icP4?lbU_1zc%b+9u}d}X*&a?N=Nww zFbd9l(&+nvO*-CA2W{YjwFa;L65>MR9yNHDG(GMyrh>q4N zVJ)!U3r%)i^u!HXF~!8BtsieVbB&XZydjOa%FTaF;)oo7o50oBKj(4q97pN>-8e$3 zQi8Zft1x!>HqN6@1hrez-4ZaNhAo|qyH|YQPm@9`1@S}FeO0MYu5mxAn4J~}KyiDs z9?lI&N3`Esh`gLuGv}*ShWo8@ei$v0UTDno@b|G%AM6;*Dawue5ihOPyQ?b|6nW%( zoM#STjMUFxuR8Gi-r4;sJ^Xap#Pdq$f>k<>!1JY0Z1B?j8TnnwzxKtI)_T%rsMLRg z7i+WIB8G!|?oSurkZ#eQOP7iYecC;*@yDFcQznA1?R>dL-$Uj%fqj@6sgk1&3?qUe$4NXObV0m?jdy#Fe@vT ziiPT`{u{y{d~JmZqnCmAOnh3F-1_hZv8jATpu@A{@FDG-3xYOvdp&FTYey(bE0R6g zFNMz9Zym4E)#UA%9|XqdgnRLp=DgH+&yzkMy%%8G6T{Min-jzGbU2*}Db;d3UNSMi z_&R9r7&9-9xTtNuRa*)ED|Bea)i;{wevqF%;&Zl}Zfz2ibFIq=HoZ$89ZsXkXhJub z;WK4=F^xII@X#th66Q#PEZpkcLh(5@`PhU%fpP*v)x+q$yo4h$U^!OIaS)C2B!hQ8 z-kqagUru_cjAfA-4z_Zfj`)kfmL+^JT6}|nUXEQ}FHLj@CYb_G5G8IT9vMe0<#n9(X=8$HJhWtmsdOn#^Q!mqA@O?dfX+;*bx}Hn z@28yZxvzfAOIF|_If*4Q<*N#Bx_g6`t1)~EoOS(5Jmi3{H#H?uKH=Fo@bHyPzo*2L z<844blW*x37WvS_lw4_ZM%1qGbkJsd+eMVYK(5s2_oGy9p1)2XB4H!i@R%o28m3K; z-6X6oj;<(wT<^KP*0d%*-ZC!XAly?%+q7t`OXHQ{J1oI}csxd*oxkb{@l{9U5UB_Q zQriWS5fA1<{l?_-iFXq2^E5CMk&_UrvJ%tInT+yc%1z_edyKEH__NZmzJYY7ra1Yo zK+En!10$3*?5=iLQhw>NM}NF1FH(_92jZ_bIkcxOTkb5X8+{$7l0R5ucWoxn?lhV^ zVqxjza%D5u`MLgjssNK1c5Gp2(F8lY+`(|<_#vMhCgY1RwljdC6Qo!Pk*%g!j&ZQfu+f=t+Of<`<4c;;Fy+Aq?V^7Lg zs{PFiAS-1PuOiDSoNvp};yhqSpK_q#g+>GUbK0B0=k&Z2pSLgKY@Wq9$KM_?u`NqT zOK$Vt!?L1UF=|IDXO^3J(6tID*_HzLViI;UH%ESu`^_>?Vf^^4qta6VpHi z%AnIJL^Q;A9j}G?8WyTad^E_)6Qdln=3M+1cv2F+wkzSHf&OR3`^Eh6u+EtNGal;? zq3Y4`h%$ohs|D@J&0#DI1)gh(kNJ0X00a1;Bl>6ExoERvqCW5aBeEJI+3cWLVuBI@ zz6!@~0ufVX&Ix0Vy89BtY$w@d_MX;fxR4w9rtVvIFWu&W;imqB*8D&avkXZ$r9>W= zi%M)fU79?lU7ey57-cL~ao0=&$stt`r|B-$g!#!U)&!|#zv8k^d(QTHx=<#IQD5C* ze?|QlQ|=QXl~M$db5<{zAxb;-e)6HOBaC zP@$_IfPwOb$`^yeSnPg{4~N z^8$ggJ^#Kuk%-mdjd7QW7) zD9pw9L??a)o@bej${NY!BYmSU(pjAZIZszbeYSSs?*U4IllV+(G2WDSN8l%nG6(A` zpYcE1IYBPiW!g`c)~O2*$_Hl6jih0Cvou^4Ii90VidtGsyHobL=JLr%O=?1%z`vM* zKR?r3+6!g58Le)UX9g)QNeFqxzhE9WzCz z?@gJ=Dy2Nq(khyqEVw?x4Fm;q9bae+rq$?ld>2|8)Sgioz89$fD<8EotW;+wjiXl$ zKXAoeYW?mV4u5%M-riUuyLG!_j^!#GAYwye{CQ7v@3w-@6ySuj-2nh^l_vgZOofRk zJzuOw*c!bMItxcihZ;}cC{{AW*^Wz`^$=a_0`R4=>t6#(t$?&d+XYdeI6i5fpKhE^{2kF0S~89_*Vm7HTDE{nXJtM1O~ zUwpnIG#reK|6X)S&wuV(X~7kJ(%zmCBMXvDJiP}k~W=Z zE)=7*$H|d?Cwn6u`1}eUZT3C9d6(rcFhrHQJ&Y~V{VPYAw1thM+jcrxyt(+A9C3HI z)O5dK+YMkSHN6D-)+njfmw zP~QR@j_#isfhoBw@gAtN)AQ@l(SBe0KE}i4WAA11bZi|pl5QgU3j|Qt%ksYf28W-+ zuqgA!$3$HvEOn-*`zr1H-^x$MNQl&!KB~xzyPV%?ijI?&(TL(1oAti3U12 z4gxti7v-ieiI?qP3$s3W2;p3?>AIbqT(+?c10ynGPN4z!Ez}LXx zKyrFa0LV|wfc_IWuC8WWP!m}P>_b}CNr)|$K8LflUyoR5fZ68QZUbz}-kN>am6H`8 zDPs=DYZA%%fT|{1vU8eLbuW*HbGMgF>wANI(_EL1eX2!xVF5>G`WK@RzCQ{kEbu3uA&yF++%~+q+=^}RORTsS>+lL*C;)8L&NmK{I+Ea zqObFn`KNf#wWBIYBGPR zY7IF#IZ8U(k;&LD7Q1i$QsyOKiQIhkB?*HK7dnO?Gox`troL&W0ET>)yaY9}i7`6X z+HIR9v;zK@v>&c%gsw(>4ezA%SR{xyQAzj5snvRrhh7#RbHpawW`Gbv}^M z0qUZ;{SvT3>i9Jb`v6~~X52wSi6*rPX*BXqVblAei!F<8 zWui`k%s2ZTHILX!`Y1JT3P(2qg}VJMLoeE-IZCDrpY3?X$N7ScZ@8c}A7m*;n!(eE!V+ zLqzv*H}P~QXK&U$2=uQ)Sf!l|i*Cilrc<u%;-9GJrY~!v%PF%!T%5lr= z;^;zXk`z4=VYdc8!R<}dX#40VN%Essq_^1a!~H3rg-_P25j@NG&SIjPi~wA&?b>T} zl`FY)_r0jmac^URSw1GMmR4LQN;Wmc#mVO4`gW1YW->G@4w}z3VilK-|{5frGjF1|dz zee)&xdp+}s10_4F)NXeG0wrLfQ9;BraH zCnJ8lJ9%(S1`N1+9u3tUGjO}?gE%V60{ir{9y4F*P^+WTX>i}j;SPDd93DN^_K9sT zU|-uXkp4#5vENdlPY1KA66QEfxqlR6w2iCVc_g^ zFF=Vx0whBz^s93Cs49|C5gkZTBMTNvn4C*aj9b3Db0|SYF#}EVksYZDOZuY?t$MZ> zTJN?0&4<$R-`|pYZ+Se@#csQCXc_k0ppTMeV!>W1$q4iP7ZIvwm6^=Q`){=ueHzkk zjP^w5>j;}Q`P|zYGC431^aqE>d#%guN00c6o%WuT>6sL_lWY)sJ>_AUmvAT91DLvf zUm>T>ct~DO38%ce97*hVO3DRP9@aS_L4%QIK&IHFvZAsvP<6;ZH!#5{vz#!Yo5UAC z99F)OeDK@A>~9@7$e`&pNXmqslTBUubM6M~f3S~QKKgL}Vjm5R{N9Q1u$(jA7-{Fz zwl#bV9n&-QdU@Y;79vx3fxqZs)Cik+yxlj*Ud2rm8u&wb+}K&HCywLcu5u!gjb+yR zl?({(O$+9_Uy79!g%@6n00z)h+h8pm`50S(cU_X;kTn_>`ru3pct`6m+wDUpgO$3& zC=&F4^l!jP4ex6;o1|b;?E7$YH&xr_*D!yJqCkX~^{wKX*iM&RU5%5Ba-p*cx1kyDBq6{_y zntMbajsd+GibvQBu2y>gr@CQL4pWD+<^A<(nxa&CG<&fdG)b5VlT~!-?kHK$YJ}mY zXiaVWALuEqvV}i#73uH$e#)#zHRnI^i~ic8{p+~m{Lj^gNf;jrMFD$iiD5yWUy7rJ z`M&rH!`DCNaQ_yBGD`(&tQ}mlHSo!;&K&Kvrm4w&G>G1xsj5dOo^y7JtPsHkEusKR z8JBt<@y^U2ivKjGCGM@U+xhkmU*C?iz2}l8)he(f9yHk4tlZ^i3=CUKcTh0X>9$rG zBDCk}4s|B}!2;x%+sX8=AhVpFYGz$V{q{(pYi%8!^}1Ak0Q=bFxScN4Gvf)V&edzg ze!lCtk-W+`cV8%;nS-sYR*1^p?i$FS%hDPhuxU4!+pfvGym;p4RUPhZ>Zj#1880sq zS1Eh`Xhjul*(R;5EO+(n-sXkGYR+Xu{nZC2t}>K!w56m3d|wZ{?9uOh2ris9#?j)R z{G5jIw%YBlroWUHGu%7YG)sk^jeC(bwpJ<%o_-Z>&|T_MkZ{*5J$iVXd~gKBQJ!x5 zTO{UcgK^Hiu!Ywn3JU^vU)Bx(?mcT$>$FCu)O)=T3A86SD~bt;Ad0LZxk#lhC||)` zm&&exgP>KbH!7>4;Ln${JIF>(4iDS}MthS~RVmu`#@zCC4_R(#PLZ>{tftx%w~k5U zWzjv^t9iu#sGqccyV}$n($&6HUF&{{*XuG_43lht?DpcAOJWY>zV96gUI5MSJVjSF z90~}ukOwT)o0=K7A)%s@;JtYb6fJ@EX5O4OaVQ`GW7$!|1>?0WdQd*}ACr8e3Tk04 zE!11didsJO+7{#9PyI3+A0$_wB~PH;+oZ=g8yzYsTegAU=P*wGLoz3BauY50z-FCg zZnErZ_i`ESBsy#b#O0(mi?+#+wkh{>7IUP|0c_8~+>tOn6TrhaW4=5}tJ@3p0S}#LY5`3sP+f`g;lduThOw-Ftv&yHN)IG~z^8cc@ zDfwWxSlv6Y1yL(H040&Yt}$Z^(q{DjJmMlo7JgtBF13DpYoiRo&;uru>@X=~CWw=N0Z+4`s~{(PODfHxL_%ElNl%%Jd1_la)kc^%4SmGQK3&h+N-kQ`f8 zvgbZ>Y@vTCI)iO%kS?ywu&j5;u6#q=>cy&p$CdO!u$zlpL0$i*8=a2xxRH>0sovLv zwsZFB5)i%EG1@H_ahvy*8EKaGs@*dCnK6``oYw7gK{B1y&EnOqqOdzSBmDZO- zg=Sam1-Jv5>0BMBUhMEME!e2O0#Y(q5rCIO;@xE#CrKiO38 zKC%%tlj+x>B-0oyYc9^Hlz}h+x&qse(f(}Sl$IBh;fL$q`;WOeV~RtBOD+nrScWHX z;Rp=&l4|vRqnDQ)Su!MCPMf0$l|eL!$u#7>XT7DSI5DG3crF|o-79c1Nqnlk`In9t zYL=6;>3Uf`3R~nT9Ax(1b|Z9!Au^9yE98nb#}569$#gF!>EjX z$`8ZEk8Mq~my=M?J?HbxvqeY20nn z?+LK$E6#%l%L2jUHC*$cHF8<%Ie8rHs^9d7nc|p^5i-xy>0{JWT~Eh*Zj<9lV1y5I zROLlnRTnQjhRQ1KXoD@zX_#J8vR!$oAd^2S?hOjiw~5&d}d1RH-n zsRpy+k>qb&%6)S^5r`XIF}{l!ncpSZFHM%t>L!RQ!SNJ_}0aDL34$db?&_AT$$k35aA&XH~c~j!ZCG^0^=OD{r{(Q?1QyvoRr|!C0)&X{2!u&JdHZRrWK3!*c(^ zgu-7?j;J?D8Wtfm&a`~W!bu&a^?ercz>*Uk*Yjpb8lCpTVY{J~3$W3JhKtnnGHVSm zVqQWFGM%z5nc|AlPqUBDIb3|r#b+Vif@Hx)D;HDOnj6hK5 zaefPF6_FclFn4(5f1Z&gGQ=cLipJ%m+xxS;YHQ3!lhJyemhgv4*DV5XKLfe;*d|Y7 z(d^m(9rm#Li6ZiXYbyPkz+#(EU~>OQsl(7`y)&JSq=sqVpJ*^-%HQ;B(>@781<)$K zN}<(Zl|IS8Y!sIoPm~%I%N3M0)Jht~N_S4gx|?d|&BQ%X&;4GIM=8H5$!O;*(eB3) zk%fG_2oV2H&E(_31R5*;{b%j3+qdLOdV8bE)Kv05pzs9Fk3$I<2OW({5mR@i;-JA` z-t-4bU*#%uiEQ}KsOcyixp>7UlT+AtS$8C|L-nSvXyd7FGlr%Q6B-Cbokq#AcXn2(8TJ?A0or`*-*QW{A z&fEETIlz@xq!C-@)~y zXLCIyEL+MDU0C>E#oa##LJ4uM=|+gXDqchI;XK_3owKt$%-g-0Ut=+~+NS#-l*2`Sof%Gsk z-(LI(M>HVcD7n?tC~kz8Sj>d})S4Wy*ITFzLD>*R9ouxd6JoHcXE^Rx>&n$=aULj3 zX-L`Sxa}M9GV0*Im+|{*t29J*c3WeTh@;)iOnpCfZE<;(Dp8ON5B?~p>tGRgcP+NV zMgyNjbcOO&sQwYi)N{04Qyzl&;)nA(kz|Ar4YRdfx*1UXw^>de|J4=0RJCRLc{UAf(=xq#gH+s%r?G0WZDz+ldu#GXCvak`pTCC%gqHnvb{s<$sLYt$` zX1tOG9bf2MCgBiQXf&uRWiCcZztEMJbV8%4?-8pXrGNeT1zBOGo!i_^W=hyBn|Un) z4goL;Hp8oWpd);`GKmI?Uv& zKfx-})419sjG8oLL^EV9<4%(L)dPz>=5TztpYzv1!xm!vjokYke+Uea9B?6qu_p!| zKFPavyd%8`1y$?=&Q1S(qi=MP6VAH%@uj)gtf*Zq+FLtVTN{t5x)D@13~WL{60GTG zaz-~#3c?c&1fRcSMs1m?2Q?7+>_h2y9VGMuTj=G5XrspVu~vPY*>tM7SnyV2h;8-> zbTc!`8c!ct2Z`CjC`TNiRR+0UQcGmy7Ei1!e$aJL$K@+4J-5qOgD~xlYo8+}#!`>R zFasQ>r-G_j9yY`scPyZzv{E-azc=al!ZO{%fJysyc<4(2tC9BJ82w=R4kDxb)Kcm( zN;3j#YoI;O86~wju{%>gqh1iE5vTqBD_-vQHnb8iKGY;LrduQ#0vK%=0x*w8=Qv~8 zuavu)u+uhe8^`6yPDi>ArW+BS!(MCewoCjn5H(KRxC&+T>yDSKAZpS#&nL+z+s1-NV6rSZg%4E)ELmf*S1>zeE@6@`??3 zWHcnFj}GV(X|VB{6pNKay=lvljou1jQhsKXIf7sx(*@0SDTk`$^m9x?uxLyb4)*c~ zX>k_f%Y|jn?FHE{3o2$|Bc|`YCd0vX=#ij&lA2RyT#E?%A+QHF(S^kHIEW)!o56xK z+(y)HB@YDC=f=-VBDLj*j{2d3=4RkKxAqqvktl z&4~k$=R(XxeY8DdK)^v9elD&SmuQ=fhgMm;0QTccPxJXAh2%fmCwC$dyWZKD4qS?^ zjwVSMU5g~uAJ4aI*v8%Kwu;|Sm(|Ee(c}f|EK^*zKdr71+lfTrn#$XK0J^hc1uH9m z&Q^VV;d3#uAIA;kHg{Ug%xyWI=^`JV5c#K5nCBJBw3P+1+h8BgNX-uX4hoh9-XwLO55X7%go;V|~pzpy<`ko)T7u?@0Lv-(4a@Zpw zrTrd!Yh9?o@Ojdt)_Cr>7vw{UvhPLZB_1TLgKdAfPorEhGqLcG&309Nh-f%AhZ;?t zhV+5rH`PLkW(Tfd2g^0p`(uQcdbi>mk*f4_-ALxutico>5*?m{p*ekCTfpm1{f-zm zMnhKaQgu}#xYjoGR^=?i*Y2{ z3A9B*-gF7KQ_~{%U5Mffdx1{{f+}4!QkGs-~!=ip=JB3X#9=L+|eZ=s_twJ)#p%zDBRGC8U_%o(@cmhz7p#OtuA5Jjk%@-Y!;Y)y|vjX0$5 zyE1yR4hv@`RfTMS`}g*#&5Ifu{sxZ-p8rbhj4sT~`VB)_P+}*s(;I6c*Fz)xz(*Om zp*>^DCWguwsrY8#UTdL@FMTd1Td_!p8zQK1w{Y5ElB4abQd7i0i;CMnZu#< z&#rX2fON42U<6H$VLUK9LVBhB(?slG|LMJ5-_Ew_ zu?!MNFwzoZc+K%%4_(c3rU^d%VGtL7z2^L=`fJ3up!82D{4*sxufAP=|CGuhqO7yG z?Rr;51!d3Yz^i*u?8)_k(&V0gVa*M63U{S~Y_W?elZ7JsX4gTz;fG#rn|b@a^K-v-%E!e<*z9bHn6!|qeAaCk>c{6SS7OuxZ9NrU zA0%QUDk9fpMFQq+64$V&7i2QLnW*Tm%Y(5#})2Ea62x;)yZjsj?=qcv9Xc-wj!#abp^|2e#LGHgOb%ty_%5#cYUO+ZqK0$y=)hcJvF~;} zPhT!^$i12Euiu~YZLDGM6!w-!HjSJ;%@20Euk)joU`kl(Aj{Ej1IVQF!$GLTm2ebB=yPNzL6+P0< zQ{bB|?zpe!h&P32%kO#)J!mz4SAc?V?dbGc81(kKk6iUVmzSK#cvr3wbb@g6+ibA1A_F=Pk~HskvLP!dy4aCpnx3*U+h?5nte0hQM!Lx(Fxt9J zz>LYYNj74ww0NXt9zIOv;d1$XN^}zYbP_Dtt0|&^@q`ST%Odeyk}}$=wU`6Gmx)Mu zO2lzBNT0zU%RIm<^9suU(HHfcdQe?6i#gAQ`n-Jkj>~Izv87ZxGxuES%#$dxReGtb z-?dTnS;qfLrxxbm z<@X+mjsq)Oc;DJqc?qv%^6^AP=K?V(_mtOdjvEU<`yUL?{lRkYquJ~x?u}o`hrJG~ z6nC6=nyoq*&t>KYDcY8i-u8T_7wE}8t6!F^&5U`^OuS{BL;%OyFLc$vq<`s0bY5jI zZ+Lx%XQShh`~l&niUEmcf5HV3uAj!s4jb*r&dWnkcEw>w8TNK+rNW5Z+FORF<3X=u z0DV1eI;X;swN=`QwT`1)cLpkd2W39smSB%e!Sd@Hn{K5-yn;m$-96G1C8$=?PC|-= zJ(C69&I-RqKs>!gv15S!70T1`6cSW%s~o%fn*AjB0PBD@F?svGmDaZ@^hR0~`8M4@ zPj@!-=oIzfH)ogaP43KxAp6Oy~e7Gc)_O4PMxpdbZnVU)kB20Az3bm!` zi?@aJg^j<*1nL@EnC7cg4jROuJt)F#h(B;s_V0re^!tC0^FOx*xjVFAIt_kL5cy~j z_86QzEQXOn4Xm zF_gnlVXM?sBoB8-5Ao**6!gE@6gnC>WSNe0>gii!bu$+*QhMf9-IR|$`W zIZJEl+tDu#1&vWFsNLqU{MG>#3U+1RmipPlJQ4GQ!GXAJvxM(_cFh^?Pxi3kD9eO6uM*V@w>#3k-K@moLDIDtT;fV3Vywf^`)3n;C4pH z(a6H!=`pl0ZR`h0vQ#F(cgl_SU5$9W!`aW8Y5ixml8n=>m7>;VD@IZASxLyqn~w?p z)mUO!ISrESfEdIdd??_2`V(HMh=t!q#!jd_nN?3|;jLh><$?E|6n6>bMgRG$Q70C& zG44v!dBoRcz-9;E!RmXvvb11cyl%Txc(&%e_tAsjw)}y|Ex=zO>C?CR<94={if_of zeMr)kf%7fB!#D8i!%ot+#u_l zlGDBw5tz=MuQ70T(KQ^LEu|E=^+R)C?@IYHu#o-%kQ>d14M)WP{(kxVE-p@6ob|ht zx=awK2MmAnnHDW*Zto@`q$dCSYN3K z{MN4VT0N%*Ez)nKolbj#6Jm5AuI9{pIb@L`8Gneg-o%HRjr{iPu31^u*}+Fm7L0kd zY;-WPE>h?>p{{uvw<|AXcL2AU)99s)h&mD2D*^w$OsKeYt6=-WpGwbi4 z1ZY&i#kQz>e5u)qi`lbpR+7kM%Pp62ogBD>O(g|BNP-sg*o;@`nJcAay_&z*r|FGM zX)HEqIZEDa)WBAIUJkdebq7td&dSNA*ReCvlJSW2?7$p6xpo`9n*CrU}`o03dI10Ax;Wg_5A_=A~NdEv(f5+&MG zFr>T6Yzau0>-8I{?r(4-KKJD~NUNlE$AfZJe-=sed8|=Bm>VL}KHH|njAJXD*$d7& zW%#*~@-}WLLP7uJn=vah3RbHOFR>m5#9&e=H^H@ZGbw%+W#W7~j*8{32*E5zgGEFU zJo5~6w2mnRL6?cblB4oyBT#yrDIo35C3ZV50{eSFYlYUqOgsfvd&SG+asV>dVg2ie zlvP))dF$edW$^caxZa4R_4K5P&AEBS@ZCnD+^e7hoXZoz#PAV(dzk(8Orpwtz91T{ zCXO2eGbbstxg^Ig)^m>4vBFGj6`a8wL0~ta=IrY{TA~M zB&c|NnUo3X_9-Pw2{aO1SZzl0RkNj~%5umE7FyW0txejng*#`n?TfAxpYGjW>)RG| z7?4;nRUxsr0*f2Us}5c=ch3pZc!u3^Ei^rZB4PAwzOb5D=-(Sy)btN)sHv=mqFieA zjvRFt!igtI9SytFsN(iAtDYkAOAma)r(?9lw!^JT4Pt02Zu9CW*i4fR+v%jHh+?9 zo4IEJoIVt1IXxmL9Ku^^*e>K%2q0D>nYwKdD!XhgyOxxLDhyvN<25#7>O+3|qL~b?_F>*<&99rrNVy`^-O$W&+ zu@cF};(XZ0-FtnN!u9_E>@F!#xW;7TyIX*Xv{K9ZLL3GZ?X644&#jD=ZBEl5@{3Sq#$u02H4r%0zNWEhsgn-3Te^ z30x95hey(wDC~q_6qrp(N9F~*SsNer@ry^{hMy!P%1?bWVTbf&9Q$7&zH@Z{f%szR zgJppLOI(njvFKW8BhysnZ|gL}*>D`U%I-pjB(O{*6HKmZ=oQGu;x>1qZx@iuevq`| zb5!e0@XKDWA6$=_;|06MakR!T@p^&3`HY0Tyzi{J^}7HX8za_q#i$EyyUQcXjwz=` z)=`9V`;!>XRa~nvW2t% z6wJ*h+uq?-mG=Q!Waig>^@Q**61Wx)*F#Su9!JK)$U z470nRysMYj-M)5cIo^UZgcNBsJ!>zfKcgW3rK0{aK`B6^4(>Qdor*29MzN z4K&!FudBkRLH9~^*+0BBC11EYf^wMeAs-&|2tpD*ZTxB`|6Q;xPeEI`8+0Ztt-Y+< zIKPr84GH&j1R_FWE8#dD|t@PQ+VF_z!~27s|d%G5ildTI;wqVwRRh+l6AmErMb7nv}E zF%dhtarF^OGX~|q^?5ZhDUnelq3^LRwO(tix0JjY*^W$r^)B=wy?FN^`vUhgf5IaM zQ;&DW#()op)LNZGzp9U#6>Nrfr>vOCP>q_7#UDIHk&zs|h08mf{l@XX^)+)#5Evl1 z8MB3$1+n0fCT^+@9ryS59ix+(6nG9_UHDr`)CDGuc z_n})<%ve)L;#z;iKL#Pvo%qmyM3AWK(yFi~y9q0cN3C=R?mW>&Ep~mcabwtY30ZCb z?khXkZ;F5(9mV71uC`=ev_6}#(?Dg&jLm0W_Ze1Wr<1!E2Nfu?=w57ND9O^Zql$g6 z3hU2g4R4GmP!}<%o+$jmkF9}$bt15-F-)D^SW#@OqUu6Mv{&(7b?L{fB*bGz(Mcsg znLfobocflPvx-?Nj$md7I6%f*?b_J=)oJsUj?>}50~`#%vjSnv=gV(!^9)-OK>K8a zwM^&MZG0e#>oDHm?IhnPuCS&jVgLHKT zPl`E}J0ULRz#cdAR5v^*p}(+@ICY=fMH$mY;9o^UF6K>gFr;+; zZ>g?b-gSM$;VMnSk8p5lQ4GJW%C5DIZq8I%P;2Ov``_-5_>v-3t31Ck1ml4gq?>8nnVzs0~Zpbk2EqeoeLi z6mLIIvgE%HRSzC&;X5xy}-qq@qQRJe9I<|ZBW>ZOza$lL)Cnv$`OvW z60GV;_&dT&(L!SRjfJbSl<{;!I!xr*if{%A7|guFhJe~=(lN5 zr(nNJqt_TcFFkg)-|T(K462o=NjfP*o9BS5Cnc6~`nX!|pgi%7zJc971!v7@FSlG8 zwJE>A-cvxmtcE2lckwH8Tx$ru4U&T!TGeK?uVZb(rVlnT|1sH}nwUI$pQv3mkO=Fyz$bO4wX}X3hcusj()fCt30pE`8Oz|k-?iR)+B*{$H3kW4 zZK)O6t4G2Ei`8zq)~sF^nt@%<6w0ALf5K5J(w+_4q;jR&+kDXeI7o^+p(sgje;xT1 zQG4Wa)DeE!U}FqLE4H5JO>^SQdK@Ut-E!xpe-#>nr8|DSF}Zj8dVK)8bI(re*EhnN z5h^Dy{%9TyWL!H|HI@OBl~pchNDik$%m!$!RY7s50EkZxVMVu@UQKPKxD1`7M=os)6-#hp>5#84~Oq~zCro2KECV?$z>ptv&iP9 zJ!G|2PDD>aaz`gy)@o4jZXUHjyR56cemQGEdWE=JA5f;Zq{+^w>? zd8Ud0ZL!yW<%FCmt}09W=J-ki&Fvy7(J}$5 z|2g0cps6CHXLSyP*2s*)lE%#N$L#U1`awrcMjT^!s>4(ugYPw8Mqr&QU6(y~iL2aK z`SRv+th2k8$R(4ZV-)^ z(#>7^EZmGE56uQp6w9A#IAwo);PSqed2jTvz+f~Iu=}b>BV&Xu1O=RxyxwT=bTaTD zk2HV{afK)~*bN5LHrXR#KwmxM+R{S+Wu6~j?XDC1cggLi8Wdl7)ghOGS$RH((0x-R zGFQjd^Ud{Rbcw@usNF14xcWN$*>`*y92XC;M?t$lBn$Pg`s+%h#zp@yy8A*12w?rO zHyux@vf$wseK2~4p4g&!J zfUNyH1x!c5mvHL;(VzUU{M-L{jSu;?423X_vurw!qf=h8#ZcW^3?4iveb`@^*1ryn zEU7?~@po@5?t}=IKQbcN9EF{Ep(a*%r#14{Gn-Q?qW(QUSkOR$wMd0(oacK`%_)_* z-0F&Zl7hw$3Tt6v81$jw3N<{tj&F-9d#Q8bYUU#}6G)3YN2>Wwrc&F;N+jsQ)>qoC zpLR50o%%Unrb_(T)+PW{9r8?DF35_`H+DCqjBmEJ8Pq4?)D=hSYO-oVl4nek zu6%r#R)ybvr!Oh|kgEah4%bfe^?WqGo7xlJaFk705*TcQx~z3>h309zo^LIo@pon2 zf0#Cp`cLO+So`HizsZ`%J3wMUU}G@;1*Xz9sBNR4zHQ!IzTDi~?RT8KZ#WB3y7mDH zMYo-wC`msoe-Rfy4^AI3^%~jps?Szl8q3r57E<89zE&@1$_8iEu0*__z9k0^if5I) zOCV&cW?ip$@BSigdj@drPaI`lTEcByOHRks!3FNkl-_dOA36Id7vgJRzih0OB*^6f z?q+Ud%>|pQB0oyQjwqTOiSO?>%Kq?8+-PHabzRBAhK@E2H{#=UsN9;E?tDaluC(-L`EN^xhC{iSu83I&&xI}N_mW^FuV z{f>^aLtz+lRYs+4`D`q}0NMi;1P%o9d=PYAg>fW-c`2LtudpV01%QRX50wv#nQFD| zR0Zgrj_m;k;h!|HUCHGfgc1^Hkq-Dz_7%LJaWw-Aq3Z+^$cTg^e^8yjM`yOH-Mc$x z>p@{qwvtd^&esbh7#f7dg7&(h=Bq#9g>~QDJ~zN><31V0T7GO-sv|m+3KTIZcXgw* zqvEnSEv?2EjK#4=De;h$!K1$JmlcZ{=C>n%_`03 z(z(IcYK@8?hr;*$s#!%h7Zmd2!biXLJMNOhDNy&0l@T!+D^*ydoZ@j+yH{@^70!G4?JWGwAb$8FR;bR1ar zfk5Ez0whZJ(`_#hlf%(u$AjPbW0krq#fDq;N78JI{Q=-Hg-c#jOJX72g^WT_K|~)G ztz-Xks6J;9+8Za)7XZ&&<4T6ia@Zem0r+X}_t;5Jf3Ygn-Ta1rr)gZSfZ@%^`-{Z* z#$$8+Xvo;C3No=+C;&GRhSl1!Qe26Kv5(E95?^`3^nMyIh6$3_YtX+bJ0r!O*}T6+3IRiJ5a4f390a5dxoYG{ce(h1^w(+w} zwC{?l$DunKup0kh0V4vkq`G?KDlK}`%-lRTvn?8``7R9); zs!Ll9j206LP+D2`4DSL)Ks&3f?Z%^tR8}}iN2<|FB|Rm1YD~42p_+_~pL=B56zZd? zYmWUWq{%Y{WL8mk9xRzO%uJIJ0~wfLL*AAVoEc}&16T;~spBg64Fp^}NZZnsXi1GmWmr0^;4XNKZvEvmh)x(?X037kd}~Ix9Pe>5Vk+%4cLZ)|GJEBIG|W>26@W*Q<@>%b@s?oDG<9;2 zdmX3`h9k#;E$-anny)T=KTcs__g;*4CxqQT!LQ!> zPGNv_ll}u~{YSu#)tTBwquXjOL~a2+vD0Ib;VoMxTDe=O`j|JIdWVJm-pHJVtl4;y zVs33|Z~C%XwvT1v*Luot@#I@_rpET$&X?31Ew4xLww9W@Z^r5G$yQPL^k=Q*8#RKz zm*aZp;$zd3s#YBH(HJz*#&b}M281$cEe2qBABRXnO~9(iQ9GyA`1e^|5j^ZcIwy2UnlmjBg~M~HMqsHrx@COd%-J)`I=bxrUi zF`=kHTLl@67;w3HwelHmdjC%4W2jbERUyDV>tpoEOUqvCk)L)X0x1{OF&6fV9>O+L01m0rqdeJHUw+|l&Q^bAW%P3x>&PE zSJqSk`rnjocs*{>>t|MJfEuhJb^Gd68LuH}HS?Qg#b>K5PCt~Fr2VVp*K9Y@aaL_R z6VD_+4AB2qLWSx5M?$sRvg3mpze&_ZB$qhzh2R#zRU5oFFW>fgL9Tb+c{IEfltGEUabNfS;$t9ruVLmY{i z^RZmKOa&P;bO5CJbTkS@s#zwhl$V1)z;MHYFN#+fpAcP_IUl?!|N9+bE8yKDPMO-bMGH_+tMj+#N-rl%ETC<1jc{`VG5O*uFx zX9Gku>BuDj@R}ID7avODxp-Y-eUGEbr9~PWQ9>lH);=kfTx*weJc{9-J_C|?U1>mHeIuw^#bLdH+)Y^I++_C zdBH6x=eiitC~BhL5MEmshu@VD)(N-GTr&9?>MXN+P&!Yo=>D1?>TB7n`f7qk-sR2d zM;o~Hs&AGT>*Azs3%Y~L9KEa3SIbO_z#}tNguc|}#AxA<;T+sv5kKM_&W$nh%&=d} zJ87QZQRti=8wiMC=huSedDV!q3W20x$C}5ABfYf_EXT%(w>7=lI;%$A@`jEI_Q}ix z0jf^~V4mXB$oh1XzVGGU>U-T*_ZjFyf0J!@Ei|oOR(&nXU#a-ZkAo7B>`Ga2Bu;X@ zGJC4uU#V%$%rfidb=wo{TlitQ$$O2mZaTi}4vENQ{rZn`UAzy3#<1Vok}%t_v3m4Y z2@j&FW-LkZySfvi-h!$6IjVWG)^h%uEH=U7x00vhCkJSMOZYwr=sn?F%#?4@fjGsk z8P-Var9$x`${-!dN*xNp;TmDNw6fclGNZ^qw(DdY&UJT zst~)E1f}(RD8)Ot7>iY7ZVyU5M~e4qhVaS^hj0FxBz@k%?*!Jgs9A7zk5|@DX zLlugSGoBf_!^WQPrjoe~y;ot;M^K;{mvI^*)#z*O1>7xyCYP_TOK83iS~IK>;nc_^ zt-V?c)M{YDQRnV%ik~?|y|!FroX_M~uy?!Jx~xdarou#66u1fzoLG(&m*sc=u@jVd z`_Nk`l5*GMd2?pbHbU=ij#r6|QP&6a3lrsXgu3TJ$uOEGb2VuB{-sd*3Xj0?v$>5G&#^~vBeESd>)YSdEa}{h zAVTwH>g0_6^!tfo#a{=)2lSAH#4Z)h&X);q#8+W4@2rS5e9cpWk105O^t+KUB!BwCBaS$5-3#0Ml{OBa!ZdO zwyKiX{63qUZUVr|vz%ejvFZcV@JIy%SdWNaxrS4Br@}TzGItJXTUk2hSP$AuNvd;6 z_v;HbV+#51V0MxSkN)1k*@`1978@ zfoOn`aQ>j@&C+>I>h^f{5S;#kSz9pKj$J6~YGBDgkR~pFgJvK)RhcUYeZwU4Z^)Zf zn@r#BetK(8g5o8Q9}=Y+_~ugH{&b|&fl{BPt`0ZJR&6EZxHGk{DkI-Vdt!6#J2PfmzOK>5bY>kGju+GnmF;6uRbF5_+hPcHHSOW&Ks4Ddt57{%!E( zX5pdVU(fF}8&!KJq9^5l4|3*SmXi5&lHVqbIh8#id$6xVY(v^DoQVmG;?=g9`%73% zn~ISa9wGGZf^&5CO*{%g_v?eowQ8M|8XFBxRve?cRReBRJ3RJ--`TK>dTiG^Uu_BZ zP2EVqW8=Uv_;ri?H3rN_p60NY?LV}LRQF%y0KNsXec4z z*GvjqiDP~VW!f{h1V`-(e)1x^WtWUJiJZ++y0DF{jge!t^_Gh+#%=9rme{hxQC$T4 zrY@0nb8VXIy05piq7YFynum36?M-#Cm5kRFR!!9ajw@Ds%&1`Z$HCz5Mc)uv5YW*P z)J|XGO8(!HLEN3buvKdFQs+Xc<`87ga>2D$aat>4`g0$jPk5)(3W^ zhfi;;GyTu&QNzge zsGcF*mNNmD7I+SFU|PYK=Do4L{#Rb26ufg{;{=!d?-Jgy=%(_R&De18UEFQ+!$lE0 zanr6oE$M?kpV{Pj4}1TD;*KD!qB_aN4s;mxzPH;iFjkp{oPNCEtAq2u%&gOEp}v2i z?k8j(_1t&l#5`}YXM~_@a_CP$NFJN$AB zIc+sCHg|XWw$dgnLulAp@UjaZqFtqU)b~gWFW?1Ru{8L7J}!S3ikJvEu*ceZk|i|K zt1`F~Ex@sR_RTX})k=L5+kN92ZtG`a+i_NYJe8BJa zY|oR}(i;7sp4oJqb!Wy`kogdLbu+_P`)0~>3@7r1Ir^e$A~Im0&4h(~(sD8GWC` z8HZgoyv&Z+VWL807rY(>i8^g&v=?4=KilV1(lWF|Br!J6vc-ml=f~A9Wl<#6T!+3rUuFI9U3iFk1LF{70NIE-zk!P84k`-p7 z3*=^EIts-o_Q^NOY;=e*Y_Hgc@T}s*)=~4=(zs3g4$Ac7c*r1xZRaB8 z2T;^Ulk0t_vvEgRG788#e9KY%98ZN+Y`h5zQIa|8;_$~o{B+jD3*2i-8dCOjIw2IO zzmh(?+>*XaAjDM7r_NUmDxGWVqy{gXyk_JBLB&yrUk6q-2YzU788DRk0g0*F{twF! z{PPQnyL6G4gTx^&X`*wJ{ZJ%)zY10%Cl_LKU^zPVW8jYEKX16Pd+yFn0JzUW11t9t zi-A>NB9u^`*+uXr!phkyfr?L-60g}Qv`Y+`HXTha2SNaM+6P%z>2(oPb7(+NgN1}mhEUmfVP*;UM>UX8wDSDRi_}x`ccD!dqKogr?@TJsP2goQ@ zzrY62_i4I$Y+V3?2&Zwph3C$Kp|>|?goGniurvqIJ*tL3v4i<62_!G_Qw5%$(0E z=9KG0&{cwF`eXEbR~_bI@hn9OWViBi4nUdLO;uNPeHs#VZL}Z0RHo!o-)CmLnq0tV zdAJ4zyQ>XbDIs5g?!0>9Yq&WmqsdqC=?Ey}BcFwCL-E1#ObU*E2_PD1gS{MjeAt(r ze|KNkT*<|24O27ji7P*zIwo5zrKR~~HG)-cRiaMv*3_?!F{PxDf_4Xgp~g@%ce6*> zb*jd(n)30j5S#VduB@Qj@$~xz`F^N}JTOPeO-WjxXNurk}rfa)T zj(|SyrbJ39^OfSCA`cYz(oIYR*ZNMI*j?rt?PGFwg|w>^JWn1teLa!34hmS42H^He z$-Gtl<0d|tq(Zwau>vF-GRYr!JLe%SY8UK!7t*8GPE4bAZDehq&y~J29;*%Lm`5P9 z#!Ua7WbL(v1T%}Zo^bwXQ2{w6?|J2z^JgbuQq!WfixdV)=q?fsM&V2X;j@O4kKq9d zqN`hwixNAY;mILCjQ+Z)oE^u{mH13HUa)K0@=cnX$`elcEwmp0WZHaMx? zY3}>$9Ysg!tbv&P%AmJo6jc|n`V6Dlf! zbig}E(TW@}(Vf%KHny(n!R9;>C|{<769c02FOx-!9SDw-g9-XfOt_sYTQ@x^ejF61 zNak3SkJqSp#g|CDMxUhL>RgRq$N91OZi+D!vzuiZ`@67|`Sa3rWC$1pK}A8Ovd33; zp2sCNkrd_MJUs!8qsG@gNm*JM~b4QxU%$ZTE+Ibi5@uM0FXnv2V9*%Aod|?O_TI;C6MeQK@ z$v*KG%5*G`444Cy0Q0xl9Uakb3xh>8Cr6)mv*D181(_9K72`U zsQqF_G@MTjuv&N6I8ea?#&u!nTPciL5QJH5UVRR`b&GKPK;(Ps8`T8Z!`_Rd%gvqJ zzhMk$;M+KQTs&&R6-yDiqQc!_9WCjuJkAj_$^?@buvTW^WtWV< zE&DPpB1XHE3xw^gkj&}YMEg1n-yTwN!h9RW>dszS{x{d50f6pbK=-fZaRg8<^WUZ4 z{@6;>bt-5n43y~diJctDrVKr3G3Pfls3H<3DQ?PQB@V9&;yd>p>+sPA9GWRy2A}|N zwcBA|4=y-64X%uVi$Z~A=~tikUTN1vl#=LGJkojYou;mo-$xy8k}`l-MO+cxWd!Ao zj=frd{Vw3>=!cR~3j;n|-))(K9j@cCrj4Ys4?(Te0%Gev;6%#QPI5s1fwS+hzJ|C| z>)k%{PDJsu!ZgDnAmbeV<+fnrEv9-F@4K0CimM=t!Iyz2m;0A}UX_Wq(1qgc8-*eC zmvW=1Hvh&=t=Y>FKz{0sq|YtU?ZdkMKznjtJ1Hle$}|?J15*lyHK^k;{0XtUzy0c^16;sdIy$lqH%KK-vL^rK)VLUHgwDtC!@IAV)8d2{z& zCilN)W-jr+8jX`ziB#WfL?EqO4v`rQHS+iW$xm$A;%41_FUZ>hiLhixm&Hm1!UAA> zVo`K;w0$ESWF6Z4#P6<7fXIae@e^jL@ + + + + + + + + + + + + + + Memory Viewer + + +

+ + + + diff --git a/memory-viewer/package-lock.json b/memory-viewer/package-lock.json new file mode 100644 index 0000000..10ccecc --- /dev/null +++ b/memory-viewer/package-lock.json @@ -0,0 +1,8390 @@ +{ + "name": "@silicondawn/memory-viewer", + "version": "1.2.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@silicondawn/memory-viewer", + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "@codemirror/commands": "^6.10.1", + "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/language": "^6.12.1", + "@codemirror/language-data": "^6.5.2", + "@codemirror/state": "^6.5.4", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.39.12", + "@hono/node-server": "^1.19.9", + "@hono/node-ws": "^1.3.0", + "@phosphor-icons/react": "^2.1.10", + "@types/better-sqlite3": "^7.6.13", + "beautiful-mermaid": "^0.1.3", + "better-sqlite3": "^12.6.2", + "chokidar": "^4.0.3", + "gray-matter": "^4.0.3", + "hono": "^4.11.7", + "mermaid": "^11.12.2", + "playwright": "^1.58.1", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-markdown": "^10.1.0", + "rehype-raw": "^7.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.1", + "shiki": "^3.22.0", + "ws": "^8.18.2" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.18", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/node": "^24.10.9", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@types/ws": "^8.18.1", + "@vitejs/plugin-react": "^5.1.1", + "concurrently": "^9.2.1", + "jsdom": "^28.0.0", + "tailwindcss": "^4.1.18", + "tsx": "^4.21.0", + "typescript": "~5.9.3", + "vite": "^7.2.4", + "vitest": "^4.0.18" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.1.tgz", + "integrity": "sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "lru-cache": "^11.2.4" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.7.tgz", + "integrity": "sha512-8CO/UQ4tzDd7ula+/CVimJIVWez99UJlbMyIgk8xOnhAVPKLnBZmUFYVgugS441v2ZqUq5EnSh6B0Ua0liSFAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.5" + } + }, + "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/cst-dts-gen/node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast/node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0" + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", + "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.1.tgz", + "integrity": "sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-angular": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@codemirror/lang-angular/-/lang-angular-0.1.4.tgz", + "integrity": "sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==", + "license": "MIT", + "dependencies": { + "@codemirror/lang-html": "^6.0.0", + "@codemirror/lang-javascript": "^6.1.2", + "@codemirror/language": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.3" + } + }, + "node_modules/@codemirror/lang-cpp": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@codemirror/lang-cpp/-/lang-cpp-6.0.3.tgz", + "integrity": "sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/cpp": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-go": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-go/-/lang-go-6.0.1.tgz", + "integrity": "sha512-7fNvbyNylvqCphW9HD6WFnRpcDjr+KXX/FgqXy5H5ZS0eC5edDljukm/yNgYkwTsgp2busdod50AOTIy6Jikfg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/go": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", + "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.12" + } + }, + "node_modules/@codemirror/lang-java": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-java/-/lang-java-6.0.2.tgz", + "integrity": "sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/java": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz", + "integrity": "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-jinja": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-jinja/-/lang-jinja-6.0.0.tgz", + "integrity": "sha512-47MFmRcR8UAxd8DReVgj7WJN1WSAMT7OJnewwugZM4XiHWkOjgJQqvEM1NpMj9ALMPyxmlziEI1opH9IaEvmaw==", + "license": "MIT", + "dependencies": { + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.2.0", + "@lezer/lr": "^1.4.0" + } + }, + "node_modules/@codemirror/lang-json": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz", + "integrity": "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/json": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-less": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-less/-/lang-less-6.0.2.tgz", + "integrity": "sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==", + "license": "MIT", + "dependencies": { + "@codemirror/lang-css": "^6.2.0", + "@codemirror/language": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-liquid": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-liquid/-/lang-liquid-6.3.1.tgz", + "integrity": "sha512-S/jE/D7iij2Pu70AC65ME6AYWxOOcX20cSJvaPgY5w7m2sfxsArAcUAuUgm/CZCVmqoi9KiOlS7gj/gyLipABw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.1" + } + }, + "node_modules/@codemirror/lang-markdown": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.0.tgz", + "integrity": "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.7.1", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.3.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/markdown": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-php": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-php/-/lang-php-6.0.2.tgz", + "integrity": "sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==", + "license": "MIT", + "dependencies": { + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/php": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-python": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.2.1.tgz", + "integrity": "sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.3.2", + "@codemirror/language": "^6.8.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/python": "^1.1.4" + } + }, + "node_modules/@codemirror/lang-rust": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-rust/-/lang-rust-6.0.2.tgz", + "integrity": "sha512-EZaGjCUegtiU7kSMvOfEZpaCReowEf3yNidYu7+vfuGTm9ow4mthAparY5hisJqOHmJowVH3Upu+eJlUji6qqA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/rust": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-sass": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-sass/-/lang-sass-6.0.2.tgz", + "integrity": "sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==", + "license": "MIT", + "dependencies": { + "@codemirror/lang-css": "^6.2.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/sass": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-sql": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.10.0.tgz", + "integrity": "sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-vue": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/lang-vue/-/lang-vue-0.1.3.tgz", + "integrity": "sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==", + "license": "MIT", + "dependencies": { + "@codemirror/lang-html": "^6.0.0", + "@codemirror/lang-javascript": "^6.1.2", + "@codemirror/language": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.1" + } + }, + "node_modules/@codemirror/lang-wast": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-wast/-/lang-wast-6.0.2.tgz", + "integrity": "sha512-Imi2KTpVGm7TKuUkqyJ5NRmeFWF7aMpNiwHnLQe0x9kmrxElndyH0K6H/gXtWwY6UshMRAhpENsgfpSwsgmC6Q==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-xml": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz", + "integrity": "sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/xml": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-yaml": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-yaml/-/lang-yaml-6.1.2.tgz", + "integrity": "sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.2.0", + "@lezer/lr": "^1.0.0", + "@lezer/yaml": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.1.tgz", + "integrity": "sha512-Fa6xkSiuGKc8XC8Cn96T+TQHYj4ZZ7RdFmXA3i9xe/3hLHfwPZdM+dqfX0Cp0zQklBKhVD8Yzc8LS45rkqcwpQ==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/language-data": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/language-data/-/language-data-6.5.2.tgz", + "integrity": "sha512-CPkWBKrNS8stYbEU5kwBwTf3JB1kghlbh4FSAwzGW2TEscdeHHH4FGysREW86Mqnj3Qn09s0/6Ea/TutmoTobg==", + "license": "MIT", + "dependencies": { + "@codemirror/lang-angular": "^0.1.0", + "@codemirror/lang-cpp": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-go": "^6.0.0", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/lang-java": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/lang-jinja": "^6.0.0", + "@codemirror/lang-json": "^6.0.0", + "@codemirror/lang-less": "^6.0.0", + "@codemirror/lang-liquid": "^6.0.0", + "@codemirror/lang-markdown": "^6.0.0", + "@codemirror/lang-php": "^6.0.0", + "@codemirror/lang-python": "^6.0.0", + "@codemirror/lang-rust": "^6.0.0", + "@codemirror/lang-sass": "^6.0.0", + "@codemirror/lang-sql": "^6.0.0", + "@codemirror/lang-vue": "^0.1.1", + "@codemirror/lang-wast": "^6.0.0", + "@codemirror/lang-xml": "^6.0.0", + "@codemirror/lang-yaml": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/legacy-modes": "^6.4.0" + } + }, + "node_modules/@codemirror/legacy-modes": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.5.2.tgz", + "integrity": "sha512-/jJbwSTazlQEDOQw2FJ8LEEKVS72pU0lx6oM54kGpL8t/NJ2Jda3CZ4pcltiKTdqYSRk3ug1B3pil1gsjA6+8Q==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.3.tgz", + "integrity": "sha512-y3YkYhdnhjDBAe0VIA0c4wVoFOvnp8CnAvfLqi0TqotIv92wIlAAP7HELOpLBsKwjAX6W92rSflA6an/2zBvXw==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.4.tgz", + "integrity": "sha512-8y7xqG/hpB53l25CIoit9/ngxdfoG+fx+V3SHBrinnhOtLvKHRyAJJuHzkWrR4YXXLX8eXBsejgAAxHUOdW1yw==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/theme-one-dark": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", + "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.39.12", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.39.12.tgz", + "integrity": "sha512-f+/VsHVn/kOA9lltk/GFzuYwVVAKmOnNjxbrhkk3tPHntFqjWeI2TbIXx006YkBkqC10wZ4NsnWXCQiFPeAISQ==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.26.tgz", + "integrity": "sha512-6boXK0KkzT5u5xOgF6TKB+CLq9SOpEGmkZw0g5n9/7yg85wab3UzSxB8TxhLJ31L4SGJ6BCFRw/iftTha1CJXA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@dagrejs/dagre": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-1.1.8.tgz", + "integrity": "sha512-5SEDlndt4W/LaVzPYJW+bSmSEZc9EzTf8rJ20WCKvjS5EAZAN0b+x0Yww7VMT4R3Wootkg+X9bUfUxazYw6Blw==", + "license": "MIT", + "dependencies": { + "@dagrejs/graphlib": "2.2.4" + } + }, + "node_modules/@dagrejs/graphlib": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@dagrejs/graphlib/-/graphlib-2.2.4.tgz", + "integrity": "sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==", + "license": "MIT", + "engines": { + "node": ">17.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.11.0.tgz", + "integrity": "sha512-wO3vd8nsEHdumsXrjGO/v4p6irbg7hy9kvIeR6i2AwylZSk4HJdWgL0FNaVquW1+AweJcdvU1IEpuIWk/WaPnA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@hono/node-ws": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@hono/node-ws/-/node-ws-1.3.0.tgz", + "integrity": "sha512-ju25YbbvLuXdqBCmLZLqnNYu1nbHIQjoyUqA8ApZOeL1k4skuiTcw5SW77/5SUYo2Xi2NVBJoVlfQurnKEp03Q==", + "license": "MIT", + "dependencies": { + "ws": "^8.17.0" + }, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "@hono/node-server": "^1.19.2", + "hono": "^4.6.0" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "mlly": "^1.8.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lezer/common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.0.tgz", + "integrity": "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==", + "license": "MIT" + }, + "node_modules/@lezer/cpp": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@lezer/cpp/-/cpp-1.1.5.tgz", + "integrity": "sha512-DIhSXmYtJKLehrjzDFN+2cPt547ySQ41nA8yqcDf/GxMc+YM736xqltFkvADL2M0VebU5I+3+4ks2Vv+Kyq3Aw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/css": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.0.tgz", + "integrity": "sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/go": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@lezer/go/-/go-1.0.1.tgz", + "integrity": "sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.13.tgz", + "integrity": "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/java": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@lezer/java/-/java-1.1.3.tgz", + "integrity": "sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/json": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", + "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.8.tgz", + "integrity": "sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/markdown": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.6.3.tgz", + "integrity": "sha512-jpGm5Ps+XErS+xA4urw7ogEGkeZOahVQF21Z6oECF0sj+2liwZopd2+I8uH5I/vZsRuuze3OxBREIANLf6KKUw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@lezer/php": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@lezer/php/-/php-1.0.5.tgz", + "integrity": "sha512-W7asp9DhM6q0W6DYNwIkLSKOvxlXRrif+UXBMxzsJUuqmhE7oVU+gS3THO4S/Puh7Xzgm858UNaFi6dxTP8dJA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.1.0" + } + }, + "node_modules/@lezer/python": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@lezer/python/-/python-1.1.18.tgz", + "integrity": "sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/rust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@lezer/rust/-/rust-1.0.2.tgz", + "integrity": "sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/sass": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lezer/sass/-/sass-1.1.0.tgz", + "integrity": "sha512-3mMGdCTUZ/84ArHOuXWQr37pnf7f+Nw9ycPUeKX+wu19b7pSMcZGLbaXwvD2APMBDOGxPmpK/O6S1v1EvLoqgQ==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/xml": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.6.tgz", + "integrity": "sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/yaml": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@lezer/yaml/-/yaml-1.0.4.tgz", + "integrity": "sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.4.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT" + }, + "node_modules/@mermaid-js/parser": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", + "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", + "license": "MIT", + "dependencies": { + "langium": "3.3.1" + } + }, + "node_modules/@phosphor-icons/react": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.10.tgz", + "integrity": "sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">= 16.8", + "react-dom": ">= 16.8" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.0.tgz", + "integrity": "sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.0.tgz", + "integrity": "sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.0.tgz", + "integrity": "sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.0.tgz", + "integrity": "sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.0.tgz", + "integrity": "sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.0.tgz", + "integrity": "sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.0.tgz", + "integrity": "sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.0.tgz", + "integrity": "sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.0.tgz", + "integrity": "sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.0.tgz", + "integrity": "sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.0.tgz", + "integrity": "sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.0.tgz", + "integrity": "sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.0.tgz", + "integrity": "sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.0.tgz", + "integrity": "sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.0.tgz", + "integrity": "sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.0.tgz", + "integrity": "sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.0.tgz", + "integrity": "sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.0.tgz", + "integrity": "sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.0.tgz", + "integrity": "sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.0.tgz", + "integrity": "sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.0.tgz", + "integrity": "sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.0.tgz", + "integrity": "sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.0.tgz", + "integrity": "sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.0.tgz", + "integrity": "sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.0.tgz", + "integrity": "sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.22.0.tgz", + "integrity": "sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.22.0.tgz", + "integrity": "sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", + "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz", + "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz", + "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz", + "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.13", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", + "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", + "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz", + "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", + "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.5", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.53", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", + "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", + "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.18", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", + "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.18", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", + "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.18", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.18", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/beautiful-mermaid": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/beautiful-mermaid/-/beautiful-mermaid-0.1.3.tgz", + "integrity": "sha512-lVEHCnlVLtVRbO03T+D9kY5BZlkpvFU6F18LEu2N2VLB0eo5evG1FJWg3SvREErKY+zZ7j9f+cNsgtiOhYI2Nw==", + "license": "MIT", + "dependencies": { + "@dagrejs/dagre": "^1.1.8" + } + }, + "node_modules/better-sqlite3": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.6.2.tgz", + "integrity": "sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x || 25.x" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chevrotain/node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", + "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^4.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.21", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cssstyle/node_modules/lru-cache": { + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", + "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/dompurify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.282", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.282.tgz", + "integrity": "sha512-FCPkJtpst28UmFzd903iU7PdeVTfY0KAeJy+Lk0GLZRwgwYHn/irRcaCbQQOmr5Vytc/7rcavsYLvTM8RiHYhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hono": { + "version": "4.11.7", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.7.tgz", + "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-28.0.0.tgz", + "integrity": "sha512-KDYJgZ6T2TKdU8yBfYueq5EPG/EylMsBvCaenWMJb2OXmjgczzwveRCoJ+Hgj1lXPDyasvrgneSn4GBuR1hYyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@acemir/cssom": "^0.9.31", + "@asamuzakjp/dom-selector": "^6.7.6", + "@exodus/bytes": "^1.11.0", + "cssstyle": "^5.3.7", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "undici": "^7.20.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/katex": { + "version": "0.16.28", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.28.tgz", + "integrity": "sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mermaid": { + "version": "11.12.2", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.2.tgz", + "integrity": "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.1", + "@mermaid-js/parser": "^0.6.3", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.13", + "dayjs": "^1.11.18", + "dompurify": "^3.2.5", + "katex": "^0.16.22", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^16.2.1", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/playwright": { + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.1.tgz", + "integrity": "sha512-+2uTZHxSCcxjvGc5C891LrS1/NlxglGxzrC4seZiVjcYVQfUa87wBL6rTDqzGjuoWNjnBzRqKmF6zRYGMvQUaQ==", + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.1.tgz", + "integrity": "sha512-bcWzOaTxcW+VOOGBCQgnaKToLJ65d6AqfLVKEWvexyS3AS6rbXl+xdpYRMGSRBClPvyj44njOWoxjNdL/H9UNg==", + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.0.tgz", + "integrity": "sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.0", + "@rollup/rollup-android-arm64": "4.57.0", + "@rollup/rollup-darwin-arm64": "4.57.0", + "@rollup/rollup-darwin-x64": "4.57.0", + "@rollup/rollup-freebsd-arm64": "4.57.0", + "@rollup/rollup-freebsd-x64": "4.57.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.0", + "@rollup/rollup-linux-arm-musleabihf": "4.57.0", + "@rollup/rollup-linux-arm64-gnu": "4.57.0", + "@rollup/rollup-linux-arm64-musl": "4.57.0", + "@rollup/rollup-linux-loong64-gnu": "4.57.0", + "@rollup/rollup-linux-loong64-musl": "4.57.0", + "@rollup/rollup-linux-ppc64-gnu": "4.57.0", + "@rollup/rollup-linux-ppc64-musl": "4.57.0", + "@rollup/rollup-linux-riscv64-gnu": "4.57.0", + "@rollup/rollup-linux-riscv64-musl": "4.57.0", + "@rollup/rollup-linux-s390x-gnu": "4.57.0", + "@rollup/rollup-linux-x64-gnu": "4.57.0", + "@rollup/rollup-linux-x64-musl": "4.57.0", + "@rollup/rollup-openbsd-x64": "4.57.0", + "@rollup/rollup-openharmony-arm64": "4.57.0", + "@rollup/rollup-win32-arm64-msvc": "4.57.0", + "@rollup/rollup-win32-ia32-msvc": "4.57.0", + "@rollup/rollup-win32-x64-gnu": "4.57.0", + "@rollup/rollup-win32-x64-msvc": "4.57.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shiki": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.22.0.tgz", + "integrity": "sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.22.0", + "@shikijs/engine-javascript": "3.22.0", + "@shikijs/engine-oniguruma": "3.22.0", + "@shikijs/langs": "3.22.0", + "@shikijs/themes": "3.22.0", + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.21.tgz", + "integrity": "sha512-Plu6V8fF/XU6d2k8jPtlQf5F4Xx2hAin4r2C2ca7wR8NK5MbRTo9huLUWRe28f3Uk8bYZfg74tit/dSjc18xnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.21" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.21.tgz", + "integrity": "sha512-oVOMdHvgjqyzUZH1rOESgJP1uNe2bVrfK0jUHHmiM2rpEiRbf3j4BrsIc6JigJRbHGanQwuZv/R+LTcHsw+bLA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.20.0.tgz", + "integrity": "sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", + "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.18", + "@vitest/mocker": "4.0.18", + "@vitest/pretty-format": "4.0.18", + "@vitest/runner": "4.0.18", + "@vitest/snapshot": "4.0.18", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.18", + "@vitest/browser-preview": "4.0.18", + "@vitest/browser-webdriverio": "4.0.18", + "@vitest/ui": "4.0.18", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.0.tgz", + "integrity": "sha512-9CcxtEKsf53UFwkSUZjG+9vydAsFO4lFHBpJUtjBcoJOCJpKnSJNwCw813zrYJHpCJ7sgfbtOe0V5Ku7Pa1XMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/memory-viewer/package.json b/memory-viewer/package.json new file mode 100644 index 0000000..a3ca25f --- /dev/null +++ b/memory-viewer/package.json @@ -0,0 +1,83 @@ +{ + "name": "@silicondawn/memory-viewer", + "version": "1.2.0", + "description": "A beautiful web-based viewer for OpenClaw agent memory files. Browse, search, and edit Markdown files with a dark-themed UI.", + "type": "module", + "license": "MIT", + "author": "Silicon Dawn", + "homepage": "https://github.com/silicondawn/memory-viewer", + "repository": { + "type": "git", + "url": "https://github.com/silicondawn/memory-viewer" + }, + "bugs": { + "url": "https://github.com/silicondawn/memory-viewer/issues" + }, + "engines": { + "node": ">=18" + }, + "keywords": [ + "openclaw", + "memory", + "markdown", + "viewer", + "agent" + ], + "scripts": { + "dev": "concurrently -n api,web -c blue,green \"npm run server:dev\" \"vite\"", + "build": "vite build", + "start": "node server/dist/index.js", + "server:dev": "tsx watch server/index.ts", + "server:build": "tsx server/index.ts", + "preview": "npm run build && npm start", + "typecheck": "tsc --noEmit", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": { + "@codemirror/commands": "^6.10.1", + "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/language": "^6.12.1", + "@codemirror/language-data": "^6.5.2", + "@codemirror/state": "^6.5.4", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.39.12", + "@hono/node-server": "^1.19.9", + "@hono/node-ws": "^1.3.0", + "@phosphor-icons/react": "^2.1.10", + "@types/better-sqlite3": "^7.6.13", + "beautiful-mermaid": "^0.1.3", + "better-sqlite3": "^12.6.2", + "chokidar": "^4.0.3", + "gray-matter": "^4.0.3", + "hono": "^4.11.7", + "mermaid": "^11.12.2", + "playwright": "^1.58.1", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-markdown": "^10.1.0", + "rehype-raw": "^7.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.1", + "shiki": "^3.22.0", + "ws": "^8.18.2" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.18", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/node": "^24.10.9", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@types/ws": "^8.18.1", + "@vitejs/plugin-react": "^5.1.1", + "concurrently": "^9.2.1", + "jsdom": "^28.0.0", + "tailwindcss": "^4.1.18", + "tsx": "^4.21.0", + "typescript": "~5.9.3", + "vite": "^7.2.4", + "vitest": "^4.0.18" + } +} diff --git a/memory-viewer/public/icon-192.png b/memory-viewer/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..439cfddcb53b40fe99e9463e07a848a7cfd4a481 GIT binary patch literal 9015 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 JSIU|O{x6*tJ9_{C literal 0 HcmV?d00001 diff --git a/memory-viewer/public/icon-512.png b/memory-viewer/public/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..ea46532ad6cb0fd8a5a0cabb8a0f5a12257c7067 GIT binary patch literal 37206 zcmeEt&-J0086uF9rbb;U|FpWhDSW z22gz^ujiY6cz5f=VElE5aAll^_pu^ht@0*CtG?a4tApw4lF5TTk9QMeU9w&6VnJ=? z_1xtzY!m-XJRO{{`EC(nrU+P1qTy^=V7cme;8%_oPQ>_tDVF zw=4TjV=qc9XEcTONik&G3BFh_md9`_YDPpsiualP*D* zd)LdP1-u2kDu8HM-2BE#Ryb}6X(!m^A7qy{TqqI?`c&b5Ri|Zy@6Lwh5^CVY8-#X; z#R@1lf21j3YCxIkAftTI&y*HlUgM{Iqd#^6U&e-?bonEj!LokmtdZR|R{i6lSWtS} zl};bnC>VK4incyj;oJzwd*sEZPaa{DT>&~{&d0GeP8qNYXhHPk2z2Tx`oS-IHlYr# z{5Nu-OEEl(5XbM#Cx?N^f#aPnI;Z6_A8$66ZoKt7MQSP@Zhhi|Gf~*_=18Cafq^zD zD<9Dm>u;P@)?qz!%reGq0e}%$pHy5C`I$KM;@R_Iu9!AjXL%B$;|s{E6I!>I53+fs z|IJhiiYT}$sUfZ9aviiw`Dz$$)1n{W-0?4x@Eq+z_82e=NDU=W{la2XZ*(Kc_~rC< zckONlxfouZ@qdF;x2dwb0iJ=1dwetl{-)=fXh{9dIn7^C67Ek$M%5pMyrb*{HyO$p zg;?wqP=O78ES8turb^cNBKP8{6ym*E4s8+pzWLmZ!!1!eNG6Au~_5BZ8OJZRAAHU z7)dwzzLTQ^c@1?EpxsMt#D^Po7L66s^2L*XC68bv?-m{5K(GiYrfZzmmfBDTDXvDF zkSK4ku_Tt;_=q#=ZS`ZMoh!XU$EnfJ8vz~`d5z?Hn zUXdDDUWhH=#t}+n@FYY0;=*)qzD8mxhdI!<4ZSwfDLrrR&90_R{6V^`tm=3EvyV|f z+5E`D3CSU3IrR$?&tWAC%p%Kodxt~QBX`py$$psU0Bd%ob`KT6ilol-=!68q-#{`k ziV=6*<;XN?0&}oih_Zv^HedBC!K&CJChb`TDzh9H(+U{$rcV-j zP>{Tc@T$~fv%~zt?#%l7&_<2Yb|Rgz*a!HKfM^sXbTf=g?OB+SmuqWx0i2r6_ME-+ zI1>S7cxqH2SvZ+p;I}*KY(uq=XwSJ&S9n%}JAMXnBCSC0Xa={)Nbu%Ri4#2i4hX>tIU#|7Ze|-WF@S(-OMGoE zFCX#Uk0+TSbYU)unyA|m6bLl`3zR{xLZ1w1r+mnB;(0e?)udKSuNPM`nUQ~CLnr)V=Z$wBzQcQTF@ zoQK@n{xzvWk}x+w=tBt$6X@>z47QkD@H>Ns8NX>!ib0Ag;*tKi!CN0K^j`QcSY%&E z@qCuZYF>7rk2`YwY)ac+!&D1Hjl7HMzZ***lPrF#4Ose~wVK6<{D20Ax1dMa=zV{N zJB4gV^gjC&vsA_-9_+It`WOJcL9F$lZ&f^hM0hwJr~+0f9`=(>I!T^Id;BIBwLR6> zGtJ`t6nD&IyH7$JRY*y+j)vgawnNMa_-j-dO(PUyw2cGnIQ*Tl_NewxrTKl#;!JpS~@TL>}Mt`;wkLQ^Eh^4sH97HmT%Z4M_;*oiLuz zAV75mC2Bs0BHJ{Mq3nULg(X#%;3PbNie1f)HGXe3oZGc*_D&hv?h+|Q8H1vA-x9*L z(oD_x99peVl|}3-k_U_1p|r1e^?Y=ldtQePn+OjHHeJKjPDLqOU=rhFETUIx{D` ztL%KOuSYslI1vE_ASc0~9)jN`7e&_~di zhr;WO(W-~zlN)Oa*prr7h5&R&o0ym(f?Q{ku6;TaVCyRs)gST`_Zh%}uiKDlLFLOf zi3iCU^Drs6^%tQZG*kyHB?&)%U$^R+L%84-3rruM zD>L=5B~p@FqTeQ{L8_fUYu!w%pJ@%ndK(3@o@RV`K)sOT&PWt(X`QMCX$!j>NEYe!4I;G$D8l)S|L2s6)OD zAUw`63aZG0^t2T^^6_Il;|#?A?^NToX47*+noEhGegx^9r@vwrJ)72Q)9Fkdb99fK zoIwcT)2anV7>$$^`l^1?WwxM;i7|0z&th7Ku=TaveX06NlVBNFDr*k`yRt+nG9H(Y zY{rOU{KaR6P&%7BNetBTMyn1~^8&h-JMQKo*J;fkS1a?LRn4r`V*g+R8j(Lp#(zDK zxp?~Klq~@MiRJKO@00b`&E5A#43+jCCn|t z`AHr>)vI{!^+Z4tmXaCZzZ)2FK%Ob1j>OKP03PvbFLm1qd|caZSepLwFSH>ccKoP& z;4kFWktzQt$oj6|4fN-~#{im7_l34-&U;TMQ{KC!0E%l^?}(eagXy&>9-C)Qj>dB` zz4cI;jly+99_X#BG;%r$M!;qLhE)PAoTb_5@a)OygL~Rce>RCKDDd?qW0oaKWQpo~ zSpf%2X$VtedpXw_kl?tBV`Y#l&NmaaVdOc*`;_fZpS{<6#QQCN#a@UaMC{?Zz<}$m zH`wX?MlHCuzUUJkZ@SgfrkoFAd)Y-fz18<|omG^?wYBG|2~A8@ z>;)Z2+*K8j4w=<~`H{PV0VHJ8>QoiGGp?UPzr)oqw79MYCaz0NZ8ye)h5Ur2>>ToH zitsW1I}J9C%?5I*6%sL_Xq&Siw{PYUXcx2>j`u~``=5*n4d*1O3SaTdSxGiuA~HO+ zweJna>e2dAN-0KG+#trpVDQewOnMhfcGI@rB1E?!`rQe%$Ey{A7D@=V@jy z{YPZN1}wd;gkZ13{bWgPol%g%))f+Yt2cv*KV%hxIq+(Pe_*-iR1+pkTNX2b8z98^ zVobUcVTVd`1JNL6ZiZ2qo!^jzZ%eQc zmzt0P1|O3!4qCVgzWVYm<}90E1BJk*!CKV6y1mxmie=F(M$3vXWQlpCvTO8T+{dDO zx4c2bUy%`H(Cz3L6J;7ix4a_H_}h23*FoB|etay`$z;1nKKnHnd_wqFHh+yE_yiySy#?E!Hj1SV0vyjb$(Cxr)WRcEv*# z)IK-L9Ui|2NUZfWWtreM$N4hf`;)Ir&oIGbV~(tF0BwMi6OHuTUxoE_J}QpF2yN2e zI*EfCrF)ylZ~aZYou|fr-^LB)75GzdDE!ps0>z!N=3VnVFLHM`>i(_RX$_Hn&yYZt zwC-&l)F~qAl*u_w$6*onAa+ytjxKz1MzrmQ9A>v~*p((j%_%U6s{4?K(D z^D4r~ABgv6`0KKVvbN^bApnnZ@D?avmd zJ@Ik52Zp_V0)Zs!zLRwA7?`XhQ8A39*v^?<=xfXe{M7pACjRO!4DdzI$#}_c1Q$zb^fwm$YJ5*>$Y5fe2}`L#o4 zfxeFp^d;bd=?^r@fdlQW25t6T3Tt@Iaqst5%V$Oup-OIR4TG}-j&-D$$fY9`>_^^B zCS~{tJU}>%`r|1z8o!!4M2CwEm;@B>KF8mG&7B{0N zLI-9CBYjnY!`$CM5d!+Eq&FAl-OztgW^Tu30s!%Xq*;B5pWK6RpA#7)0;>{SJd_bA z;ty#5gQvp)r4A(?{z+ZGO~8x{ei^G;pd69n+P8hEbC0aN&ZqC5B@O&>27}Qz^`i5W zpzP8wjKQ1Ix}t3uViYgG0;qwi09Ovd$Vi=Xj-3_}J3Oj(Go_=D{~Sl)C33Q+yKa&m0<^Wlf6Z-!nU>yS2^y^>ut%bSNGh&Uryd9qm)Mg^(>f0%!8Md>!1gr_$$ zG16aFVCwhHznOo8&L&yFg;?voQuSqX4Vba_B$)WjnHT|S(T5#ZMkaKGq1-J- zb!(IOE#u#8gv{I(OJY6}4T%;;IP3cq2=Zd%Osm!!U?l1E6A?)XxriPeFCRO1N+ba) zxCjMALMpRGj^3_>RF0)0L_i~gip}yO)Ljd_t%nZSA@YyAJj<)k7Xg~z-Ht_Nt;>l& zSrZz0Kg*cK9Ua!nbBw>UOcQ1uf+I+?EpZPfb(q=h5|&Th<%#ese`F7cZ|%o(q4->c{n~=r@-YA|C;clQPzaDQ%NlGuUs;Nk z#SdYjq9y&xT>onVMlDNq{YmzkBDJ>$2a;C=tC2;-$KJC8$~nQzdoOX85=+iIm*ZgD5&DK5Yf!==y5s!^K&cq&1cIR6p1>Ts7|?OwBdrM z@SW=&YYnfj19sA1rMuXuW{gW#T+$#D;7xvrYZ6cSXA!m{B~}KaTGl<@Lfqi(>{IOF zA}xoTo-NGW6S2ntM>RD&d3s77dOP>()yVSf7ey4WOYJQ2CMVw-ysR2Fu26JG?!|Yh za80MHHQBa9U6?fK%-g@Fe6)C)?V;{qT|S*WBpcL`Qdlz_vty;>vf-YJ__r_(l1LR= zqf_pqCmH@A_YM&`2tH>gJ&=tLT6kZBvYO#}LZGt1v&K63tw6FAhIx#0D(F)GZ8S2= z-o00ZpMh2y$D=nitA}hUc&$AI3xj53BYbMlt#r1dk))k72NqAtN#=E#f+dSf5#sga zpOnoH3xdk<&^R`;0QT4UURtFg6y=tMhqe;8odV4yqz^NUoN2%0qZc51tD~(CXxT8Fm&$RCnn#|-MMYF=xsud*8QoOF7WgILEq`&S;2?T%{RpfLipq#VeMk{M?l}|3w4oW{DA{LCw=zFEDMxUV0M)GbqvpC`yX7p{Y74#XJRQeJ{lKN8#ZU+4QsGxE6t-Cw#BG zPP?}!xgZe($?V%Urg=>SqmQdkeOrwj@Nrs!xjIAa=;k)o_PAx&v9)+UH3vTFVMZ1M zXI+taJV%qa_yVWH3oMz(zx)E$86OHQt03~yVt2h+r>OXS?leGAixzh)IJi%zE@VYu z{EYn~v#SlS8V1bWMCTs`yozG&PjG|Ii^uQm#^)I%AR?>j(E|_T*i?ao71M zN9_j#R7vQS#l4=YX|5+_1fypS&z^bhe^@sIKJV9OP^)L7j{O6^$q-I;Y2 z8~rW9kM*J)>Z?dgcYv81ZtpJmY#o-gW8w;Z?`%wGFECiCuSwMT(xGKW&H;g4_e;hO zdeV~+&pSAuc0*nqO4t$}B+{HWll={y#i-t%*M8)y8OkCcc1FST1s%)QF4P!Y-N?Bh z8cVz!WCXgy<$ckCv4m#lEBWK7nUl&v9iCq~xjLA}l@{S1QvZcs#Z?8*RG(IKU2v}L zTE9qvR`ddc8d$NxUpF9xJhY;Hu7JUM%y3~oeJ6gR!Sp6v0vBFs>ho%4H9c1N?ISLE zZi^3wA*0wT4o~&9UgUa38?)T)b=j8!o%H`+FMQ?7UFZv4V}|f6o19-a1a_uic0YM( zQW3qiVx^a}xwmurdJ3FmhK7|9PfB5T_~PA3F~acJzKco#{e}b{2VkSLq?5NE?T4lS z`sPsVImxdTY6XO&J-O+0CO<^GF#$Sp9#gzp;3S%KSVNSx#Y!cU$DxUQB4i=0q=}V?A403m@Dc-1gd)$A z(8>GYu)JnZv+3eHwJ&p1eR$SjL zoQjF(p#-BZTfJ#X+N&E0foHFIFL?mS%R?MovTdDw={`fZ za>EsoBw24@Bi76>|2;E@eGLsR*sm?39WuO3sx2qSlD42pqR7@#tBOB z4zuX;Z1Q{;v!<&6Lo2#E^8Pyb@i}ymMmlvVO*`#J&q|q@;>xU#b<$821U|E=9IYtK zPlMMJ)Y!WXqPJCMi%NXXd5Bo}BP{Xtb>|XidwN&uC5M=0smN zkVU(RUDJ=pt{N#6zxaE98{#ZQ+i1FY1cBUaLXJ8(72~iqQhg3{#?oflr2lRU)Xy6d ze?rBN1i6gByY6Kj*3xtOzQ`pd@7r;UyYd20^s2Amu;m-mj+zTl`r(Vy_GF|}QP&vQ zjT9h0%Io}Cy>4xOzIe?~N^q!ysda^@nV4{?Bz;KPW{SKp$=Nu4DwT=ETz_wk%w0ah z!?o+s#Jb@$7Z;tXH0F5HvkI!Y4xSAXaXD#*_ZJ_7?(K~59>!g=%9ptw_i?*!$ewIk zD79~9ufU#}sK*U4wl`vZteZ>w4O--_{6ZhzSLwz^g(z^}R3dMc!|N>4W9P%UnK#Gy z@Z~ZJ;gKj2$MLO**(E^V*I1+3B~c@>nFKb-sjM$lz9XcCaZNopeJx+!l_3HKIWtdQ zzS4y?6UyI1U}EXJ8rp#ERhlXPv;b^F!H%npM|-U|C+7+B~YKXb$E8LXg}4tPi6he#3A z>~1o!nAIj)`e^TyL)%+BhJ(;MCvB3^hwrckTmJ2vXjmL1Ug6RvBBf^AP7SyXkPx-9 z1478zw#PR|`{hbw?t}b z7ghj9``$h$O1b`0`mBzR!;dyP)-FAt=a^{& zU%`1g|*r=96PBeo9}f2jWgej!Y?KeM`tu;oPTgp>OA4?Zey`VzwW zuhc_R3e$L%CF|O{S;O|g1>-@3_1#=iV|mXn_#Dx{?}GG?qQ0a`K4;Q*ib8P>Ia{+w z6O73WhTVvRIggQVet}V$iE$XKrGNU;Fo4t6 zeoN&S)1(_VwBPr3oE9?l572L4gJf~<4dNmVXrdkt=r8PdJEy`t$rgbeL@!nZsu4=X z;nqq!x8V7j+7xkpe4X6xA`wMZ#y*J~uY{$7zxzyPLkZ84YWzCkuZdUNhs>OCPM>RL zC#I8Fs3BEIhR^EQB6@Xgug^eJ1z-^M5R4xM|6T$Lfs_!@x0uW&w1?VB&RbsCEbA?z zcuPb}of`!+Ks;)oDfzmj16<%BN>rH$htC}Yx-cq@?_T@bihO=(l2y1sx_K|R4cnC$hwy$P<90bycVRfUuG$nOk)tU90|w+yXt!O<-w zp+QMf*QlT(oCr8%p}2F%EdF=9zqPt}ob(N>W||Yyc6#B%*5UR5u*UZ?)gGUygX8f- z{;Yohj8$7veR49I$!yFt-EagCXQXL|10m8#srXO402(9*XMllkajKy?w z_3Xbf{b_S37Ax;MT>SHk+SPZ58sSm5A4?=PEYCA0NJ=A8OcS)DwVoM8kGUMd>(W;` zO&c!qo%e6K7z_4BTp>g|@h|8fhjs}6A&)~D)?Zhb)Fa-c6|-uMMvXo&EMf$C*ifGB zYb^k6lM&#TAyw_y-C?Q8PxxNqVJ{;fF*y!r3^g4lm* z-D>zJYr%J?zb^4^=}qp=$mM4ski3v0mt*@9aIm8V?FBG-8T||yE|k>X!qKk}UO=$iiZch zV|mq_X!qUT9%VHg$wd|Qg!Y|_j94y>Tc=%@EpZl2-eko2TG&;7M#mI#0Y|RXw4w&K)kO7=Wx9+1wz#nR18G9YeY02T4=32a+SI<+w+Ppka0jr*anj#Mu1R8k;lW7rH71A#WHD7|X$01@EOncaIKW7C4zP z>hufKJ4K^2u)cwZ zfTK{S4EE5fUy5lvX}8!;)N{ZZM)6}bwc`%GCO`2LH`wrTA?8h?5< zALmAwda*vygkBCfVibLuLQC6Q__LlnH`UtasA@xsx6EJ}AN%pA*mU>m$%$k`N;kj1 zugwqrG%K-FQOZXQlx{L7P%?2cGxx%ef=D)zF zhJmFnX@6g@#r`ExGE!^103wD}9B=QG4_zz;*FQWsDLkwryJxGJ^!d$3Zazgj862Fu zl)np2Dl4@FA74pm zCa{qg(eU~~H<9(wq*w6-x+fsjxp$(4gG{L<^pe_@LdeN>Z~U>^JJS-S9()!cJfkb{ z)|7amPWZ#nFcYVe!`D;d8k`lWS?^BAH?xsGFW#NsJyfj_3a8teLgw3RF~83uSz^2dwkUhl0Oz}3%47Mij`Gfk%k&MNu01==Ftn5 zT%*z-4c28g5xuDahJn6}&PXpr(^fF{$XLucjpNDEI>$9d1>gq2SY%PxStC82_bjR5 zLpve_|M|bUbL(F9I+PJi!c^jhQu~!cxEn{y(Lp3T99{9J;zN4KFUG`{M@c{UmfmVH z5gn~nz->%|Ya=nB*;(0R8VMRKL16S+^C}1lFZUMZ0Jccpdv`7KrnY6$_V{N@1Rf!J zxqvE<;Pr$3_APVPj2OrZf{^+J z;pFL!D3A;a(Zwj+zWT-xe1D9GOmZOq@rLLN3nHlp$TAc=A#QeUEC;jXoL((XkiW(E zef0a{Z?xLzU$uxJI;^2JV5usm{RGx9UX&8O>0qhV1TMa^Vc_?zD(z;BYH86gD7x#| zy{0T?CT3Y**PC6`*#@G%FC1#XAN9ln`@t@8kE1hKbh;+(3px#Mu3O$Sip8QH4@M4| ziD7kiMd$y?|ERc(ZwDVFpokJO;C0Vld(uEP=*C>(dhtSbelVvGadCd(ccrKsT=h?e z&!ww=+s!^BFIV~&^@|04R6Uf)oKXxsU@67iy?W5mLFl6WQCIDCb^6V~+<45Q*#NAR!j{su`g2Y$`U*6$*7>oIFKVMo`vFhO-`5nf?E7SeDj5bv-%k?eAoaSfgXZqzN1@iS&SRg3y;bo4OaC_$qD6D)@%%H{%%# zrF%ClRE`IiLMtgFxsH{ygP$ z^gIslA)wOXmQK<6`egL6VRO6R`Hd3+!UxjhE`eN2jSb>Vl7{~CmPs0 zVyb|@j+z2uZ>bvgri;o-FV!x1!WKt6x{*)A0eAuZM?j&({D80^bb*E6w9A4Fb+O=E zAl@iYFqFoG#6G_!9fxek2s|-OM7I{pj>WlFlj@Uu+f4vkgAe^>ibql&91CyRPp_xB zzHegaUp!)Z8=t|*#4Hos4o0I!ra9|3DD9mKw?VVS4^ZAESE2wJ@Q z?`d{_LmwdzxQ$kKUQ_s%_;mr@H_9YLWzQW<90PhAYZ6RA&iZ*8$UbqTb`gN7;ri)` zysp2>8x{%g^}ZI*l8PGnP=L3B38%9BBUOCXJl1L+#cab&e_7Cdqv=TV>hUsq&l4>t z=AqPnpQ9mZjNa+Z%Wqe@`7$3z4}Ch#q}96CM067(bNK^ZTlfgYV+sjIqZMQDpoI{; zZD)t8?!RfPQw8gt*~?(FJAH}Q4K!&r9OtD}|EK;Ddw(F>a>P60aJPQZbsgSH8q%rRz* zoDu#@r5G+|$B|F#J#H=PzJ$KJ>2^haZCh(2+a@a_`%PRvzx)kne^t@8y7LUjnB$Tl zi7PcpuVKOPJyaKZacx6++^ILZ8S}wrqLH8W+UKRDB{C-Jh}F9Ks}XOuM~6MTSf8mC zb^DVX_)Ayd-qWz%adnSsPh#~todEy4FMybZwqRneY5GmcFOBArgOdiF>Ad0_KJ;bU zb!M^v@?uAJA`RHdX4qt+Ra_xaP z`a*TBGIE+pvsjaaWNn5Pc4er%B(1SiGFcQQhHl>^5sl(HvZ<4nV? z!(5tsAKj>re!V|i?;qV)aFtj;a|L9G99%jF+Q`=R{$??zui}R{ka6@HC7pAhO1jz? z2{9@NwA}YfmN~}GPrXOw==)^1|09vjUV;z2-AP+MwMg0$AppEWC&F?cvbhU-7VTs& z^Z|jqzNbrdZPd_hkAj+ZBY(|40b3#=%*YSAmIkOl& zu2Ca9>~Wu%gTSX%WG>E!FL22Rejg8-oPmT?{z4R zMJhI<>)I0)6Sr|tvn#c4lo$Hx<}CAMo;iyC4im({&dL6k#j@STf~ty7%Tm2m183c} zn}ypO*(TVvWAO^)EAuaCLU-44sB?os6O+Yl+69*f5RGAO#-Emm^(5q5np(L`^rJQn zNfpv=u7-`uFYW~M5x<87FM7v4eVXeLO$%r3y-b+yRgZ29p!yi^EEBgDR*Bs-0sI`YwB>-4BH9>5iOdF^|D$U&|g%xJ#7K} z!3t&R(bTfK$O*v)3jH+=Rmu?i-TEbqcwwlm~q_>cc>c!t=kXPS&%eUbUi^3p?Kx840`wyxjN zI(}sr#XDBbrkEku6q~C*;Ey+Ph+wueh9Jt?V<8(Z&K9(SF)xBk5ZG-{lE#m8i`9V+ zt7P*zJrR46f0Z_;n$p@kUL>PcS?^sQ>m%u5IvQZIl-wu!lYN+dozhwhAI1d5^;4U_ z?Tz+J)pHY>2l*nGeG)s-RaqK8k1w2G-m}pmrTRuWLs4GXwTPPGm;6HI0@AW#Z~A{u z{f+3VqnV^}J4#X4c#>OMwp+Bi7R*$up2{yu{7FyfQ6Enq7Y{(7RlU?Hjbh2K41_DezC zu@>|vad4TmxNR%uhvCceL8T-5)}w!bgqs*Wd9f@_64IwpQJTRw-fdka_CofaV*vuu z%{cc#4I@%)-b}D!^z1thgKam+i+ObaHSf0H+L@cRYva{Zs*CR@K8=UQD^u7?HT;C) zWpx#f!>nln5teXb8(*F5`AmW+-c${fQMWT7&a|aIP)EU3Uc)rz;6x?)A2v3iK%ISO za4qIveV7TbH;H0qOyIF-HMK!ds9M8Iua=_RgiU!q&WQK7`vsl(eJx!e4H*unh3f&2 z%hk{g0bJr66!JF)8D^q|Z@F2ClWw=O3I+heLh{6%8!Qs$SJhZoLbaIK-o5aL>n+9y z^HoUrqWRVRwID1lZ{Y)t*pn_b!1hIW6e%`NUdcW*BjZz$>~q zB~>x`Y7%qwV_@S>vK5PutVVd<>neK(?Oxq{*O0*#OA`BySN0sot&cs8>D$^1kEUEx z_T|!~YO2UX1Agh5r<(SKuFQKotYH}F^LdLtDz)M=m%ecLC1-Mci2h&=9efN){f|q%co$_!R4EZ=qeE{o{ z%R=wi=*nI5oZvlisL)y`tY|FRVnQ&6Me4K^ZxcRmiqp4YQ^aXjcTwSz z|A6Lb0@k$azAKkRi2bFe_PkFs3BQ7y&gQEx1Jgym+Hs^Y^ z1I(ieB&9VVU^}6x4%GC|>bbR{SmVTbSThCIcUL3q$LzoA)D$4iSyV@=MOhdxU?cF2 z)^0c{F7Z+?I{-tT&7GwMcbWyOu-Tl+MCt)3BECEUNjHyaKq^#@8;8<#5#8#l6yfO7R<;%N%HH>T z#|P72Q7za{p_k6y*g$5jaE#0~yVPB<@Vb$O=Stg9(rnFWJnKB`Wxbl2ZX+_B{hrGL z9AA7%Ybdn=K$d&9SG#s+ySbqTnn5#NIs-4jyqiyif0W7*Eh(AauvGz!C6Lgak+1=M zL8|Cgav4g@c5}5m;fj+NmKN}^On-TEPMfUwe|^W zbhBF`R>p;-ucQ20zld{MUA)`w%)mBv{JV%J(BRAV^V@<5mJ|FPtQD;a$7QcFgJmoz zL4_hnHbAw;6ZnG(#72jtwZ1CoRC)~g!w*(M;v8$c?~0tMAVIzR*fjR{B~6*DqBR>E zySusOZ+s8tw=qOEsb{WZ+E0G zA2|ch-ar1y+eB8XHCs6c{j7MS`=U@@E+i1o8>Er9bz3&1Ew~;yK!mhnlz*d>0BedMp_3m z+m7ZsBlb&ztk*!p-Tyqgtd4t*!>^QqDnGy#X4pSM(QUn98+lmW9;k{|Efd`5OE^Q& zF7Zb#v6!jYfwkh@f5<9`Y*GdXN;uCf!Izqud$ppJ0qO3qf_NyD+D-4@0coC7^IWbx zLHMnWvcsMDf{zdU0xta!X=&=616+LM73jX*PJ0wSjvN1Ay|yLEqF}#hq{Pr}mvQ!` z@w%Z09pS3h#eM_1uIyNH?ZhsR#PVoD zx@Z96^bDL#U`cCO;@qreulBTOlZf8lMg0R7?2_@^?wWiW1pO&cvE;-rdq8d+2k(8C zmz<;&^kh2gK(>dDMO6HVFbsq&%i;^8S;3zU1*G^Jv}$bkf_ZP#m@7anXs@Dg?&}yk zYIQw-6@V~ebrJO0Gh|RANZL-Qud(k7X8+^^)!1%_{FD(j7MS<~nqZg<`)VTloWYi| z_j4l2=&^1qFXR@Qu-aorLZ9%n@;_J!)x+Th1mYKjFCtmd?Dpf5zj?$}Dh>A@P(wl}q;))gYk!6BnKO z$pqUcfv?nez}TO==EVHl&povtPB}ru(ZfUv zX!4yqg;P!#5*V9U&zz;$HOXUmSCS;tAJ`2)P+e<0j8Z!{gW+TRkw+?5TG$kJ_)1nY zzrnFQimJ|ybb)PD*sd)sN|2{Lv`bfgi;!Y^IkaR=fRejJb8hEWob&qGTYiMGTvR9< z0c%)Y!PP29D`gra+xed2M+YAU+KkNiU%4&`mtg|ashD}Z|G?7Ne`3Jy+mRoUeWaji zTq?DtV4l`Mx@w^i7I(8l#|JWq({v29Bi6l&%%o(gP?}T6K43-IYW2#AP~p2gYC?3- z=p@6H-D4xP2j^Xtf2+Z6tFXuXn|rtRr&Gv7M0^K-3jRn!N%^mh6) zq7bC0s36eM@P(zo1DUyi|9`lzCDfC5GJ}_l;``@x=R zZb*NC$pD5{Tbf3V?}o6iHw%$zi103HtwhbRv!0#%7qrNFjR(y9YF%)9`Yva$I(_ja z(8y~h;C>P4BoQqB3IT8}HXsu}oVD4~{87yekFvi`km8dEWLIS$M~SP2E_QysYQ|Rni1P7WRw@|wRu&rcO`-?xeb*TTIf|9K6Ectz2v5Y0D4GY|IN*zJF&DH=#l+@+5 z9Kt?-w#+CAQUwouoGjf64|$)Mk#^+pFB_7C7^p8a|D_lz0t#=d3BpPJP^VjI=y$Lu#5A93A z^5#&Uva;mw;#ALQ%>vtc&iX4)Z++o$1~8;_rfXO3yj%6Le)$Y52v0 zM*A$PXw~p@1NfYHJUQNkQ?gu~nm>mnUA>;Stoa`-pz<~GXUiL_qTeh|zVxT!xfd?5 zfiCHV%z#2w}~hz1BV`=?3VfcQ8ncN`%t4UA%#gb zOl4hv!+zGUtwU{-Wn+C7@Zm|dk^>?{aM#Vg>KQ1Qf;3Svs?U7*vRdkaz7y%bi~0kG zxoCqEz4Gq9uMjFbP#1J6Fx+|8IvgI|rx+PalYPG*JKr35%3s%@Tubz5;nmzZqrnEt z7vJ_OZqB~nfV!Aai?+efFL=^Gr8jxdjde-(&_`*RG|Le5Kc zZ|_3k2Yu^{nBEJ6-&S$gcS7#Xm!B{_paP+;k4E8zgWR@Co2E7_1U-?zBF4v(A>Y1* zQjwY%e z(Q&Ivz6U0#s23fsZz_A4h5P(+k`12du@ba;7GKh)nM*IbF;-ok2oKYxvo^^-$7`PW zovu_%$eh**p17;i$5Z#U@VChRv>z;X(@BoVamYTKIo;WQ;30Uz+|a6-mk7$~Rhu;s z&WRxrs(uvD$Ga%|YKoNB&e{ipbs?N8-W6qQmmHm3qa_xJL z%xhUiX+(tYgzm*<3Hs2+zE#O0(9{9}-TG&S>V=Cv!3R7Jc7tq$kH*1mT9+AyBrNM6 z-QD+@m$j#mA*XEq6qbQ~2DJYdP3PfA_51$+W6Q4Wb&O=MtjahjltRcJM})|hY{$qJ zMMB1ry=U1RGn?$aXZAV{hjY&F<^B79{(;vxuj^d*eLb${^}L}%QhtBto%0)vMl}0= z?H5yHUhJW6)i0G1_ZsE?Ha*Y;Y8cf6%?Vx(5Q&3Jk7-AYZT>yb&5%FKlb1Ezgb#zm zVMl9cS_f6W>=xVi7y`fHV_St`3CI1m$Io2;$sI8${27M6+Z;-Xzepoh5EcEV!|=G* zV-&%QxjHK1AU3Blr8DJgVM#(XjhAuWTS8o!NG?^n^y%~HVeXzg5cJzk55s9|| zoo$k5al%H}e0ejt5n(ZbfEs}^KBMhj7s;Onp$A-x&|A58Lz6TE7`nSFx8c)u+PmWf5J(zkf0SkmXKkr3 z^1*8*3Zpp^a}>@X)r_iYJ*}TcRvw{TkJtQP9=`Mud_~lJT28B6N9HH9T>7d`v)AX# zAymi^9k)_+^-g=h+%>@2^zOg%OK%JEZ@m$198uVaSV;2+RU zTgB=>Vct9_u$q7Fa-7Vad7P8ZOkQBz3VQ}|zhWPQJ7O7|jf8s78SvJycyAS4biFw) z_DAkU(te+csSCPk+&Jd*p4u#aun0C6{Tpo?^deq4yZ2?Dq{=53whDP>r_W&(3I$Qhe7$AV zb&RjMw;ntG(CkPhU?6||+fU0J`FW-%`@Snh1l@&x!3V*3o#T?oBW!Exm|(jOL$j97 zcGN{q6p9?z{DC^rIUWhMZq!};JfSqthkhQz7T4bnBkf~Qopdk3hz+zvY z@)c6wCoa3?wFp{BLvQ()=nx{DI=w8xtmummF`Yp zVlADVP4<%N|FUpeBoOZLi22;y#98k%f$!|Hk;sqEv8~*zFb^WPcpbbF#a&n_K8R`h zErz#x^MiEwTu!uf*-1;zvYt_rHIYEXd+siGCq?xpMA1nRkI3uE_P#%i4~bWvQ$Quo z3ATKfNuIEOEA5QVZm|^Ud2R+yex*Mt{I1m_7Hwa71RXB&t6f$y_a0{uO90E4V$XhE zpT73nQDF;>ITTn`GZh7bai|?MvmRS57(7h;m6bNWg5qE6Y48=b6U0ylwgKpHt*IWl z(Um!qdYPj$|G~5WInVB4*G5B2FIp_N&}Wv%3oe>WF{IX%uc`>-4fQFI#l@MN2L1km z7um{kuN|~1W_a#52mb5Mj*R}O^iPN@;`K>fYCvM+NlwxSfgVf^(L?M)&Omm{(OVkA zgciPmOnXkOd*pM`Fg-S~o%A9D{4jbr_L4*xtftz6qYMLt%y=D1>GL#YZ+!hl!0IV) z&$3U`8F!wANmxn&Kt#a1Za@lq(q-)hr2}&_ z_Pyr4>qfc}%sZ%+G1^rndis)A{mmVAH18pb#Dbsdt!081r8GS|Q3`QHMMo*kA)msR za{5?z#E&lStx5x9G15(*+C(|F!f@FQt>1EA{E$orBEKp3A5wjG)@6viC%=7FEVFk4ppIOs-@9Lw`eN&(K$I4gTQLPQ^RO-qrBE)JJngo6!X=g9i5fo);KQDN zMTf3DQJwb#S_EuF_^%AO*IHfP^x&_J7k<}XB`Nx1=x)?>flKy`^k#T$rRx}HRrq={ zm{;Tc^>}V@3||j*M%gQjf+)YPaM1S1X;_Pkxm@cwNYRv16-fDOSRiJAOw&bs@Q#E&&cfF2*Yz_ zjKEHn@(D9f?}BXQHP=5N#Mr0;dMDvOS>6zbT)KeTz`UVQ*Yq~|j>!*qFIU!1;-E=5 z(R@{!TFcJC@SB*IXpmwJ4g!XIzB6rFp8r~*H+5?%+4Eaztcq@#9u2*H>6i0ks7cyu zh-&jl(_9A>+8Nv<;K&v@=l8v<1{%4Nu>MLG8i<2@_>x_wWF=O1$JKLs(#tU0{+X-) zL=e7A@(Ryq;t&%Ps{v3>kG_xK+u46%zHCF7MaCpq;`ZvtvjGq#)5+1Wt@rkAlT&^Q zG+KXlo(pU8$T-lU^CRsn#GVGUp6xPXET>;Ao|$+|N$>REBE>FOB;`puZV1Ps+v^Z# zc5_LE>Lz@DCEzD`f^yy#Zbb^RdhkO!oFu=3jJ+%wUHR|2=!^RQSZ{{114{|ylM(Cr z(T1{+jJU7@{nkA^^te-NCSq8dIh^jSAI&Nj7OjTTitsqz{+F+(GOH|fN?&fugLwGw z!5&y=by_sm;bi%^jv%x1f*R362NF@QD=BvKm0PzXS1z)Qs?V(M+&3%o>dGLXje2`_ zCEvj>^u2aUSbCzXY5%8l_1EE^0mFfsE-kCef_UAJx7-%;+xA<4=9baf6)oNxgeVrR zj8}J(vn03EpBDhHDNQSL8D}V@rn=UuO!~Vih`0cMJx9XZA2!7^%-us2y9_qqA$anyxzEH8E^kqp zSQ{t$yfTB`JQi8~jir1PnN(lf(dDCgcKF2p^2?er2b;pa*HF+;1v%Qh0j*Dv!VbHA zTNMW)6MwGk!+beQgw|=vK|(L>WudJ3PO+BHb8>ms^Ht-}eQavG$?LZHLtVPEy7q$d z%o;!Md_hPG9h9}dQCC5_^16UT_*S#wky?7ExDMp7bN8Lp_47#>z`4!>(gICdCo=-}dXeRAs| zsp3N4h$-y>^JbG;8j^9er2F94sN-!wE+n^8{LBnY%psk`jNFJeu{pDrz3AY-LULX$ ze{v+5Jx2y8;aA)ivcF(zT$%eQ;6Zlq@SvVKzupLD*;H8q3m1_#9*j@cz-7@&G~MA#YE^3+hN{ z8p@6Gvpgu@T7o}yO>%2t`bo?gU*f)pMHZt++uWT) zwJ71~`tLCEe=bytt_V>OYHuys00Xbtmc9JxiR`7_W5`Dn*!hOMY7+vuGNH+*{rrLJ z)>$0v$C+=ZK2JrUFu3BRTZ;kMKrtgj$66|OLl}SYfo>`jTY1akEjzn8$=%zH^p)fL zOjRwyVOUY^%Y-TZ4KvcKfrD$<{*gP>zcm8I0I*UEJN5pUnP$l?jM^qu<;N{cA(XCK zoUcDn^mdD%RI?&OeOnw3F4OY-&G;`u_7_JBM0+rsMse>jz};!r1IWqip@w*-mg5Fr zoc%gIb~!wo0Xc#0eZNzfD{IQJA1fOJnCYB815hUUsN4~U_)5^?nG&S zv!;#LUdLf>m{#kFMzVL$0E&;m@Uq&n5jTDkG{cxmqvikM!Nv>kD69kphI$j=flcTk zQBv%~5d2Ifkml}R18gRUHdG0ZPio#=)6TE{y()C4bSWG3&FZg+AKg9BA+X8pBo1-K zQKcfMc`3Lco81vCwR`rHkmXP179r;ypKM~A7PTcApBp?SM!Q>z)GS2WSE zJ*@$GqYWd&B@M36XtJ?n1JLkh(-T^DHUB{sYuDMSi2?o`?~x@>yYZ=<@#=Qp$kYJ$ z{_yr3e}q{drc82&yj-fFlFhG3_ozE2V2v1FIT2CfTUp(PNUH{XxKfn z=YuAFgZU9Y5N@#8kpf#ndj6`*_3nKyF#j8uY=GHFe+hJjdB#LSORnUeJ@FMaM%52= zKS*tq@1D*ZaAiNor`O9Zg7skN>1zYcI4?q!?vr8(ouufop4E5U5Q|8RLfd>&-*5V|H=LNx3aQ6n$Fdq)6YVib`#&s%^&G(L}Z$pCg%mZyQOpBHS=CV7ZItcs94 z|HKQADv#w0HBt<`lNLRk-NNWboT?gciI;ZY>PqCKu34D_R&BeA5V7eyD0KWL28P&pOo0nF4d=F3~SZ%r}=xGna?RLP5RWai%D+L0idS&#~ zety*;o$CzxbUHGV&KMU+39A?jQSUHUB>2nK{k{idyf~;L^EK~w^2KNWsqn0d>=ij@ zG+lfC8w3MP|2APP+6|d+bH>t)jH|&u?8D=hrUT;VZcjD))&QGI1U3X@F^5eg0;t}` zbCBXIFT}ne^7^Ys65(>uLPpZVj>eRCnj8c|*I8TCPw;@u6VgDii`c1vI-o>JTBd)~ zk+wQ3fr1MNRB$qkz}zW@H+boQ{mldnB~`8U>Q;pbPDRib2pP^nZ^)o9IQ|g+CqG*5 zU#%18MZ*6F)2^zk1?5I|%kR`}^(eS%{a)P>gheTwg#4%&{ntAAWFUVIUA>6SE`=cN z2P)Q5-*)ER3f4a02}@f7D(1R~2GLLEhuOID$a|AX-Y40^wG> z#aK5+b7tUUo>EiQ5QBF*z?F!}F~_NzTMiopxM>G3I6Gr_C9tK%2P)?G@qV`B27#sG zna1Fq!fb=tu}GDGq26zivOx*sH}rJ*cMCNu;kL>&!? zrw;r5ohG@To*2xVu|8!|*(mn?coDjYCh5UbJV?5QMlOBW<_%QT;qA648JlE&pHA)K zb?@Rxy4_nqYr2B6QVs~kiq8Bj(Jm!5QX94-DUI>9!-G&(?8v#SiXJE z@FNY=g_l>7TmDgzAuUVR^fJ~PnO)CC9|mqP`{A}jCDdgAF9SdhYby*U+W_`~^9QgE z_sf&AVo00*F!vD#a@Hli4MY#%Fohr4Yx?oeKx&Ph>}U1Ba1XDvD`5+Q{w%(40^bH| z19kARU0Ml}F2^;5pr>S?`kFpCikDg{vM6>gGe%#{od9)3;-1=VYVWl2`2)ySz}#yo z`ynBA7rzEN4{kMym)GV`j?@Tw z$jb?EvLm%0ZS`m}@2?^-Dk!zD;yt)(CNf5pEh9%eD0TVxv$GBnw$rz?xQ zc)MaW8-T636Z6OnuU2$^36;}XZ~8;6r;okxB4=5PaQC5!_{H5Tr8w6=oCokC?2LPM zOT}Kdc}GF{r?ISb`sJ%R&5ebwqXFfo71-=IAzct)XRHVcW)5|mqJl_dFIhCgO0GGV z;M)K-(RB-x$Vxb9OC(}h_|ULVQMZ*Yo&E?Bgr^3-tx>L1By{iTyYC{8c7nFav8}Dy z{mzcXlybaJ174ZM+!EA0CGDNE*(D+iT(4Pnq<7X#hkKe?i*n9xe*q1@J4 zd8aPwzM}H8EAzP??w|4Bs)IR=>0OkqLri zuX)}EGAX42g_{N*%UfMSVy=^S=---U4HEC_MzmlPGB#?a##2lcSC7?#{$jN7eqJXl zTqI=i5ffm%vQXKHjTRO3$GOR$$5&pl$BdhE>N}&p7h!cbv?$!!tFDIK5Lzy{WQ}4OFK31?>^U!;B2_tAsJq4!P+H%=}ibL=DCZBpt^z3jd zwIQrmgU7}Sd8U6nX1LGaQUwC$Y_#)N;ohCX9gohbQWo(`5qwQTE|Y5$CJKrbWW3El zcRIYeVEO66CHH8~lECN7(7y;nZM#R>=_1z?{=$ z>qz@CmBWYF`K`x8Dz3Z%edc7FTY^SWYTv(ZB)J7J^lJpLh}G~T7P8YWXb@5h@sTX) z?(lhK(9v*UKzwaP#>qg6w7W&2x8ku`9!&dz`Ov#KNk~^)_oq(o-O0zuDd~!qj|l?o ziPyj0N(>p4T|cjfvfe(7OUP#Ta>j7xW$COyNLv%1;9R&49};35i(e8P!x!Zl# z-fM#d%nSrI1^Zn#cH$cMVLLTAf_nj0N*IO6)BnEZY%oe5Bw^v0>Q`%OoAQ$Vpy5um z0IquJHwEI1yMckla_z-shiO*IAm8`Hd}Hk1VTUjpYmKM=N+5I+cNrl5C>`Y4Zf((S zw5+EWok!$?_c1VXqxLap6BKVLC^bb=|?%Uf~J4lX4MW~(|gAPy?Qd?C#BCmBqBP9z8r z(~*7Z?M}eG0SLsrpP+F%A^f)|%`5C;o*qUN_8$iH1Wp--%Xiz(8efklNP(~#>~*!>N7C`=}3-8pmCVO13dC;aco9BaowC?(w*jtH};i!hOez_uslLiJLA)w z<;3PN$L5hP^+b4M!V#A<3osd|OAmkAGJL_gmY|ox<8jd|3~6Mv5pU&c-TVl7I7`&s zl=B9`f9#tgoi?1_e@c6OyGGkbKiT^>cgspze%Nqm*Us=dw%qVy*tIaLrgaziqXi>9 zC)9q!`=`3Gx%WoM~4`bkXX_1HTPQ@ zvAFfFPw~nbhX>`4*r`2x&Za6cRZixB=_r&?~h^m;Z4AGo3NB0NG*?yjc;LyHnm@;;^^11+LYn`dR8{u#_bHIb zP2WkZgfXtdX9c2# zmJw()Lo@=LDv{m7K?Y^i_H^;}K!N2j7P-6M90lg|H4Q84NYWud|wwaO5Q10mENH9FOG1<5&brc~^+tgmfdRWtT6rfm$ltxO;H^tp)-1hi6VP5#?#swYLugsS^>EYkM-{QI5Xfv2m{u4$ zE|-nYjTJ!cG7>Gu&YqHWNXA6ah3lUmrI6=W+TNWuO!)=naExY z(0K-DIzl^DIPo}~?r&c~tT)wwDRN>!#JHwgnWVk2@0{Z?h@MqLBtl} zI5@CY#uIXo-P=M6UKo#s&taz}Bn~QoZkq%lX#x}LfGQJDGstp4V>mlP;x6|&(A0K;i5U`>wmbNZV{c}L55-X?F#7T2$oSixp*Jr;&q=f=yLp~` zsjyQnMnh{rg|V8^n$z-$tU1IBuZQ-ueOJ}Dz_97#nKf@w(_@Rzf7$aUW@H~CO0I;y zu}uzU9&nJf>WB76gl1TozyQn2X-7A`qh%WcOlCR*s^O%);oE38thPWcbb6>+Z>0kQ-2s_b(M+QI%DvuT3zu*y}y!qt= z3qD^4N#W#wkPNU@>h)%~H2hlgj2gkIG~xn7ab&grZ-&7eW!VdmAs@os@~vD)B~bh! znCTO?a@c)g!yG5b8{nF*6MX1g6EL-hHIP7$GDz-3*8zvQbW-9eBQ2URpNvSc*PmDd z*Hm^Dl1jhmfcPy}YuBcayqT`skn<~{JvyNAANil~FrI31`C_k}Pven%nl#(QC&hU0kGc7WYt<~|{;{ehpm_$t>K zgnas_zAJ3N3&woTrA{6T`++Q&No>o~66M&l`cdWIa&VVQ&*B)+_cG#){L}F!p>eSM zTI}szg?{Sb*~nk}(RD)qJwDMgAuDb>))&vPZ~?}Q>=OFu8=J52IFfCtBGtT;h4lXz zWmr2PMC45u8DJ&MBu0UUGWxG|S73{%_ZPXE>-}a4gsoHo|B9%yOA0p#TU)}bFswor&f$aGGTN~{=(`3tS%!0&%%ZRTp2vRuQ9+4h${lya<3HZBXYYNJ zSf9v0u;_&?M65nm^(Ug5Tw?0M2*?YcnR<&ZU;D4;i+L|O+oKSGeC&&ulp9jb=PZ{A z!~CGN1^uO2P`ae!!Uh0c^E4G6Pr}!XgRPI-%Y2?qF0DIv^}*$U9WF#|_weaI>y#2i zU2MZJJzzXgQ$b&Xpa4FN$W_~S>fE7FTrtrP4pF=pi6>=Dn4b$6QJafYPzz3$bI{C& zi|ro4Ab?4PcLGTnc{;P+P3mIz@!lo|mzf@%T zHFN>={N)h9c*Gti-}TEfY$E;{o4KlGgRW)DYqFWEJ&E{|n|^kzMvw!7t`ZsX^Cu>M zRmuOHW(s0Aoh_p?AR5fb2@#vnm5QVuAcL1bp2zq~ErCN`(p=w~w_LFOY0HR4wUl2G zxO~AC)NydT2ub* zqN|KLS{rJ9lsHDQjGaTfHzTQicD3GNRG3n{=H7V6>I$qZCtBpLbG8es21TH#0h$!w zxkYd+>NWDh-PL+ZJnw+=zDhO;Mf*}&yNaS;hYT{ig_&M68!n`O8@RVaU|a?f)kY6tmRTmn zkuM-zb@gujdqE>d6HMOxdCkIR49X+!@3mo8^s^k-Cerr;kB>>KG{~G2bek{}pq-&9 zF{%}HX~^wIq^+54ML=QZgsI%3UJppkk}vbnRpf}^*`+SxRRI+F^#HYQ`UG-#@^>i) zMuKnQGImJ9V27f{2jQ5G)ZUPWSJO=xSPq0wEML6P=NB2fd$Id3N~44uP^g78{nEmk zogAa7l}-Kl8&`($x#gygkP&ALSkkWwoAu%|EV_mAD+AuAcBi(zlj|mj^dGYzY+HIp z6uS@Tla*+bpk$qL<%053Zv#n851x9&T?%-dIm7*>AhW!^fBAQ1wKi~<(Lh&&JPj56 zZ|OD4yQ}ND{l$PrNGQ&wP7_!O7|~k75ceasy!k^SxP-OHa;=Viy{s;La3V<<_bR-y zR-n+Vn*ry)g>UT8?7qmLLnjbO{DOb^9LXD+-~T&V~>jEdZf5ljo51tD*ux1oo<15Jd{MKDs#T0uE|7Ov_SP>%Q8jimL>1i2Zbfvs-q zf%E5l4p1Rx%YHYeM=?E2bN)v~9DBGZ`z%xy`p0I-D-{gFl@{c!UjH@5;@asH?*!hy z_LLxIzAhTGUILfk6pxiSTX#iu|M7B569AP2QPb{qYRtjMle)I$c6nQ8M`OHo6_DJr z0}<)u{b0t2*C6)wSDdVdM|&|LVs8n84sxEsbidsX^+el-Brw}1<%h(zVPw2C>W+?9 z2Bjq-sl!tYqPtG0=gS}8Y&?p7Q2L-o@mA}c%^jU)M>sVIDy#SwY^BJ0ijc^oYzi0x zrsBxl5mNvn;cb@89ZU3NyvDPI@CGDhw}`B$$eL%+!ZV7X`$-6=@qNCi3qNL_VmGg@ zD}-P1N=QKBd6cJu=y>ZqZ#N{@ukB2?z_#P2R$gXcOv6yk?+<-w@N8)79zGw>{~J9_ z^%4C!ZkT1}%;UTA!>_W`OMD(86nO848QSpbv>)*i2Jo=b^z`}==zP_*j|UlotHjn_ zbRV)Dc~der4Wntx?>OAT5Td#iMCNk|TcpWAIl-PIHd#om6i~*j0%`x{x2|T=5xDnq zdiNrZ24Lzvpv{1CRSG#I`ah)ZmKUSc&J+0-GZqWw7OmV8T=DiUQSg3^u`|BT`dYj8 zf@Mir{kmx<(tRjw0~~k{R35)GzxMN+UjfHn0?IE}mZ?$+D54qq--=%ED34n|cILbu z{m>xO{l|R%TNY8P8ryl@god?-faub<1CKCPW#9jIp zq(3ympp<}!jhsIFdK#aPTv1^K)E|_QB3Oat+rih_{vQh}c{}dS0NLa% zXF$>Nu64)pA-s|PwK3HQ`&^-uF_R(Q_JcaxP~7xE>7S3zcS0ZzJaXrGe8%4IvlQg{ zVA&h;yfrCa$1;-97#6s2#*8xNLA+H6N$5sK@(B?NnlmoXElqJJ@He;bV0z7%k-KDy z5e346l{nq|qkPWWD%;)`&(Za#u2gs%RhkK_FUoImyserU7Qg2e#c%+goG2&@uN&ek zvoO_RDwwj9oqkUNrJ~GTSN-{v^g&Lum7%ozy}g(<(D&jnY#S=h96f*X#`s4~>j?g^ zu|gft_|-`WSW(^>YO3?q@e>z>xVlZ9YOg1Okwp9)az*$~@J2W?7B&GkMB*k<^mlj3 zZne$^jlg22b`$;q-GF-{3`BdgplT{5&We-XBpcD35bnlp{%WMwj7q68;ot)9;Ipm143ZGunju}WDMUq*y#7$M8;;__|U(A6D$K!RXukZd%Q zp+BVFLn6n5)JuMRt92u66bItTVBn>{L?MQkR(Ti>RocX zH_i@a^=HR==x68kpSno?sekXgmpjSNA4RL-Bp_Yf2;2 zk_t6CLw&zK6+Ey$O(STGtCA&K1&25r|k0Jk4T13do*1 zIi7JU#Ks3qDm>t~O#?vwL|en~^BE0+vBEE5&FgFk3yfMvo`8pIq&C!)=n<7$KP|jw z!`TCKmDOTmV4|~Pf^w_3ops;p5X^d$>1%hIv`+K&MRfH8`H)t2YQrr8ppzU7b~shE zfdi=qLZ9kYoirGa>c6^rWUQwb_=b&AfV9HGPu}q)*wl&g;Jlqu&E45SU~_~m$DJuQeuH7AddZfQN%G)O(w~JGo1$tq>AqD6 zRvFC_JkO4()WR84)-T~xkrIZEAKpD7)441f5C#uKWw(ryWSw=Di9&uMMIDgup*SD0 zl4Xb|XQe1MERW6mT<^DhCetO$@M8V+PUr#~fV$Ut!`FL`c>%&jC5cuKmRg!&-nfJQ zQp3p4bM>xquNG-ZXIs?@oPi^4$}xHX{hsD2w$!0S8TKUq2YcgmA31y@YE! zD((K)%NQ4n%2!50C>p+|FbDL~&i9{xZ3EYKDt+t3jH>SF6w@`j$!0Boni#b!v<)3& zyuQVMk?=QI#z%cTuSGE^Jzj_w5(J)5o%kgTJ}j$^}Eu<{d}^3U`at^OS7daV0$`FFWAX zTKGy9UbKt{rcGeoHR<^YqMw|m;N;gEk^TgVq;95Xgk>qd+!2%YSH>5KeO?Rv%mv2@xX^-vbJ~aoc0L*Aj)1Yo+qY~cG24P zX?zmvqsITj3VYbewbZ}J7A+2X^XQK!kyjC6d)zp^;GsCI(=Vi3Knv+GZjj%4R?GX_ zE?RDn2Nf>}xL-Uv?7MXn^|k)q25~qgXH1&|MnTa*OJAMd*~iX#a>3eN<_Pt^i@30! z#Spf0tk?wl&zhm`rP*A&rL%3+pLNXRB%G9{Ac4@>Ku~&syYsB+4_(Sfm@ijP)+IJ4 zt*#eHVq7z#pGOA@?kxy^oIWDIFSMIcad2E@jGtmYMeWP~m=(!03`iFK!ZJ`??w<8} z5v(mZE17xyk^H@miNB)O{Cp_jPfRHC+oi*^!ngAyUE0?JFmG*&zZ@75> z>Exd{T1@VjGp@CK;g*^sKk&7chU zw;}2*%dZ74fD+7{0JwD7y6WE~K?1XOLAh2R26$&%4Ee~&VyR#qIC;o*MRdzA6LKnreMP;8|#|EtJXernCmjMTKwhP-a z9&`_3i=59dCEhv#7!9};-cdXQxLqf(U-qTE&4$viv3Gd`!`{iK(=A6wa+?NE=9gkh zrd`RtQ%)Pw-a#y1OzDwua-`V4Ec(E?998EW6I}RxVJx#;Nd+l2$UX9|)5M?&STh;TH4^j+!5Q zNE!%0Yl@;WKGPq_9(_>ipF|}}Gfd$k+TC{-7x)syx@Ui+k{WJ&qRl_b0WCV?6#@Ja zE6XgH3N)-hWslo=YVWtFoH#^R`hI1Qb8-zxO}xvVCp2L0)%2?Fb{TWhyz>jhn$4KY z2_GvsiLMjIY6y#5*wBBUOQS;60(t8XsE-s0n$(-I<*!gFYgZO%_jIjL%mO3Qi$fof z?-;(Yl;Z|XNwhNrRE@6NT>`uV%8 zbAh&jCm$IgB7y#@#k$ubc?|*xi}5~&I@Zfkdi2IZzWb_wzjFJs!TaC!CD76?3|xOK1~1<*$)t&5|*EE0>63@MQ1!C{fVKn>um{ZIO*K-!9J% zy+e;Dyp~Dg>+g|+?rj&*N||zmG%K=;yyvU|eODgqUyD>TfQ6+7h|*p6hOxUfk?+D& z8@20sU3mbGhvXtYOph$PTYr4tgy8MqPNNHp*gHiA7q_#sdmVhd z-v3=-{-MNl5`kYsHSXDU05`;NI>%Xgw(q4~e!tp!9J89t@F>D-n4fk398$l- zZj!!tHPw5pb-Adp@uCdkYIgHnDq}O4?3uQAo2-nj-bx5^#wmdc2WR z;k{AN0m8#qQ~EXygeDr zX!Q*C`M25B;Ff!-wMoI+zWsx-)5+JlMI5vu`c#EbT<(Jmji!zW2)Kvtw9kCuLIUi|X+6Knjfcjz<~ zioPTQl{B@z8t$nQXuQryJi_br6S;lNz`v=R7YwJpZu0=m1gtLHkW!-UD;Ameb7f-| zD5Kds6ff{;0<)iAdBKRKT@4wsrJfOo{5+iY8alW)25k*;gfYgI3{#eTdX|V?K1srt zl@nCrhpsN%BoiWwz2Cp9z31%H4M0L&p^8*gaV&bzj-r)7#EClUe3zQVT)I^Txdf2F zOjvi#8=__Jf0aX94-ilNMwUvyVT7P!7@~Z3>P}feYGz2TOfj3>>$mtT-D5bc^;hY_ z9DLA*Ss4;yJn@^Ex^E=YFG)L|^|aT{yaFr2VQ|% zZ{m@NpYZLL##p)$9_WwHLrva=A$|X=Nstq#71^yfp(fdj`g-rm_J%pxNDm*H2O*tj zquAv_+s`GEK(psGo!(y9As_qM#7_@@C%=!uSd_ zJM^Ay!5d#}g7amQ+7>Im(pMGEqLcj(5sKyDtH%_ryUx>2RaXy){GQfDf$rTPomb*L z=+z~3S7>JL=`@jDD-Xn@q4FB8m{$E(P^|T%1`;8 zW(aue$jHnu>TS3{?)k3NJ+;FbU2tv3`8E=ERA`YsNh}Ti9}7U+%4f1eI){N~Y$d(o zow~7w-u1VW14_4sycJ1@x_WQC9S2U4FWl>rR_;{pgdOk z5BkxPqMKf)`+AlNDR0puXaoOA&)esmV_Mhq|2_1yr{mdM1;^PxKByA{j_06b_>5`C zaYW@9e+i!4v^ME2N*%;@aoy<5u9mM)t#J)thu^>dPd;hyYReL*1Z-D{Ae}${i`}}r z)5&=$cBFWZP=C5*N*5rl3vcpy_s5!N&MU&KL99jeMXM_OefT<^&hOa2%{~e&6_sLP z+}lccA?NPDwPPm7K&MdX3PW?moodWAiXFe$_m7YYxrsj=s_9>+DF?=fOF|%F($*C} z1sN@p4VPDo?39O&j{X%=?DO%+8phahFGJ;`z-A>-j?x%pa{DTdV>fjNHg0Kh2y8?O zNaB9w3ND;4T)XFMsbAiC52U1Hi4aP#SkqdmxY<9|zbo zr!mAQ8i9OxS~+7MJya0~TT%ky8er2pFS}*Z17dtH?6VGfJrM;G#@Be9rw7BNrOM^Hb*n zqLy&?%|Nn@+mOxRa-Br#e6gWm6m=eMwFTF2K((|t?Cr+Rn535*RvXqR8#0ILE2Uny z2v5r9=$oS6?{j4tab8~a*0DNAxxam${G3Sv-s)wdbMTR+-r#*))pE z;3H4*0zt|7O8l`;1awB&jtuY3Bj>8ReuP5!xPRa~inQFWOp3n1{@u8(K?$uQZfyre zyQnH5;zZPus6D7i*_fz8LA&7>Fxz$eUCiWB!?IL;PnjB?TMNS^H`3xEqtoY)PKWbX zXG69KCg=Uu2?1|xoIG^?L?r?$;&Ya7vNuai;^Ax*8P5rxr&ndMFO^$8o5H{kw zkwNiEs}P~9k)a?wlzA%&&1*bzh4;p1eQoRfCH}o1A2sfCg@!4D0f+cCcRu2lT8K7T z&(()^6~=Avw^0x6xK~VF$o^(1TP{ioKRqcm&3Mnm?X&WH^K|oK{cQb$(cHS}TD|8(>1%nS)94Y zwq@oYZnBk0v@%g+3f=TMaBqMT+^;@s*?*A^7n)F%BWY*-N_dE8Y=f;jGa2HBYn>E(Ens+pBlpMv=rRd`boRE1%@{G~>~Y8w>PeavLdBe7G-H_Lap)>JGoyZnG8A*R=eys3zrTO~Jb(QD`(B^> zzOU>4-uHFg*M0cB-tSfehqKP#rPo0iGxRv_f~J97P3h6FI{9bt3d!LCka~fr!!fd< zzt7hE^WB-VZ=z!mdA%jq`>#R^2B4r0N#Bd28M}l)6}xR3FZL~di#J#?@oA7B5?ESx z=b_r}2(O!1tA9EDM-YEyqY#$_jZJl_*}7%Xy6 zD;a8GH}Q@sjYPVX_U8quIN6jJh}k$N_(^<=4xVVnttDkytxtEGQ({C)1Rb3~=FpWW zg>E&n&gD5>by8-sIGVvROC!tZY;Eq`gc`Y!6&j8Q1-9MkR-L}x_4U3rr-lB<9lYz+ zmX?du)2PGjA*QZEW6h*%2;a!)?(_mplk@r5N=G5q1g7gYfHzToUDDXVz5aN~vc1*c zVw?>K9dw$TkD1fzX-3PaD}KMLM{E>280$wYV4hpk1?N`s@h9G##{z_Tpw#fllbFrd{2ZswWA*tFxpe2yWepuLlh0omi?klyU1Ia4)*MhMyruFN zh|HmQkXtsFDqAzjsFPh?^2>3FSu7(^hOxqF?-@Dic|fLooA0k|XfH3ybTCRxw|Li$VDaH8q9DgefRwt%>XXm zOV7j^$*~ZVx@U007lX1|Ww^?FhV`m;O$I|Te#cq9uG@tM?a&6T^UDfYN^+&#_mfJIUR>O< zmR0mqhI4*&toLA?11S3&bm#t!@pJqirm696N5P1DieFodiX9<(HyXIQW5f7eEBjgLz$&GVev6izQ=343UrK*UsuAt$q8# z23nj<-_6tb`lwCT+Y_=XdT0-`h5EWE15ZLd1r)Y7Djj5x%F0U!sz>BT=hgDohs2H6 zG0s&Q9S;cX#Qexxepf7Y+iW*{MCrF)H+hy%nmtn$z;ipB!V&v?<`gI<;5HuguaXYZ z_o2g;7o3`grPTNz_f&;zv|Gj75TGYyO} z@JfXc1ih`7c_fB^>85&f)wjwXh_6mMSr50!k0C}P1UK0|VdiOmll{wtCW%hP;hib8 zA+z92gVR*E-u2kBR2XTGFlRetSC`AKy@O&CQljdRqDORJw+#WEKZG z+8m$Z*j};k@jAG97GVov4G50|dvvY!4wS2%!@9fa=SaHWiFitvGfIR}#e}DH=92?_ z+~tpTFWO@xbwSgyclpI#l}lm{5Ea{-t)aK=hMvv^z%3KJla*(=0!>?;_&{c!B5`x9%SfqE zS++}{WtylQwKP74MwwIQN5ltPfn<(73h{x@EzJc=*8lygc%3SJ#w$Tre`LsRMH9=0oCmFhm11#N77Jiu-k?ly3e@dRq=V z(FkWZUf1qQPV?WHgC`OyLl!O|<+xHvm!pF4O~A7vX_2e7#r9Mb-6@~cbplaELgH3p z?u?q1$EDss|4@gIX~u#7UkcY4-oRD4>lG{fR+nzlLqaZp zG#GPTJ?wBznXo^_tw!7LUrebv$U1*o$ytQ7mNt7`R{ykAXdG!ferx}Ub)4~w1I$%s ze{f1tk*|1lz#pssLG{FKvDyHhZVOQndecBy_w7V&AmY_RitqnL|M<~}a3sD3fj|^z udt0}E>f8z7Ko121j~S { + e.waitUntil( + caches.open(CACHE_NAME).then((cache) => cache.addAll(STATIC_ASSETS)) + ); + self.skipWaiting(); +}); + +// Activate: clean old caches +self.addEventListener('activate', (e) => { + e.waitUntil( + caches.keys().then((keys) => + Promise.all(keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k))) + ) + ); + self.clients.claim(); +}); + +// Fetch: network-first for API, cache-first for assets +self.addEventListener('fetch', (e) => { + const url = new URL(e.request.url); + + // API calls: network only + if (url.pathname.startsWith('/api/') || url.pathname.startsWith('/ws')) { + return; + } + + // Assets with hash in filename: cache-first (immutable) + if (url.pathname.startsWith('/assets/') && url.pathname.match(/\-[a-zA-Z0-9_-]{8}\./)) { + e.respondWith( + caches.match(e.request).then((cached) => { + if (cached) return cached; + return fetch(e.request).then((resp) => { + if (resp.ok) { + const clone = resp.clone(); + caches.open(CACHE_NAME).then((cache) => cache.put(e.request, clone)); + } + return resp; + }); + }) + ); + return; + } + + // HTML: network-first, fallback to cache + e.respondWith( + fetch(e.request) + .then((resp) => { + if (resp.ok) { + const clone = resp.clone(); + caches.open(CACHE_NAME).then((cache) => cache.put(e.request, clone)); + } + return resp; + }) + .catch(() => caches.match(e.request)) + ); +}); diff --git a/memory-viewer/scripts/build-docker.sh b/memory-viewer/scripts/build-docker.sh new file mode 100755 index 0000000..c33704c --- /dev/null +++ b/memory-viewer/scripts/build-docker.sh @@ -0,0 +1,59 @@ +#!/bin/bash +set -e + +# Docker Image Build Script for Memory Viewer +# Usage: ./scripts/build-docker.sh [tag] + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + +# Default values +REGISTRY="${DOCKER_REGISTRY:-ghcr.io}" +IMAGE_NAME="${DOCKER_IMAGE_NAME:-silicondawn/memory-viewer}" +TAG="${1:-latest}" +FULL_IMAGE="$REGISTRY/$IMAGE_NAME:$TAG" + +echo "🐳 Building Memory Viewer Docker Image" +echo "======================================" +echo "Registry: $REGISTRY" +echo "Image: $IMAGE_NAME" +echo "Tag: $TAG" +echo "Full: $FULL_IMAGE" +echo "" + +# Navigate to project root +cd "$PROJECT_ROOT" + +# Build the image +echo "📦 Building Docker image..." +docker build -t "$FULL_IMAGE" . + +# Tag additional tags +if [ "$TAG" != "latest" ]; then + docker tag "$FULL_IMAGE" "$REGISTRY/$IMAGE_NAME:latest" + echo "🏷️ Tagged as latest" +fi + +echo "" +echo "✅ Build complete!" +echo "" + +# Push if requested +if [ "${PUSH:-false}" = "true" ]; then + echo "📤 Pushing to registry..." + docker push "$FULL_IMAGE" + if [ "$TAG" != "latest" ]; then + docker push "$REGISTRY/$IMAGE_NAME:latest" + fi + echo "✅ Push complete!" +else + echo "💡 To push the image, run: PUSH=true $0 $TAG" + echo " Or manually: docker push $FULL_IMAGE" +fi + +echo "" +echo "🚀 To run the container:" +echo " docker run -d -p 8901:8901 -v ~/.openclaw/workspace:/app/workspace:ro $FULL_IMAGE" +echo "" +echo " Or use docker-compose:" +echo " docker-compose up -d" diff --git a/memory-viewer/server-dist/api.test.js b/memory-viewer/server-dist/api.test.js new file mode 100644 index 0000000..25eadb1 --- /dev/null +++ b/memory-viewer/server-dist/api.test.js @@ -0,0 +1,41 @@ +import { describe, it, expect } from 'vitest'; +import { app } from './index.js'; +describe('Server API', () => { + it('GET /api/info returns bot info', async () => { + // Note: This relies on actual file system unless mocked. + // Ideally we mock fs, but for integration test on CI it's fine. + const res = await app.request('/api/info'); + expect(res.status).toBe(200); + const data = await res.json(); + expect(data).toHaveProperty('version'); + }); + it('GET /api/agent/status returns structure', async () => { + const res = await app.request('/api/agent/status'); + expect(res.status).toBe(200); + const data = await res.json(); + expect(data).toHaveProperty('config'); + expect(data).toHaveProperty('gateway'); + }); +}); +describe('Backlinks API', () => { + // These tests rely on the actual WORKSPACE directory (~/clawd by default) + // They test the API structure and basic behavior + it('GET /api/resolve-wikilink returns 400 without link', async () => { + const res = await app.request('/api/resolve-wikilink'); + expect(res.status).toBe(400); + }); + it('GET /api/resolve-wikilink resolves existing file', async () => { + // MEMORY.md should exist in the workspace + const res = await app.request('/api/resolve-wikilink?link=MEMORY'); + expect(res.status).toBe(200); + const data = await res.json(); + expect(data).toHaveProperty('found'); + expect(data).toHaveProperty('path'); + }); + it('GET /api/resolve-wikilink returns not found for nonexistent', async () => { + const res = await app.request('/api/resolve-wikilink?link=nonexistent-file-that-does-not-exist-12345'); + expect(res.status).toBe(200); + const data = await res.json(); + expect(data.found).toBe(false); + }); +}); diff --git a/memory-viewer/server-dist/index.js b/memory-viewer/server-dist/index.js new file mode 100644 index 0000000..aa44f3e --- /dev/null +++ b/memory-viewer/server-dist/index.js @@ -0,0 +1,1134 @@ +/** + * Memory Viewer — API Server (Hono) + * + * Provides REST endpoints for browsing, reading, editing, and searching + * Markdown files, plus a WebSocket channel that pushes live file-change + * notifications to connected clients. + */ +import { Hono } from "hono"; +import { compress } from "hono/compress"; +import { cors } from "hono/cors"; +import { serveStatic } from "@hono/node-server/serve-static"; +import { createNodeWebSocket } from "@hono/node-ws"; +import { serve } from "@hono/node-server"; +import fs from "fs"; +import path from "path"; +import os from "os"; +import Database from "better-sqlite3"; +import { exec as execCallback } from "child_process"; +import util from "util"; +import { watch } from "chokidar"; +const exec = util.promisify(execCallback); +// --------------------------------------------------------------------------- +// Settings +// --------------------------------------------------------------------------- +const SETTINGS_DIR = path.join(os.homedir(), ".config", "memory-viewer"); +const SETTINGS_FILE = path.join(SETTINGS_DIR, "settings.json"); +const DEFAULT_SETTINGS = { + embedding: { enabled: false, apiUrl: "", apiKey: "", model: "" }, + pluginsDir: "", +}; +function loadSettings() { + try { + const raw = fs.readFileSync(SETTINGS_FILE, "utf-8"); + return { ...DEFAULT_SETTINGS, ...JSON.parse(raw) }; + } + catch { + return { ...DEFAULT_SETTINGS }; + } +} +function saveSettings(s) { + fs.mkdirSync(SETTINGS_DIR, { recursive: true }); + fs.writeFileSync(SETTINGS_FILE, JSON.stringify(s, null, 2)); +} +let appSettings = loadSettings(); +// --------------------------------------------------------------------------- +// Config +// --------------------------------------------------------------------------- +const PORT = Number(process.env.PORT) || 3001; +const DEFAULT_WORKSPACE = process.env.WORKSPACE_DIR || path.join(os.homedir(), "clawd"); +const STATIC_DIR = process.env.STATIC_DIR || path.join(import.meta.dirname, "..", "dist"); +const app = new Hono(); +export { app }; // Export for testing +const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app }); +app.use("*", compress()); +app.use("*", cors({ origin: "*" })); +// --------------------------------------------------------------------------- +// Agent Management +// --------------------------------------------------------------------------- +const OPENCLAW_CONFIG_PATH = path.join(os.homedir(), ".openclaw", "openclaw.json"); +function loadOpenClawConfig() { + try { + if (fs.existsSync(OPENCLAW_CONFIG_PATH)) { + const raw = fs.readFileSync(OPENCLAW_CONFIG_PATH, "utf-8"); + return JSON.parse(raw); + } + } + catch (e) { + console.error("Failed to load OpenClaw config:", e); + } + return null; +} +function getAgentWorkspace(agentConfig, defaults) { + // Priority: workspace > agentDir > defaults.workspace > DEFAULT_WORKSPACE + if (agentConfig.workspace) { + return agentConfig.workspace; + } + if (agentConfig.agentDir) { + return agentConfig.agentDir; + } + if (defaults.workspace) { + return defaults.workspace; + } + return DEFAULT_WORKSPACE; +} +function getAgents() { + const config = loadOpenClawConfig(); + if (!config?.agents?.list) { + // Return default agent if no config + return [{ + id: "default", + name: "Default Agent", + workspace: DEFAULT_WORKSPACE, + emoji: "🤖", + }]; + } + const defaults = config.agents.defaults || {}; + return config.agents.list.map((agent) => ({ + id: agent.id, + name: agent.name || agent.id, + workspace: getAgentWorkspace(agent, defaults), + emoji: agent.identity?.emoji || "🤖", + skills: agent.skills || undefined, + })); +} +function getAgentById(agentId) { + const agents = getAgents(); + return agents.find((a) => a.id === agentId) || null; +} +// Get workspace for a given agent ID +function getWorkspaceForAgent(agentId) { + if (!agentId || agentId === "default") { + // Try to find "default" agent in config, otherwise use default workspace + const agent = getAgentById("default"); + if (agent) + return agent.workspace; + return DEFAULT_WORKSPACE; + } + const agent = getAgentById(agentId); + if (agent) + return agent.workspace; + // Fallback to default workspace if agent not found + return DEFAULT_WORKSPACE; +} +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- +function safePath(filePath, workspace) { + if (!filePath || filePath.includes("..") || !filePath.endsWith(".md")) + return null; + const full = path.resolve(workspace, filePath); + if (!full.startsWith(path.resolve(workspace))) + return null; + return full; +} +function scanDir(dir, prefix = "") { + const result = []; + let entries; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } + catch { + return result; + } + for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) { + if (entry.name.startsWith(".") || entry.name === "node_modules") + continue; + const relPath = prefix ? `${prefix}/${entry.name}` : entry.name; + if (entry.isDirectory()) { + const children = scanDir(path.join(dir, entry.name), relPath); + if (children.length > 0) { + result.push({ name: entry.name, type: "dir", path: relPath, children }); + } + } + else if (entry.name.endsWith(".md")) { + result.push({ name: entry.name, type: "file", path: relPath }); + } + } + return result; +} +function collectMdFiles(dir, prefix = "") { + const files = []; + let entries; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } + catch { + return files; + } + for (const entry of entries) { + if (entry.name.startsWith(".") || entry.name === "node_modules") + continue; + const relPath = prefix ? `${prefix}/${entry.name}` : entry.name; + if (entry.isDirectory()) { + files.push(...collectMdFiles(path.join(dir, entry.name), relPath)); + } + else if (entry.name.endsWith(".md")) { + files.push(relPath); + } + } + return files; +} +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// REST API +// --------------------------------------------------------------------------- +// Get agent from query parameter +function getAgentFromQuery(c) { + const agentId = c.req.query("agent") || "default"; + const workspace = getWorkspaceForAgent(agentId); + return { agentId, workspace }; +} +// Agents API +app.get("/api/agents", (c) => { + return c.json(getAgents()); +}); +app.get("/api/skills", (c) => { + const { workspace } = getAgentFromQuery(c); + const skillsDir = path.join(workspace, "skills"); + const results = []; + let entries; + try { + entries = fs.readdirSync(skillsDir, { withFileTypes: true }); + } + catch { + return c.json([]); + } + for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) { + if (!entry.isDirectory() || entry.name.startsWith(".")) + continue; + const skillMd = path.join(skillsDir, entry.name, "SKILL.md"); + if (!fs.existsSync(skillMd)) + continue; + const content = fs.readFileSync(skillMd, "utf-8"); + let name = entry.name; + let description = ""; + const fmMatch = content.match(/^---\s*\n([\s\S]*?)\n---/); + if (fmMatch) { + const nameMatch = fmMatch[1].match(/^name:\s*(.+)/m); + const descMatch = fmMatch[1].match(/^description:\s*(.+)/m); + if (nameMatch) + name = nameMatch[1].trim().replace(/^["']|["']$/g, ""); + if (descMatch) + description = descMatch[1].trim().replace(/^["']|["']$/g, ""); + } + results.push({ id: entry.name, name, description, path: `skills/${entry.name}/SKILL.md` }); + } + return c.json(results); +}); +app.get("/api/files", (c) => { + const { workspace } = getAgentFromQuery(c); + return c.json(scanDir(workspace)); +}); +app.get("/api/file", (c) => { + const { workspace } = getAgentFromQuery(c); + const full = safePath(c.req.query("path"), workspace); + if (!full) + return c.json({ error: "Invalid path" }, 400); + if (!fs.existsSync(full)) + return c.json({ error: "Not found" }, 404); + const content = fs.readFileSync(full, "utf-8"); + const stat = fs.statSync(full); + return c.json({ content, mtime: stat.mtime, size: stat.size }); +}); +app.put("/api/file", async (c) => { + const { workspace } = getAgentFromQuery(c); + const { path: filePath, content, expectedMtime } = await c.req.json(); + const full = safePath(filePath, workspace); + if (!full) + return c.json({ error: "Invalid path" }, 400); + if (expectedMtime && fs.existsSync(full)) { + const currentMtime = fs.statSync(full).mtime.toISOString(); + if (currentMtime !== expectedMtime) { + const currentContent = fs.readFileSync(full, "utf-8"); + return c.json({ + error: "conflict", + message: "File was modified since you started editing", + serverMtime: currentMtime, + serverContent: currentContent, + }, 409); + } + } + fs.mkdirSync(path.dirname(full), { recursive: true }); + fs.writeFileSync(full, content, "utf-8"); + const stat = fs.statSync(full); + return c.json({ ok: true, mtime: stat.mtime }); +}); +app.get("/api/resolve-wikilink", (c) => { + const { workspace } = getAgentFromQuery(c); + const link = (c.req.query("link") || "").trim(); + if (!link) + return c.json({ error: "Missing link parameter" }, 400); + const allFiles = collectMdFiles(workspace); + // Try exact path match first + const exactPath = link.endsWith(".md") ? link : `${link}.md`; + if (allFiles.includes(exactPath)) { + return c.json({ found: true, path: exactPath }); + } + // Try case-insensitive exact path + const exactLower = exactPath.toLowerCase(); + const ciMatch = allFiles.find((f) => f.toLowerCase() === exactLower); + if (ciMatch) { + return c.json({ found: true, path: ciMatch }); + } + // Try filename-only match (fuzzy) + const linkLower = link.toLowerCase(); + const byName = allFiles.find((f) => { + const name = path.basename(f, ".md"); + return name.toLowerCase() === linkLower; + }); + if (byName) { + return c.json({ found: true, path: byName }); + } + return c.json({ found: false, path: null }); +}); +app.get("/api/search", (c) => { + const { workspace } = getAgentFromQuery(c); + const q = (c.req.query("q") || "").trim().toLowerCase(); + if (!q || q.length < 2) + return c.json([]); + const files = collectMdFiles(workspace); + const results = []; + for (const relPath of files) { + const full = path.join(workspace, relPath); + let content; + try { + content = fs.readFileSync(full, "utf-8"); + } + catch { + continue; + } + const lines = content.split("\n"); + const matches = []; + for (let i = 0; i < lines.length; i++) { + if (lines[i].toLowerCase().includes(q)) { + matches.push({ line: i + 1, text: lines[i].substring(0, 200) }); + if (matches.length >= 5) + break; + } + } + if (matches.length > 0) + results.push({ path: relPath, matches }); + if (results.length >= 50) + break; + } + return c.json(results); +}); +// QMD availability detection — cached at startup +let qmdAvailable = null; +let qmdHasVectors = false; +async function detectQmd() { + try { + const { stdout } = await exec(`export PATH="$HOME/.bun/bin:$PATH" && qmd status 2>/dev/null`, { timeout: 5000 }); + qmdAvailable = stdout.includes("Documents"); + qmdHasVectors = /Vectors:\s*[1-9]/.test(stdout); + console.log(`🔍 QMD: ${qmdAvailable ? "available" : "not found"}${qmdHasVectors ? " (vectors ready)" : ""}`); + } + catch { + qmdAvailable = false; + qmdHasVectors = false; + console.log("🔍 QMD: not installed"); + } +} +// Run detection on startup +detectQmd(); +// External plugins directory +const PLUGINS_DIR = appSettings.pluginsDir || process.env.PLUGINS_DIR || ""; +app.get("/api/plugins", (c) => { + if (!PLUGINS_DIR || !fs.existsSync(PLUGINS_DIR)) + return c.json([]); + try { + const plugins = []; + for (const dir of fs.readdirSync(PLUGINS_DIR, { withFileTypes: true })) { + if (!dir.isDirectory()) + continue; + const manifestPath = path.join(PLUGINS_DIR, dir.name, "plugin.json"); + if (fs.existsSync(manifestPath)) { + const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8")); + plugins.push({ id: manifest.id || dir.name, name: manifest.name || dir.name, entry: manifest.entry || "index.js" }); + } + } + return c.json(plugins); + } + catch { + return c.json([]); + } +}); +// Serve plugin files +app.get("/api/plugins/:id/*", (c) => { + if (!PLUGINS_DIR) + return c.text("No plugins dir", 404); + const pluginId = c.req.param("id"); + const filePath = c.req.path.replace(`/api/plugins/${pluginId}/`, ""); + const full = path.join(PLUGINS_DIR, pluginId, filePath); + if (!full.startsWith(path.join(PLUGINS_DIR, pluginId))) + return c.text("Forbidden", 403); + if (!fs.existsSync(full)) + return c.text("Not found", 404); + const content = fs.readFileSync(full, "utf-8"); + const ext = path.extname(full); + const ct = ext === ".js" ? "application/javascript" : ext === ".css" ? "text/css" : "text/plain"; + return c.text(content, 200, { "Content-Type": ct }); +}); +app.get("/api/capabilities", (c) => { + const embeddingReady = appSettings.embedding.enabled && !!appSettings.embedding.apiUrl && !!appSettings.embedding.apiKey; + return c.json({ + qmd: qmdAvailable === true, + qmdBm25: qmdAvailable === true, + qmdVector: qmdHasVectors || embeddingReady, + embeddingApi: embeddingReady, + }); +}); +// Settings API +app.get("/api/settings", (c) => { + return c.json({ + embedding: { + enabled: appSettings.embedding.enabled, + apiUrl: appSettings.embedding.apiUrl, + apiKeySet: !!appSettings.embedding.apiKey, + model: appSettings.embedding.model, + }, + }); +}); +app.put("/api/settings", async (c) => { + const body = await c.req.json(); + if (body.embedding) { + appSettings.embedding.enabled = body.embedding.enabled ?? appSettings.embedding.enabled; + appSettings.embedding.apiUrl = body.embedding.apiUrl ?? appSettings.embedding.apiUrl; + appSettings.embedding.model = body.embedding.model ?? appSettings.embedding.model; + if (body.embedding.apiKey) { + appSettings.embedding.apiKey = body.embedding.apiKey; + } + } + saveSettings(appSettings); + return c.json({ ok: true }); +}); +app.get("/api/settings/embedding-stats", (c) => { + const { workspace } = getAgentFromQuery(c); + try { + const db = getEmbeddingsDb(); + const model = appSettings.embedding.model || "text-embedding-3-small"; + const total = db.prepare("SELECT COUNT(*) as n FROM embeddings WHERE model = ?").get(model)?.n || 0; + const allFiles = collectMdFiles(workspace).length; + const dbSize = fs.existsSync(EMBEDDINGS_DB_PATH) ? fs.statSync(EMBEDDINGS_DB_PATH).size : 0; + return c.json({ + cachedFiles: total, + totalFiles: allFiles, + coverage: allFiles > 0 ? Math.round((total / allFiles) * 100) : 0, + dbSize, + model, + }); + } + catch { + return c.json({ cachedFiles: 0, totalFiles: 0, coverage: 0, dbSize: 0, model: "" }); + } +}); +app.post("/api/settings/test-embedding", async (c) => { + const { apiUrl, apiKey, model } = await c.req.json(); + const url = apiUrl || appSettings.embedding.apiUrl; + const key = apiKey || appSettings.embedding.apiKey; + const mdl = model || appSettings.embedding.model || "text-embedding-3-small"; + if (!url) + return c.json({ ok: false, message: "API URL is required" }); + try { + const resp = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + ...(key ? { Authorization: `Bearer ${key}` } : {}), + }, + body: JSON.stringify({ input: "test", model: mdl }), + signal: AbortSignal.timeout(10000), + }); + const data = await resp.json(); + if (data.data?.[0]?.embedding) { + const dim = data.data[0].embedding.length; + return c.json({ ok: true, message: `✅ ${dim}维向量` }); + } + return c.json({ ok: false, message: data.error?.message || "Unexpected response" }); + } + catch (e) { + return c.json({ ok: false, message: e.message || "Connection failed" }); + } +}); +function qmdUriToRelPath(uri) { + // qmd://clawd-memory/memory/survival.md → memory/survival.md + // qmd://clawd-root/MEMORY.md → MEMORY.md + // All collections index from workspace root, so just strip the qmd://collection/ prefix + const match = uri.match(/^qmd:\/\/[^/]+\/(.+)$/); + return match ? match[1] : uri; +} +// Embedding API helper +async function getEmbedding(text) { + const { apiUrl, apiKey, model } = appSettings.embedding; + if (!apiUrl || !apiKey) + return null; + try { + const resp = await fetch(apiUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${apiKey}`, + }, + body: JSON.stringify({ input: text, model: model || "text-embedding-3-small" }), + signal: AbortSignal.timeout(10000), + }); + const data = await resp.json(); + return data.data?.[0]?.embedding ?? null; + } + catch { + return null; + } +} +function cosineSim(a, b) { + let dot = 0, na = 0, nb = 0; + for (let i = 0; i < a.length; i++) { + dot += a[i] * b[i]; + na += a[i] * a[i]; + nb += b[i] * b[i]; + } + return dot / (Math.sqrt(na) * Math.sqrt(nb) + 1e-10); +} +// SQLite embedding cache — persistent across restarts +const EMBEDDINGS_DB_PATH = path.join(SETTINGS_DIR, "embeddings.sqlite"); +let embeddingsDb = null; +function getEmbeddingsDb() { + if (!embeddingsDb) { + fs.mkdirSync(SETTINGS_DIR, { recursive: true }); + embeddingsDb = new Database(EMBEDDINGS_DB_PATH); + embeddingsDb.pragma("journal_mode = WAL"); + embeddingsDb.exec(` + CREATE TABLE IF NOT EXISTS embeddings ( + file_path TEXT PRIMARY KEY, + mtime REAL NOT NULL, + model TEXT NOT NULL, + embedding BLOB NOT NULL + ) + `); + } + return embeddingsDb; +} +function getCachedEmbedding(filePath, mtime) { + const db = getEmbeddingsDb(); + const model = appSettings.embedding.model || "text-embedding-3-small"; + const row = db.prepare("SELECT embedding FROM embeddings WHERE file_path = ? AND mtime = ? AND model = ?").get(filePath, mtime, model); + if (!row) + return null; + return Array.from(new Float64Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 8)); +} +function setCachedEmbedding(filePath, mtime, embedding) { + const db = getEmbeddingsDb(); + const model = appSettings.embedding.model || "text-embedding-3-small"; + const buf = Buffer.from(new Float64Array(embedding).buffer); + db.prepare("INSERT OR REPLACE INTO embeddings (file_path, mtime, model, embedding) VALUES (?, ?, ?, ?)").run(filePath, mtime, model, buf); +} +async function getFileEmbeddings(files, workspace) { + const result = new Map(); + const toEmbed = []; + for (const relPath of files) { + const full = path.join(workspace, relPath); + try { + const stat = fs.statSync(full); + const cached = getCachedEmbedding(relPath, stat.mtimeMs); + if (cached) { + result.set(relPath, cached); + } + else { + toEmbed.push(relPath); + } + } + catch { /* skip */ } + } + // Embed uncached files (max 20 per request to stay responsive) + for (const relPath of toEmbed.slice(0, 20)) { + const full = path.join(workspace, relPath); + try { + const content = fs.readFileSync(full, "utf-8").substring(0, 2000); + const emb = await getEmbedding(content); + if (emb) { + const stat = fs.statSync(full); + setCachedEmbedding(relPath, stat.mtimeMs, emb); + result.set(relPath, emb); + } + } + catch { /* skip */ } + } + return result; +} +app.get("/api/semantic-search", async (c) => { + const { workspace } = getAgentFromQuery(c); + const q = (c.req.query("q") || "").trim(); + const mode = c.req.query("mode") || "bm25"; // bm25 | vector + if (!q || q.length < 2) + return c.json([]); + // BM25 mode: use QMD + if (mode === "bm25" && qmdAvailable) { + try { + const { stdout } = await exec(`export PATH="$HOME/.bun/bin:$PATH" && qmd search ${JSON.stringify(q)} -n 10 --json`, { timeout: 20000 }); + const raw = JSON.parse(stdout); + return c.json(raw.map((r) => ({ + path: qmdUriToRelPath(r.file), + title: r.title, + snippet: r.snippet.replace(/@@ [^@]+ @@[^\n]*\n?/, "").substring(0, 300), + score: Math.round(r.score * 100), + }))); + } + catch (e) { + console.error("BM25 search error:", e.message); + return c.json([]); + } + } + // Vector mode: use embedding API + if (mode === "vector" && appSettings.embedding.enabled && appSettings.embedding.apiKey) { + try { + const queryEmb = await getEmbedding(q); + if (!queryEmb) + return c.json([]); + const files = collectMdFiles(workspace); + const fileEmbs = await getFileEmbeddings(files, workspace); + const scored = []; + for (const [filePath, emb] of fileEmbs) { + const sim = cosineSim(queryEmb, emb); + const full = path.join(workspace, filePath); + let content = ""; + try { + content = fs.readFileSync(full, "utf-8"); + } + catch { + continue; + } + const firstLine = content.split("\n").find(l => l.startsWith("#"))?.replace(/^#+\s*/, "") || filePath; + scored.push({ + path: filePath, + score: Math.round(sim * 100), + title: firstLine, + snippet: content.substring(0, 300).replace(/\n/g, " "), + }); + } + scored.sort((a, b) => b.score - a.score); + return c.json(scored.slice(0, 10)); + } + catch (e) { + console.error("Vector search error:", e.message); + return c.json([]); + } + } + return c.json([]); +}); +// Extract tags from content: ## headers and #hashtags +function extractTags(content) { + const tags = new Set(); + // Extract ## headers + const headers = content.match(/^##\s+(.+)$/gm) || []; + headers.forEach(h => { + const tag = h.replace(/^##\s+/, "").replace(/[*_`]/g, "").trim(); + if (tag.length < 30 && tag.length > 0) + tags.add(tag); + }); + // Extract #hashtags (but not markdown headers) + const hashtags = content.match(/(? { + const tag = h.replace(/^#/, "").trim(); + if (tag.length < 30 && tag.length > 0) + tags.add(tag); + }); + return Array.from(tags); +} +// Scan all markdown files and extract tags +function scanAllTags(workspace) { + const tagMap = new Map(); + const mdFiles = collectMdFiles(workspace); + for (const relPath of mdFiles) { + const fullPath = path.join(workspace, relPath); + try { + const content = fs.readFileSync(fullPath, "utf-8"); + const tags = extractTags(content); + for (const tag of tags) { + if (!tagMap.has(tag)) { + tagMap.set(tag, { name: tag, count: 0, files: [] }); + } + const info = tagMap.get(tag); + info.count++; + info.files.push(relPath); + } + } + catch { /* skip */ } + } + return tagMap; +} +app.get("/api/tags", (c) => { + const { workspace } = getAgentFromQuery(c); + const tagMap = scanAllTags(workspace); + const tags = Array.from(tagMap.values()).sort((a, b) => b.count - a.count); + return c.json(tags); +}); +app.get("/api/files-by-tag/:tag", (c) => { + const { workspace } = getAgentFromQuery(c); + const tagParam = decodeURIComponent(c.req.param("tag")); + const tagMap = scanAllTags(workspace); + const tagInfo = tagMap.get(tagParam); + if (!tagInfo) { + return c.json([]); + } + const results = []; + for (const relPath of tagInfo.files) { + const fullPath = path.join(workspace, relPath); + try { + const content = fs.readFileSync(fullPath, "utf-8"); + const clean = content.replace(/^---[\s\S]*?---/, "").trim(); + const titleMatch = clean.match(/^#\s+(.+)$/m); + const title = titleMatch ? titleMatch[1].trim() : path.basename(relPath, ".md"); + const lines = clean.split("\n").filter(l => l.trim() && !l.startsWith("#")); + let preview = lines.slice(0, 2).join(" ").replace(/[*_`\[\]]/g, "").trim(); + if (preview.length > 120) + preview = preview.slice(0, 120) + "…"; + const date = relPath.match(/(\d{4}-\d{2}-\d{2})/)?.[1] || ""; + const fileTags = extractTags(content); + results.push({ + path: relPath, + title, + preview: preview || "(空)", + date, + tags: fileTags, + }); + } + catch { /* skip */ } + } + // Sort by date (newest first) + results.sort((a, b) => b.date.localeCompare(a.date)); + return c.json(results); +}); +app.get("/api/timeline", (c) => { + const { workspace } = getAgentFromQuery(c); + const memoryDir = path.join(workspace, "memory"); + const results = []; + function scanDir(dir, rel) { + let entries; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } + catch { + return; + } + for (const e of entries) { + if (e.isDirectory()) { + scanDir(path.join(dir, e.name), rel ? `${rel}/${e.name}` : e.name); + } + else if (e.isFile() && /^\d{4}-\d{2}-\d{2}(-\w+)?\.md$/.test(e.name)) { + const filePath = `memory/${rel ? rel + "/" : ""}${e.name}`; + const fullPath = path.join(dir, e.name); + try { + const content = fs.readFileSync(fullPath, "utf-8"); + const date = e.name.match(/(\d{4}-\d{2}-\d{2})/)?.[1] || ""; + const clean = content.replace(/^---[\s\S]*?---/, "").trim(); + const titleMatch = clean.match(/^#\s+(.+)$/m); + const title = titleMatch ? titleMatch[1].trim() : e.name.replace(/\.md$/, ""); + const lines = clean.split("\n").filter(l => l.trim() && !l.startsWith("#")); + let preview = lines.slice(0, 2).join(" ").replace(/[*_`\[\]]/g, "").trim(); + if (preview.length > 120) + preview = preview.slice(0, 120) + "…"; + const headers = content.match(/^##\s+(.+)$/gm) || []; + const tags = headers.map(h => h.replace(/^##\s+/, "").replace(/[*_`]/g, "").trim()).filter(t => t.length < 20).slice(0, 4); + results.push({ date, path: filePath, title, preview: preview || "(空)", tags, charCount: content.length }); + } + catch { /* skip */ } + } + } + } + scanDir(memoryDir, ""); + results.sort((a, b) => b.date.localeCompare(a.date)); + return c.json(results); +}); +app.get("/api/recent", (c) => { + const { workspace } = getAgentFromQuery(c); + const files = collectMdFiles(workspace); + const withStats = files.map((relPath) => { + const full = path.join(workspace, relPath); + try { + const stat = fs.statSync(full); + return { path: relPath, mtime: stat.mtime.getTime(), size: stat.size }; + } + catch { + return null; + } + }).filter(Boolean); + withStats.sort((a, b) => b.mtime - a.mtime); + const limit = Math.min(Number(c.req.query("limit")) || 10, 50); + return c.json(withStats.slice(0, limit)); +}); +app.get("/api/stats/monthly", (c) => { + const { workspace } = getAgentFromQuery(c); + const memoryDir = path.join(workspace, "memory"); + const counts = {}; + let entries; + try { + entries = fs.readdirSync(memoryDir, { withFileTypes: true }); + } + catch { + return c.json([]); + } + for (const entry of entries) { + if (!entry.isFile() || !entry.name.endsWith(".md")) + continue; + const match = entry.name.match(/^(\d{4}-\d{2})/); + if (match) { + counts[match[1]] = (counts[match[1]] || 0) + 1; + } + else { + try { + const stat = fs.statSync(path.join(memoryDir, entry.name)); + const month = stat.mtime.toISOString().slice(0, 7); + counts[month] = (counts[month] || 0) + 1; + } + catch { /* skip */ } + } + } + const result = Object.entries(counts) + .map(([month, count]) => ({ month, count })) + .sort((a, b) => a.month.localeCompare(b.month)); + return c.json(result); +}); +app.get("/api/stats/daily", (c) => { + const { workspace } = getAgentFromQuery(c); + const memoryDir = path.join(workspace, "memory"); + const results = []; + let entries; + try { + entries = fs.readdirSync(memoryDir, { withFileTypes: true }); + } + catch { + return c.json([]); + } + const dateMap = new Map(); + for (const entry of entries) { + if (!entry.isFile() || !entry.name.endsWith(".md")) + continue; + const match = entry.name.match(/^(\d{4}-\d{2}-\d{2})/); + if (!match) + continue; + const date = match[1]; + try { + const stat = fs.statSync(path.join(memoryDir, entry.name)); + const existing = dateMap.get(date); + if (existing) { + existing.count++; + existing.size += stat.size; + } + else { + dateMap.set(date, { count: 1, size: stat.size }); + } + } + catch { /* skip */ } + } + for (const [date, val] of dateMap) { + results.push({ date, count: val.count, size: val.size }); + } + results.sort((a, b) => a.date.localeCompare(b.date)); + return c.json(results); +}); +app.get("/api/info", (c) => { + const { workspace } = getAgentFromQuery(c); + let name = "Unknown Bot"; + let description = ""; + for (const fname of ["IDENTITY.md", "SOUL.md"]) { + const fpath = path.join(workspace, fname); + if (fs.existsSync(fpath)) { + const content = fs.readFileSync(fpath, "utf-8"); + const heading = content.match(/^#\s+(.+)/m); + if (heading) + name = heading[1].trim(); + const lines = content.split("\n").filter((l) => l.trim() && !l.startsWith("#")); + if (lines.length > 0) + description = lines[0].trim().substring(0, 200); + break; + } + } + return c.json({ name, version: "1.0.0", description }); +}); +app.get("/api/system", (c) => { + const { workspace } = getAgentFromQuery(c); + const uptime = os.uptime(); + const memTotal = os.totalmem(); + const memFree = os.freemem(); + const load = os.loadavg(); + const platform = `${os.platform()} ${os.release()}`; + const hostname = os.hostname(); + const today = new Date().toISOString().split("T")[0]; + const todayPath = path.join(workspace, "memory", `${today}.md`); + let todayMemory = null; + if (fs.existsSync(todayPath)) { + const content = fs.readFileSync(todayPath, "utf-8"); + todayMemory = { + filename: `memory/${today}.md`, + snippet: content.split("\n").slice(0, 10).join("\n"), + length: content.length, + }; + } + const totalFiles = collectMdFiles(workspace).length; + return c.json({ + uptime, memTotal, memFree, memUsed: memTotal - memFree, + load, platform, hostname, todayMemory, totalFiles, + }); +}); +app.get("/api/agent/status", async (c) => { + // 1. Config + const home = os.homedir(); + const configPath = path.join(home, ".openclaw", "openclaw.json"); + let safeConfig = {}; + try { + if (fs.existsSync(configPath)) { + const raw = JSON.parse(fs.readFileSync(configPath, "utf-8")); + // Whitelist specific fields + safeConfig = { + version: raw.version, + update: raw.update, + models: { mode: raw.models?.mode }, + agents: { defaults: raw.agents?.defaults }, + gateway: { + port: raw.gateway?.port, + mode: raw.gateway?.mode, + }, + }; + } + } + catch (e) { + console.error("Failed to read config", e); + safeConfig = { error: "Could not read config" }; + } + // 2. Gateway Status + let gatewayStatus = null; + try { + const { stdout } = await exec("openclaw gateway status --json"); + gatewayStatus = JSON.parse(stdout); + } + catch (e) { + // console.error("Failed to get gateway status", e); + // fallback or null + } + // 3. Heartbeat + let heartbeat = null; + try { + const hbPath = path.join(DEFAULT_WORKSPACE, "memory", "heartbeat-state.json"); + if (fs.existsSync(hbPath)) { + heartbeat = JSON.parse(fs.readFileSync(hbPath, "utf-8")); + } + } + catch (e) { + console.error("Failed to read heartbeat", e); + } + return c.json({ + config: safeConfig, + gateway: gatewayStatus, + heartbeat + }); +}); +// --------------------------------------------------------------------------- +// Gateway Chat Proxy +// --------------------------------------------------------------------------- +app.post("/api/gateway/chat", async (c) => { + const { gatewayUrl, token, messages } = await c.req.json(); + if (!gatewayUrl || !token || !messages) { + return c.json({ error: "Missing gatewayUrl, token, or messages" }, 400); + } + try { + const url = `${gatewayUrl.replace(/\/+$/, "")}/v1/chat/completions`; + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 30000); + const resp = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ model: "default", messages }), + signal: controller.signal, + }); + clearTimeout(timeout); + if (!resp.ok) { + const text = await resp.text(); + return c.json({ error: text }, resp.status); + } + const data = await resp.json(); + return c.json(data); + } + catch (err) { + if (err.name === "AbortError") { + return c.json({ error: "Gateway request timeout (30s)" }, 504); + } + return c.json({ error: err.message || "Gateway request failed" }, 502); + } +}); +// --------------------------------------------------------------------------- +// AI Summarize +// --------------------------------------------------------------------------- +const GATEWAY_CHAT_URL = process.env.GATEWAY_CHAT_URL || "http://silicon-01:3001/v1/chat/completions"; +const SUMMARIZE_MODEL = process.env.SUMMARIZE_MODEL || "kimi-k2.5"; +app.post("/api/summarize", async (c) => { + const { workspace } = getAgentFromQuery(c); + const { path: filePath, content: providedContent, save } = await c.req.json(); + const full = safePath(filePath, workspace); + if (!full) + return c.json({ error: "Invalid path" }, 400); + let content = providedContent; + if (!content) { + if (!fs.existsSync(full)) + return c.json({ error: "Not found" }, 404); + content = fs.readFileSync(full, "utf-8"); + } + // Strip existing frontmatter for summarization + const bodyMatch = content.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?([\s\S]*)$/); + const body = bodyMatch ? bodyMatch[1] : content; + if (body.trim().length < 50) { + return c.json({ error: "Content too short to summarize" }, 400); + } + try { + const resp = await fetch(GATEWAY_CHAT_URL, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + model: SUMMARIZE_MODEL, + messages: [ + { + role: "system", + content: "You are a concise summarizer. Given a markdown document, produce a brief summary (1-3 sentences, max 200 chars). Reply with ONLY the summary text, no quotes, no prefix.", + }, + { role: "user", content: body.slice(0, 8000) }, + ], + max_tokens: 256, + temperature: 0.3, + }), + signal: AbortSignal.timeout(30000), + }); + if (!resp.ok) { + const text = await resp.text(); + return c.json({ error: `Gateway error: ${text}` }, 502); + } + const data = await resp.json(); + const summary = (data.choices?.[0]?.message?.content || "").trim(); + if (!summary) + return c.json({ error: "Empty summary returned" }, 502); + // Optionally save to file frontmatter + if (save) { + const existingFm = content.match(/^---\r?\n([\s\S]*?)\r?\n---/); + let newContent; + if (existingFm) { + // Update or add summary field in existing frontmatter + const fmContent = existingFm[1]; + if (/^summary:/m.test(fmContent)) { + const updatedFm = fmContent.replace(/^summary:.*$/m, `summary: "${summary.replace(/"/g, '\\"')}"`); + newContent = content.replace(existingFm[0], `---\n${updatedFm}\n---`); + } + else { + newContent = content.replace(existingFm[0], `---\n${fmContent}\nsummary: "${summary.replace(/"/g, '\\"')}"\n---`); + } + } + else { + newContent = `---\nsummary: "${summary.replace(/"/g, '\\"')}"\n---\n${content}`; + } + fs.writeFileSync(full, newContent, "utf-8"); + const stat = fs.statSync(full); + return c.json({ summary, saved: true, mtime: stat.mtime }); + } + return c.json({ summary, saved: false }); + } + catch (err) { + if (err.name === "AbortError" || err.name === "TimeoutError") { + return c.json({ error: "Gateway timeout (30s)" }, 504); + } + return c.json({ error: err.message || "Summarize failed" }, 502); + } +}); +// --------------------------------------------------------------------------- +// WebSocket — live file change notifications +// --------------------------------------------------------------------------- +const wsClients = new Set(); +app.get("/ws", upgradeWebSocket(() => ({ + onOpen(_event, ws) { + wsClients.add(ws); + }, + onClose(_event, ws) { + wsClients.delete(ws); + }, +}))); +function broadcast(data) { + const msg = JSON.stringify(data); + for (const ws of wsClients) { + try { + ws.send(msg); + } + catch { /* ignore */ } + } +} +const watcher = watch(path.join(DEFAULT_WORKSPACE, "**/*.md"), { + ignoreInitial: true, + ignored: /(^|[/\\])\.(git|node_modules)/, + awaitWriteFinish: { stabilityThreshold: 300 }, +}); +watcher.on("all", (event, filePath) => { + const rel = path.relative(DEFAULT_WORKSPACE, filePath); + broadcast({ type: "file-change", event, path: rel }); +}); +// --------------------------------------------------------------------------- +// Workspace assets (images, SVGs, etc.) +// --------------------------------------------------------------------------- +app.get("/workspace-assets/*", async (c) => { + const { workspace } = getAgentFromQuery(c); + const assetPath = c.req.path.replace("/workspace-assets/", ""); + const fullPath = path.join(workspace, "assets", assetPath); + if (!fullPath.startsWith(path.join(workspace, "assets"))) { + return c.json({ error: "Invalid path" }, 403); + } + if (!fs.existsSync(fullPath)) { + return c.json({ error: "Not found" }, 404); + } + const ext = path.extname(fullPath).toLowerCase(); + const mimeTypes = { + ".svg": "image/svg+xml", + ".png": "image/png", + ".jpg": "image/jpeg", + ".jpeg": "image/jpeg", + ".gif": "image/gif", + ".webp": "image/webp", + }; + const contentType = mimeTypes[ext] || "application/octet-stream"; + const content = fs.readFileSync(fullPath); + c.header("Content-Type", contentType); + c.header("Cache-Control", "public, max-age=3600"); + return c.body(content); +}); +// --------------------------------------------------------------------------- +// Static file serving +// --------------------------------------------------------------------------- +if (fs.existsSync(STATIC_DIR)) { + app.use("/assets/*", serveStatic({ + root: STATIC_DIR, + rewriteRequestPath: (p) => p, + })); + app.use("*", serveStatic({ root: STATIC_DIR })); + // SPA fallback + app.get("*", (c) => { + const html = fs.readFileSync(path.join(STATIC_DIR, "index.html"), "utf-8"); + c.header("Cache-Control", "no-cache, no-store, must-revalidate"); + return c.html(html); + }); +} +// --------------------------------------------------------------------------- +// Start +// --------------------------------------------------------------------------- +if (process.env.NODE_ENV !== 'test') { + const server = serve({ fetch: app.fetch, port: PORT, hostname: "0.0.0.0" }, (info) => { + console.log(`📝 Memory Viewer running at http://localhost:${info.port}`); + console.log(`📂 Default Workspace: ${DEFAULT_WORKSPACE}`); + }); + injectWebSocket(server); +} diff --git a/memory-viewer/server/api.test.ts b/memory-viewer/server/api.test.ts new file mode 100644 index 0000000..5eda531 --- /dev/null +++ b/memory-viewer/server/api.test.ts @@ -0,0 +1,50 @@ +import { describe, it, expect, beforeAll, afterAll } from 'vitest'; +import fs from 'fs'; +import path from 'path'; +import os from 'os'; +import { app } from './index.js'; + +describe('Server API', () => { + it('GET /api/info returns bot info', async () => { + // Note: This relies on actual file system unless mocked. + // Ideally we mock fs, but for integration test on CI it's fine. + const res = await app.request('/api/info'); + expect(res.status).toBe(200); + const data = await res.json(); + expect(data).toHaveProperty('version'); + }); + + it('GET /api/agent/status returns structure', async () => { + const res = await app.request('/api/agent/status'); + expect(res.status).toBe(200); + const data = await res.json(); + expect(data).toHaveProperty('config'); + expect(data).toHaveProperty('gateway'); + }); +}); + +describe('Backlinks API', () => { + // These tests rely on the actual WORKSPACE directory (~/clawd by default) + // They test the API structure and basic behavior + + it('GET /api/resolve-wikilink returns 400 without link', async () => { + const res = await app.request('/api/resolve-wikilink'); + expect(res.status).toBe(400); + }); + + it('GET /api/resolve-wikilink resolves existing file', async () => { + // MEMORY.md should exist in the workspace + const res = await app.request('/api/resolve-wikilink?link=MEMORY'); + expect(res.status).toBe(200); + const data = await res.json() as any; + expect(data).toHaveProperty('found'); + expect(data).toHaveProperty('path'); + }); + + it('GET /api/resolve-wikilink returns not found for nonexistent', async () => { + const res = await app.request('/api/resolve-wikilink?link=nonexistent-file-that-does-not-exist-12345'); + expect(res.status).toBe(200); + const data = await res.json() as any; + expect(data.found).toBe(false); + }); +}); diff --git a/memory-viewer/server/cron-trigger.mjs b/memory-viewer/server/cron-trigger.mjs new file mode 100644 index 0000000..99a09db --- /dev/null +++ b/memory-viewer/server/cron-trigger.mjs @@ -0,0 +1,99 @@ +#!/usr/bin/env node +// Trigger a cron job via OpenClaw gateway WebSocket +// Usage: node cron-trigger.mjs +import { readFileSync } from "fs"; +import { homedir } from "os"; +import { join } from "path"; +import { randomUUID } from "crypto"; +import WebSocket from "ws"; + +const jobId = process.argv[2]; +if (!jobId) { console.log(JSON.stringify({success:false, error:"missing jobId"})); process.exit(1); } + +const configPath = join(homedir(), ".openclaw", "openclaw.json"); +const config = JSON.parse(readFileSync(configPath, "utf-8")); +const port = config.gateway?.port || 18789; +const token = config.gateway?.auth?.token || ""; + +const ws = new WebSocket(`ws://127.0.0.1:${port}`); +let connectNonce = null; +let connected = false; +const pending = new Map(); + +const timeout = setTimeout(() => { + console.log(JSON.stringify({success:false, error:"timeout"})); + ws.close(); + process.exit(1); +}, 10000); + +function send(obj) { ws.send(JSON.stringify(obj)); } + +function request(method, params) { + const id = randomUUID(); + return new Promise((resolve, reject) => { + pending.set(id, { resolve, reject }); + send({ type: "req", id, method, params }); + }); +} + +ws.on("message", (data) => { + try { + const msg = JSON.parse(data.toString()); + + // Event frame + if (msg.type === "event") { + if (msg.event === "connect.challenge") { + connectNonce = msg.payload?.nonce; + // Send connect request + request("connect", { + minProtocol: 3, + maxProtocol: 3, + client: { + id: "gateway-client", + displayName: "Memory Viewer", + version: "1.0.0", + platform: "linux", + mode: "backend", + }, + caps: [], + auth: { token }, + role: "operator", + scopes: ["operator.admin"], + }).then(() => { + connected = true; + // Send cron.run — it's async, so fire and consider it triggered + const cronId = randomUUID(); + ws.send(JSON.stringify({type:'req', id:cronId, method:'cron.run', params:{id: jobId}})); + // Give it a moment to dispatch, then report success + setTimeout(() => { + clearTimeout(timeout); + console.log(JSON.stringify({success:true, result:'triggered'})); + ws.close(); + process.exit(0); + }, 500); + }).catch((err) => { + clearTimeout(timeout); + console.log(JSON.stringify({success:false, error: err.message})); + ws.close(); + process.exit(1); + }); + } + return; + } + + // Response frame + if (msg.type === "res") { + const p = pending.get(msg.id); + if (!p) return; + pending.delete(msg.id); + if (msg.ok) p.resolve(msg.payload); + else p.reject(new Error(msg.error?.message || "unknown error")); + } + } catch {} +}); + +ws.on("error", (err) => { + clearTimeout(timeout); + console.log(JSON.stringify({success:false, error: err.message})); + process.exit(1); +}); diff --git a/memory-viewer/server/index.ts b/memory-viewer/server/index.ts new file mode 100644 index 0000000..ab0289e --- /dev/null +++ b/memory-viewer/server/index.ts @@ -0,0 +1,1466 @@ +/** + * Memory Viewer — API Server (Hono) + * + * Provides REST endpoints for browsing, reading, editing, and searching + * Markdown files, plus a WebSocket channel that pushes live file-change + * notifications to connected clients. + */ +import { Hono } from "hono"; +import { compress } from "hono/compress"; +import { cors } from "hono/cors"; +import { serveStatic } from "@hono/node-server/serve-static"; +import { createNodeWebSocket } from "@hono/node-ws"; +import { serve } from "@hono/node-server"; +import fs from "fs"; +import path from "path"; +import os from "os"; +import Database from "better-sqlite3"; +import { exec as execCallback } from "child_process"; +import util from "util"; +import { watch } from "chokidar"; +import type { WSContext } from "hono/ws"; + +const exec = util.promisify(execCallback); + +// --------------------------------------------------------------------------- +// Agent Config Types +// --------------------------------------------------------------------------- +interface AgentConfig { + id: string; + name: string; + workspace?: string; + agentDir?: string; + identity?: { + name?: string; + emoji?: string; + }; + skills?: string[]; +} + +interface AgentsConfig { + defaults: { + workspace?: string; + }; + list: AgentConfig[]; +} + +interface OpenClawConfig { + agents?: AgentsConfig; +} + +interface AgentInfo { + id: string; + name: string; + workspace: string; + emoji: string; + skills?: string[]; +} + +// --------------------------------------------------------------------------- +// Settings +// --------------------------------------------------------------------------- +const SETTINGS_DIR = path.join(os.homedir(), ".config", "memory-viewer"); +const SETTINGS_FILE = path.join(SETTINGS_DIR, "settings.json"); + +interface AppSettings { + embedding: { + enabled: boolean; + apiUrl: string; + apiKey: string; + model: string; + }; + pluginsDir: string; +} + +const DEFAULT_SETTINGS: AppSettings = { + embedding: { enabled: false, apiUrl: "", apiKey: "", model: "" }, + pluginsDir: "", +}; + +function loadSettings(): AppSettings { + try { + const raw = fs.readFileSync(SETTINGS_FILE, "utf-8"); + return { ...DEFAULT_SETTINGS, ...JSON.parse(raw) }; + } catch { + return { ...DEFAULT_SETTINGS }; + } +} + +function saveSettings(s: AppSettings): void { + fs.mkdirSync(SETTINGS_DIR, { recursive: true }); + fs.writeFileSync(SETTINGS_FILE, JSON.stringify(s, null, 2)); +} + +let appSettings = loadSettings(); + +// --------------------------------------------------------------------------- +// Config +// --------------------------------------------------------------------------- +const PORT = Number(process.env.PORT) || 3001; +const DEFAULT_WORKSPACE = process.env.WORKSPACE_DIR || path.join(os.homedir(), "clawd"); +const STATIC_DIR = process.env.STATIC_DIR || path.join(import.meta.dirname, "..", "dist"); + +const app = new Hono(); +export { app }; // Export for testing +const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app }); + +app.use("*", compress()); +app.use("*", cors({ origin: "*" })); + +// --------------------------------------------------------------------------- +// Agent Management +// --------------------------------------------------------------------------- +const OPENCLAW_CONFIG_PATH = path.join(os.homedir(), ".openclaw", "openclaw.json"); + +function loadOpenClawConfig(): OpenClawConfig | null { + try { + if (fs.existsSync(OPENCLAW_CONFIG_PATH)) { + const raw = fs.readFileSync(OPENCLAW_CONFIG_PATH, "utf-8"); + return JSON.parse(raw); + } + } catch (e) { + console.error("Failed to load OpenClaw config:", e); + } + return null; +} + +function getAgentWorkspace(agentConfig: AgentConfig, defaults: { workspace?: string }): string { + // Priority: workspace > agentDir > defaults.workspace > DEFAULT_WORKSPACE + if (agentConfig.workspace) { + return agentConfig.workspace; + } + if (agentConfig.agentDir) { + return agentConfig.agentDir; + } + if (defaults.workspace) { + return defaults.workspace; + } + return DEFAULT_WORKSPACE; +} + +function getAgents(): AgentInfo[] { + const config = loadOpenClawConfig(); + if (!config?.agents?.list) { + // Return default agent if no config + return [{ + id: "default", + name: "Default Agent", + workspace: DEFAULT_WORKSPACE, + emoji: "🤖", + }]; + } + + const defaults = config.agents.defaults || {}; + + return config.agents.list.map((agent) => ({ + id: agent.id, + name: agent.name || agent.id, + workspace: getAgentWorkspace(agent, defaults), + emoji: agent.identity?.emoji || "🤖", + skills: agent.skills || undefined, + })); +} + +function getAgentById(agentId: string): AgentInfo | null { + const agents = getAgents(); + return agents.find((a) => a.id === agentId) || null; +} + +// Get workspace for a given agent ID +function getWorkspaceForAgent(agentId: string | null | undefined): string { + if (!agentId || agentId === "default") { + // Try to find "default" agent in config, otherwise use default workspace + const agent = getAgentById("default"); + if (agent) return agent.workspace; + return DEFAULT_WORKSPACE; + } + + const agent = getAgentById(agentId); + if (agent) return agent.workspace; + + // Fallback to default workspace if agent not found + return DEFAULT_WORKSPACE; +} + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +function safePath(filePath: string | undefined | null, workspace: string): string | null { + if (!filePath || filePath.includes("..") || !filePath.endsWith(".md")) return null; + const full = path.resolve(workspace, filePath); + if (!full.startsWith(path.resolve(workspace))) return null; + return full; +} + +interface TreeNode { + name: string; + type: "file" | "dir"; + path: string; + children?: TreeNode[]; +} + +function scanDir(dir: string, prefix = ""): TreeNode[] { + const result: TreeNode[] = []; + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return result; + } + for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) { + if (entry.name.startsWith(".") || entry.name === "node_modules") continue; + const relPath = prefix ? `${prefix}/${entry.name}` : entry.name; + if (entry.isDirectory()) { + const children = scanDir(path.join(dir, entry.name), relPath); + if (children.length > 0) { + result.push({ name: entry.name, type: "dir", path: relPath, children }); + } + } else if (entry.name.endsWith(".md")) { + result.push({ name: entry.name, type: "file", path: relPath }); + } + } + return result; +} + +function collectMdFiles(dir: string, prefix = ""): string[] { + const files: string[] = []; + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return files; + } + for (const entry of entries) { + if (entry.name.startsWith(".") || entry.name === "node_modules") continue; + const relPath = prefix ? `${prefix}/${entry.name}` : entry.name; + if (entry.isDirectory()) { + files.push(...collectMdFiles(path.join(dir, entry.name), relPath)); + } else if (entry.name.endsWith(".md")) { + files.push(relPath); + } + } + return files; +} + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// REST API +// --------------------------------------------------------------------------- + +// Get agent from query parameter +function getAgentFromQuery(c: any): { agentId: string; workspace: string } { + const agentId = c.req.query("agent") || "default"; + const workspace = getWorkspaceForAgent(agentId); + return { agentId, workspace }; +} + +// Agents API +app.get("/api/agents", (c) => { + return c.json(getAgents()); +}); + +app.get("/api/skills", (c) => { + const { workspace } = getAgentFromQuery(c); + const skillsDir = path.join(workspace, "skills"); + const results: { id: string; name: string; description: string; path: string }[] = []; + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(skillsDir, { withFileTypes: true }); + } catch { + return c.json([]); + } + for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) { + if (!entry.isDirectory() || entry.name.startsWith(".")) continue; + const skillMd = path.join(skillsDir, entry.name, "SKILL.md"); + if (!fs.existsSync(skillMd)) continue; + const content = fs.readFileSync(skillMd, "utf-8"); + let name = entry.name; + let description = ""; + const fmMatch = content.match(/^---\s*\n([\s\S]*?)\n---/); + if (fmMatch) { + const nameMatch = fmMatch[1].match(/^name:\s*(.+)/m); + const descMatch = fmMatch[1].match(/^description:\s*(.+)/m); + if (nameMatch) name = nameMatch[1].trim().replace(/^["']|["']$/g, ""); + if (descMatch) description = descMatch[1].trim().replace(/^["']|["']$/g, ""); + } + results.push({ id: entry.name, name, description, path: `skills/${entry.name}/SKILL.md` }); + } + return c.json(results); +}); + +app.get("/api/files", (c) => { + const { workspace } = getAgentFromQuery(c); + return c.json(scanDir(workspace)); +}); + +app.get("/api/file", (c) => { + const { workspace } = getAgentFromQuery(c); + const full = safePath(c.req.query("path"), workspace); + if (!full) return c.json({ error: "Invalid path" }, 400); + if (!fs.existsSync(full)) return c.json({ error: "Not found" }, 404); + const content = fs.readFileSync(full, "utf-8"); + const stat = fs.statSync(full); + return c.json({ content, mtime: stat.mtime, size: stat.size }); +}); + +app.put("/api/file", async (c) => { + const { workspace } = getAgentFromQuery(c); + const { path: filePath, content, expectedMtime } = await c.req.json(); + const full = safePath(filePath, workspace); + if (!full) return c.json({ error: "Invalid path" }, 400); + + if (expectedMtime && fs.existsSync(full)) { + const currentMtime = fs.statSync(full).mtime.toISOString(); + if (currentMtime !== expectedMtime) { + const currentContent = fs.readFileSync(full, "utf-8"); + return c.json({ + error: "conflict", + message: "File was modified since you started editing", + serverMtime: currentMtime, + serverContent: currentContent, + }, 409); + } + } + + fs.mkdirSync(path.dirname(full), { recursive: true }); + fs.writeFileSync(full, content, "utf-8"); + const stat = fs.statSync(full); + return c.json({ ok: true, mtime: stat.mtime }); +}); + +app.get("/api/resolve-wikilink", (c) => { + const { workspace } = getAgentFromQuery(c); + const link = (c.req.query("link") || "").trim(); + if (!link) return c.json({ error: "Missing link parameter" }, 400); + + const allFiles = collectMdFiles(workspace); + + // Try exact path match first + const exactPath = link.endsWith(".md") ? link : `${link}.md`; + if (allFiles.includes(exactPath)) { + return c.json({ found: true, path: exactPath }); + } + + // Try case-insensitive exact path + const exactLower = exactPath.toLowerCase(); + const ciMatch = allFiles.find((f) => f.toLowerCase() === exactLower); + if (ciMatch) { + return c.json({ found: true, path: ciMatch }); + } + + // Try filename-only match (fuzzy) + const linkLower = link.toLowerCase(); + const byName = allFiles.find((f) => { + const name = path.basename(f, ".md"); + return name.toLowerCase() === linkLower; + }); + if (byName) { + return c.json({ found: true, path: byName }); + } + + return c.json({ found: false, path: null }); +}); + +app.get("/api/search", (c) => { + const { workspace } = getAgentFromQuery(c); + const q = (c.req.query("q") || "").trim().toLowerCase(); + if (!q || q.length < 2) return c.json([]); + + const files = collectMdFiles(workspace); + const results: { path: string; matches: { line: number; text: string }[] }[] = []; + + for (const relPath of files) { + const full = path.join(workspace, relPath); + let content: string; + try { + content = fs.readFileSync(full, "utf-8"); + } catch { + continue; + } + const lines = content.split("\n"); + const matches: { line: number; text: string }[] = []; + for (let i = 0; i < lines.length; i++) { + if (lines[i].toLowerCase().includes(q)) { + matches.push({ line: i + 1, text: lines[i].substring(0, 200) }); + if (matches.length >= 5) break; + } + } + if (matches.length > 0) results.push({ path: relPath, matches }); + if (results.length >= 50) break; + } + return c.json(results); +}); + +// QMD availability detection — cached at startup +let qmdAvailable: boolean | null = null; +let qmdHasVectors = false; + +async function detectQmd(): Promise { + try { + const { stdout } = await exec( + `export PATH="$HOME/.bun/bin:$PATH" && qmd status 2>/dev/null`, + { timeout: 5000 } + ); + qmdAvailable = stdout.includes("Documents"); + qmdHasVectors = /Vectors:\s*[1-9]/.test(stdout); + console.log(`🔍 QMD: ${qmdAvailable ? "available" : "not found"}${qmdHasVectors ? " (vectors ready)" : ""}`); + } catch { + qmdAvailable = false; + qmdHasVectors = false; + console.log("🔍 QMD: not installed"); + } +} + +// Run detection on startup +detectQmd(); + +// External plugins directory +const PLUGINS_DIR = appSettings.pluginsDir || process.env.PLUGINS_DIR || ""; + +app.get("/api/plugins", (c) => { + if (!PLUGINS_DIR || !fs.existsSync(PLUGINS_DIR)) return c.json([]); + try { + const plugins: { id: string; name: string; entry: string }[] = []; + for (const dir of fs.readdirSync(PLUGINS_DIR, { withFileTypes: true })) { + if (!dir.isDirectory()) continue; + const manifestPath = path.join(PLUGINS_DIR, dir.name, "plugin.json"); + if (fs.existsSync(manifestPath)) { + const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8")); + plugins.push({ id: manifest.id || dir.name, name: manifest.name || dir.name, entry: manifest.entry || "index.js" }); + } + } + return c.json(plugins); + } catch { return c.json([]); } +}); + +// Serve plugin files +app.get("/api/plugins/:id/*", (c) => { + if (!PLUGINS_DIR) return c.text("No plugins dir", 404); + const pluginId = c.req.param("id"); + const filePath = c.req.path.replace(`/api/plugins/${pluginId}/`, ""); + const full = path.join(PLUGINS_DIR, pluginId, filePath); + if (!full.startsWith(path.join(PLUGINS_DIR, pluginId))) return c.text("Forbidden", 403); + if (!fs.existsSync(full)) return c.text("Not found", 404); + const content = fs.readFileSync(full, "utf-8"); + const ext = path.extname(full); + const ct = ext === ".js" ? "application/javascript" : ext === ".css" ? "text/css" : "text/plain"; + return c.text(content, 200, { "Content-Type": ct }); +}); + +app.get("/api/capabilities", (c) => { + const embeddingReady = appSettings.embedding.enabled && !!appSettings.embedding.apiUrl && !!appSettings.embedding.apiKey; + return c.json({ + qmd: qmdAvailable === true, + qmdBm25: qmdAvailable === true, + qmdVector: qmdHasVectors || embeddingReady, + embeddingApi: embeddingReady, + }); +}); + +// Settings API +app.get("/api/settings", (c) => { + return c.json({ + embedding: { + enabled: appSettings.embedding.enabled, + apiUrl: appSettings.embedding.apiUrl, + apiKeySet: !!appSettings.embedding.apiKey, + model: appSettings.embedding.model, + }, + }); +}); + +app.put("/api/settings", async (c) => { + const body = await c.req.json(); + if (body.embedding) { + appSettings.embedding.enabled = body.embedding.enabled ?? appSettings.embedding.enabled; + appSettings.embedding.apiUrl = body.embedding.apiUrl ?? appSettings.embedding.apiUrl; + appSettings.embedding.model = body.embedding.model ?? appSettings.embedding.model; + if (body.embedding.apiKey) { + appSettings.embedding.apiKey = body.embedding.apiKey; + } + } + saveSettings(appSettings); + return c.json({ ok: true }); +}); + +app.get("/api/settings/embedding-stats", (c) => { + const { workspace } = getAgentFromQuery(c); + try { + const db = getEmbeddingsDb(); + const model = appSettings.embedding.model || "text-embedding-3-small"; + const total = (db.prepare("SELECT COUNT(*) as n FROM embeddings WHERE model = ?").get(model) as any)?.n || 0; + const allFiles = collectMdFiles(workspace).length; + const dbSize = fs.existsSync(EMBEDDINGS_DB_PATH) ? fs.statSync(EMBEDDINGS_DB_PATH).size : 0; + return c.json({ + cachedFiles: total, + totalFiles: allFiles, + coverage: allFiles > 0 ? Math.round((total / allFiles) * 100) : 0, + dbSize, + model, + }); + } catch { + return c.json({ cachedFiles: 0, totalFiles: 0, coverage: 0, dbSize: 0, model: "" }); + } +}); + +app.post("/api/settings/test-embedding", async (c) => { + const { apiUrl, apiKey, model } = await c.req.json(); + const url = apiUrl || appSettings.embedding.apiUrl; + const key = apiKey || appSettings.embedding.apiKey; + const mdl = model || appSettings.embedding.model || "text-embedding-3-small"; + + if (!url) return c.json({ ok: false, message: "API URL is required" }); + + try { + const resp = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + ...(key ? { Authorization: `Bearer ${key}` } : {}), + }, + body: JSON.stringify({ input: "test", model: mdl }), + signal: AbortSignal.timeout(10000), + }); + const data: any = await resp.json(); + if (data.data?.[0]?.embedding) { + const dim = data.data[0].embedding.length; + return c.json({ ok: true, message: `✅ ${dim}维向量` }); + } + return c.json({ ok: false, message: data.error?.message || "Unexpected response" }); + } catch (e: any) { + return c.json({ ok: false, message: e.message || "Connection failed" }); + } +}); + +function qmdUriToRelPath(uri: string): string { + // qmd://clawd-memory/memory/survival.md → memory/survival.md + // qmd://clawd-root/MEMORY.md → MEMORY.md + // All collections index from workspace root, so just strip the qmd://collection/ prefix + const match = uri.match(/^qmd:\/\/[^/]+\/(.+)$/); + return match ? match[1] : uri; +} + +// Embedding API helper +async function getEmbedding(text: string): Promise { + const { apiUrl, apiKey, model } = appSettings.embedding; + if (!apiUrl || !apiKey) return null; + try { + const resp = await fetch(apiUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${apiKey}`, + }, + body: JSON.stringify({ input: text, model: model || "text-embedding-3-small" }), + signal: AbortSignal.timeout(10000), + }); + const data: any = await resp.json(); + return data.data?.[0]?.embedding ?? null; + } catch { + return null; + } +} + +function cosineSim(a: number[], b: number[]): number { + let dot = 0, na = 0, nb = 0; + for (let i = 0; i < a.length; i++) { + dot += a[i] * b[i]; + na += a[i] * a[i]; + nb += b[i] * b[i]; + } + return dot / (Math.sqrt(na) * Math.sqrt(nb) + 1e-10); +} + +// SQLite embedding cache — persistent across restarts +const EMBEDDINGS_DB_PATH = path.join(SETTINGS_DIR, "embeddings.sqlite"); +let embeddingsDb: Database.Database | null = null; + +function getEmbeddingsDb(): Database.Database { + if (!embeddingsDb) { + fs.mkdirSync(SETTINGS_DIR, { recursive: true }); + embeddingsDb = new Database(EMBEDDINGS_DB_PATH); + embeddingsDb.pragma("journal_mode = WAL"); + embeddingsDb.exec(` + CREATE TABLE IF NOT EXISTS embeddings ( + file_path TEXT PRIMARY KEY, + mtime REAL NOT NULL, + model TEXT NOT NULL, + embedding BLOB NOT NULL + ) + `); + } + return embeddingsDb; +} + +function getCachedEmbedding(filePath: string, mtime: number): number[] | null { + const db = getEmbeddingsDb(); + const model = appSettings.embedding.model || "text-embedding-3-small"; + const row = db.prepare("SELECT embedding FROM embeddings WHERE file_path = ? AND mtime = ? AND model = ?").get(filePath, mtime, model) as any; + if (!row) return null; + return Array.from(new Float64Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 8)); +} + +function setCachedEmbedding(filePath: string, mtime: number, embedding: number[]): void { + const db = getEmbeddingsDb(); + const model = appSettings.embedding.model || "text-embedding-3-small"; + const buf = Buffer.from(new Float64Array(embedding).buffer); + db.prepare("INSERT OR REPLACE INTO embeddings (file_path, mtime, model, embedding) VALUES (?, ?, ?, ?)").run(filePath, mtime, model, buf); +} + +async function getFileEmbeddings(files: string[], workspace: string): Promise> { + const result = new Map(); + const toEmbed: string[] = []; + + for (const relPath of files) { + const full = path.join(workspace, relPath); + try { + const stat = fs.statSync(full); + const cached = getCachedEmbedding(relPath, stat.mtimeMs); + if (cached) { + result.set(relPath, cached); + } else { + toEmbed.push(relPath); + } + } catch { /* skip */ } + } + + // Embed uncached files (max 20 per request to stay responsive) + for (const relPath of toEmbed.slice(0, 20)) { + const full = path.join(workspace, relPath); + try { + const content = fs.readFileSync(full, "utf-8").substring(0, 2000); + const emb = await getEmbedding(content); + if (emb) { + const stat = fs.statSync(full); + setCachedEmbedding(relPath, stat.mtimeMs, emb); + result.set(relPath, emb); + } + } catch { /* skip */ } + } + + return result; +} + +app.get("/api/semantic-search", async (c) => { + const { workspace } = getAgentFromQuery(c); + const q = (c.req.query("q") || "").trim(); + const mode = c.req.query("mode") || "bm25"; // bm25 | vector + if (!q || q.length < 2) return c.json([]); + + // BM25 mode: use QMD + if (mode === "bm25" && qmdAvailable) { + try { + const { stdout } = await exec( + `export PATH="$HOME/.bun/bin:$PATH" && qmd search ${JSON.stringify(q)} -n 10 --json`, + { timeout: 20000 } + ); + const raw: { docid: string; score: number; file: string; title: string; snippet: string }[] = JSON.parse(stdout); + return c.json(raw.map((r) => ({ + path: qmdUriToRelPath(r.file), + title: r.title, + snippet: r.snippet.replace(/@@ [^@]+ @@[^\n]*\n?/, "").substring(0, 300), + score: Math.round(r.score * 100), + }))); + } catch (e: any) { + console.error("BM25 search error:", e.message); + return c.json([]); + } + } + + // Vector mode: use embedding API + if (mode === "vector" && appSettings.embedding.enabled && appSettings.embedding.apiKey) { + try { + const queryEmb = await getEmbedding(q); + if (!queryEmb) return c.json([]); + + const files = collectMdFiles(workspace); + const fileEmbs = await getFileEmbeddings(files, workspace); + + const scored: { path: string; score: number; snippet: string; title: string }[] = []; + for (const [filePath, emb] of fileEmbs) { + const sim = cosineSim(queryEmb, emb); + const full = path.join(workspace, filePath); + let content = ""; + try { content = fs.readFileSync(full, "utf-8"); } catch { continue; } + const firstLine = content.split("\n").find(l => l.startsWith("#"))?.replace(/^#+\s*/, "") || filePath; + scored.push({ + path: filePath, + score: Math.round(sim * 100), + title: firstLine, + snippet: content.substring(0, 300).replace(/\n/g, " "), + }); + } + + scored.sort((a, b) => b.score - a.score); + return c.json(scored.slice(0, 10)); + } catch (e: any) { + console.error("Vector search error:", e.message); + return c.json([]); + } + } + + return c.json([]); +}); + +// ============================================================================ +// Tags API - Extract and manage tags from markdown files +// ============================================================================ + +interface TagInfo { + name: string; + count: number; + files: string[]; +} + +interface FileWithTags { + path: string; + title: string; + preview: string; + date: string; + tags: string[]; +} + +// Extract tags from content: ## headers and #hashtags +function extractTags(content: string): string[] { + const tags = new Set(); + + // Extract ## headers + const headers = content.match(/^##\s+(.+)$/gm) || []; + headers.forEach(h => { + const tag = h.replace(/^##\s+/, "").replace(/[*_`]/g, "").trim(); + if (tag.length < 30 && tag.length > 0) tags.add(tag); + }); + + // Extract #hashtags (but not markdown headers) + const hashtags = content.match(/(? { + const tag = h.replace(/^#/, "").trim(); + if (tag.length < 30 && tag.length > 0) tags.add(tag); + }); + + return Array.from(tags); +} + +// Scan all markdown files and extract tags +function scanAllTags(workspace: string): Map { + const tagMap = new Map(); + const mdFiles = collectMdFiles(workspace); + + for (const relPath of mdFiles) { + const fullPath = path.join(workspace, relPath); + try { + const content = fs.readFileSync(fullPath, "utf-8"); + const tags = extractTags(content); + + for (const tag of tags) { + if (!tagMap.has(tag)) { + tagMap.set(tag, { name: tag, count: 0, files: [] }); + } + const info = tagMap.get(tag)!; + info.count++; + info.files.push(relPath); + } + } catch { /* skip */ } + } + + return tagMap; +} + +app.get("/api/tags", (c) => { + const { workspace } = getAgentFromQuery(c); + const tagMap = scanAllTags(workspace); + const tags = Array.from(tagMap.values()).sort((a, b) => b.count - a.count); + return c.json(tags); +}); + +app.get("/api/files-by-tag/:tag", (c) => { + const { workspace } = getAgentFromQuery(c); + const tagParam = decodeURIComponent(c.req.param("tag")); + const tagMap = scanAllTags(workspace); + const tagInfo = tagMap.get(tagParam); + + if (!tagInfo) { + return c.json([]); + } + + const results: FileWithTags[] = []; + for (const relPath of tagInfo.files) { + const fullPath = path.join(workspace, relPath); + try { + const content = fs.readFileSync(fullPath, "utf-8"); + const clean = content.replace(/^---[\s\S]*?---/, "").trim(); + const titleMatch = clean.match(/^#\s+(.+)$/m); + const title = titleMatch ? titleMatch[1].trim() : path.basename(relPath, ".md"); + const lines = clean.split("\n").filter(l => l.trim() && !l.startsWith("#")); + let preview = lines.slice(0, 2).join(" ").replace(/[*_`\[\]]/g, "").trim(); + if (preview.length > 120) preview = preview.slice(0, 120) + "…"; + const date = relPath.match(/(\d{4}-\d{2}-\d{2})/)?.[1] || ""; + const fileTags = extractTags(content); + + results.push({ + path: relPath, + title, + preview: preview || "(空)", + date, + tags: fileTags, + }); + } catch { /* skip */ } + } + + // Sort by date (newest first) + results.sort((a, b) => b.date.localeCompare(a.date)); + return c.json(results); +}); + +app.get("/api/timeline", (c) => { + const { workspace } = getAgentFromQuery(c); + const memoryDir = path.join(workspace, "memory"); + const results: { date: string; path: string; title: string; preview: string; tags: string[]; charCount: number }[] = []; + + function scanDir(dir: string, rel: string) { + let entries: fs.Dirent[]; + try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; } + for (const e of entries) { + if (e.isDirectory()) { + scanDir(path.join(dir, e.name), rel ? `${rel}/${e.name}` : e.name); + } else if (e.isFile() && /^\d{4}-\d{2}-\d{2}(-\w+)?\.md$/.test(e.name)) { + const filePath = `memory/${rel ? rel + "/" : ""}${e.name}`; + const fullPath = path.join(dir, e.name); + try { + const content = fs.readFileSync(fullPath, "utf-8"); + const date = e.name.match(/(\d{4}-\d{2}-\d{2})/)?.[1] || ""; + const clean = content.replace(/^---[\s\S]*?---/, "").trim(); + const titleMatch = clean.match(/^#\s+(.+)$/m); + const title = titleMatch ? titleMatch[1].trim() : e.name.replace(/\.md$/, ""); + const lines = clean.split("\n").filter(l => l.trim() && !l.startsWith("#")); + let preview = lines.slice(0, 2).join(" ").replace(/[*_`\[\]]/g, "").trim(); + if (preview.length > 120) preview = preview.slice(0, 120) + "…"; + const headers = content.match(/^##\s+(.+)$/gm) || []; + const tags = headers.map(h => h.replace(/^##\s+/, "").replace(/[*_`]/g, "").trim()).filter(t => t.length < 20).slice(0, 4); + results.push({ date, path: filePath, title, preview: preview || "(空)", tags, charCount: content.length }); + } catch { /* skip */ } + } + } + } + + scanDir(memoryDir, ""); + results.sort((a, b) => b.date.localeCompare(a.date)); + return c.json(results); +}); + +app.get("/api/recent", (c) => { + const { workspace } = getAgentFromQuery(c); + const files = collectMdFiles(workspace); + const withStats = files.map((relPath) => { + const full = path.join(workspace, relPath); + try { + const stat = fs.statSync(full); + return { path: relPath, mtime: stat.mtime.getTime(), size: stat.size }; + } catch { + return null; + } + }).filter(Boolean) as { path: string; mtime: number; size: number }[]; + withStats.sort((a, b) => b.mtime - a.mtime); + const limit = Math.min(Number(c.req.query("limit")) || 10, 50); + return c.json(withStats.slice(0, limit)); +}); + +app.get("/api/stats/monthly", (c) => { + const { workspace } = getAgentFromQuery(c); + const memoryDir = path.join(workspace, "memory"); + const counts: Record = {}; + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(memoryDir, { withFileTypes: true }); + } catch { + return c.json([]); + } + for (const entry of entries) { + if (!entry.isFile() || !entry.name.endsWith(".md")) continue; + const match = entry.name.match(/^(\d{4}-\d{2})/); + if (match) { + counts[match[1]] = (counts[match[1]] || 0) + 1; + } else { + try { + const stat = fs.statSync(path.join(memoryDir, entry.name)); + const month = stat.mtime.toISOString().slice(0, 7); + counts[month] = (counts[month] || 0) + 1; + } catch { /* skip */ } + } + } + const result = Object.entries(counts) + .map(([month, count]) => ({ month, count })) + .sort((a, b) => a.month.localeCompare(b.month)); + return c.json(result); +}); + +app.get("/api/stats/daily", (c) => { + const { workspace } = getAgentFromQuery(c); + const memoryDir = path.join(workspace, "memory"); + const results: { date: string; count: number; size: number }[] = []; + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(memoryDir, { withFileTypes: true }); + } catch { + return c.json([]); + } + const dateMap = new Map(); + for (const entry of entries) { + if (!entry.isFile() || !entry.name.endsWith(".md")) continue; + const match = entry.name.match(/^(\d{4}-\d{2}-\d{2})/); + if (!match) continue; + const date = match[1]; + try { + const stat = fs.statSync(path.join(memoryDir, entry.name)); + const existing = dateMap.get(date); + if (existing) { + existing.count++; + existing.size += stat.size; + } else { + dateMap.set(date, { count: 1, size: stat.size }); + } + } catch { /* skip */ } + } + for (const [date, val] of dateMap) { + results.push({ date, count: val.count, size: val.size }); + } + results.sort((a, b) => a.date.localeCompare(b.date)); + return c.json(results); +}); + +app.get("/api/info", (c) => { + const { workspace } = getAgentFromQuery(c); + let name = "Unknown Bot"; + let description = ""; + for (const fname of ["IDENTITY.md", "SOUL.md"]) { + const fpath = path.join(workspace, fname); + if (fs.existsSync(fpath)) { + const content = fs.readFileSync(fpath, "utf-8"); + const heading = content.match(/^#\s+(.+)/m); + if (heading) name = heading[1].trim(); + const lines = content.split("\n").filter((l) => l.trim() && !l.startsWith("#")); + if (lines.length > 0) description = lines[0].trim().substring(0, 200); + break; + } + } + return c.json({ name, version: "1.0.0", description }); +}); + +app.get("/api/system", (c) => { + const { workspace } = getAgentFromQuery(c); + const uptime = os.uptime(); + const memTotal = os.totalmem(); + const memFree = os.freemem(); + const load = os.loadavg(); + const platform = `${os.platform()} ${os.release()}`; + const hostname = os.hostname(); + + const today = new Date().toISOString().split("T")[0]; + const todayPath = path.join(workspace, "memory", `${today}.md`); + let todayMemory = null; + if (fs.existsSync(todayPath)) { + const content = fs.readFileSync(todayPath, "utf-8"); + todayMemory = { + filename: `memory/${today}.md`, + snippet: content.split("\n").slice(0, 10).join("\n"), + length: content.length, + }; + } + + const totalFiles = collectMdFiles(workspace).length; + + return c.json({ + uptime, memTotal, memFree, memUsed: memTotal - memFree, + load, platform, hostname, todayMemory, totalFiles, + }); +}); + +app.get("/api/agent/status", async (c) => { + // 1. Config + const home = os.homedir(); + const configPath = path.join(home, ".openclaw", "openclaw.json"); + let safeConfig: any = {}; + try { + if (fs.existsSync(configPath)) { + const raw = JSON.parse(fs.readFileSync(configPath, "utf-8")); + // Whitelist specific fields + safeConfig = { + version: raw.version, + update: raw.update, + models: { mode: raw.models?.mode }, + agents: { defaults: raw.agents?.defaults }, + gateway: { + port: raw.gateway?.port, + mode: raw.gateway?.mode, + }, + }; + } + } catch (e) { + console.error("Failed to read config", e); + safeConfig = { error: "Could not read config" }; + } + + // 2. Gateway Status + let gatewayStatus = null; + try { + const { stdout } = await exec("openclaw gateway status --json"); + gatewayStatus = JSON.parse(stdout); + } catch (e) { + // console.error("Failed to get gateway status", e); + // fallback or null + } + + // 3. Heartbeat + let heartbeat = null; + try { + const hbPath = path.join(DEFAULT_WORKSPACE, "memory", "heartbeat-state.json"); + if (fs.existsSync(hbPath)) { + heartbeat = JSON.parse(fs.readFileSync(hbPath, "utf-8")); + } + } catch (e) { + console.error("Failed to read heartbeat", e); + } + + return c.json({ + config: safeConfig, + gateway: gatewayStatus, + heartbeat + }); +}); + +// --------------------------------------------------------------------------- +// Gateway Chat Proxy +// --------------------------------------------------------------------------- +app.post("/api/gateway/chat", async (c) => { + const { gatewayUrl, token, messages } = await c.req.json(); + if (!gatewayUrl || !token || !messages) { + return c.json({ error: "Missing gatewayUrl, token, or messages" }, 400); + } + try { + const url = `${gatewayUrl.replace(/\/+$/, "")}/v1/chat/completions`; + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 30000); + + const resp = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ model: "default", messages }), + signal: controller.signal, + }); + clearTimeout(timeout); + + if (!resp.ok) { + const text = await resp.text(); + return c.json({ error: text }, resp.status as any); + } + const data = await resp.json(); + return c.json(data); + } catch (err: any) { + if (err.name === "AbortError") { + return c.json({ error: "Gateway request timeout (30s)" }, 504); + } + return c.json({ error: err.message || "Gateway request failed" }, 502); + } +}); + +// --------------------------------------------------------------------------- +// AI Summarize +// --------------------------------------------------------------------------- +const GATEWAY_CHAT_URL = process.env.GATEWAY_CHAT_URL || "http://silicon-01:3001/v1/chat/completions"; +const SUMMARIZE_MODEL = process.env.SUMMARIZE_MODEL || "kimi-k2.5"; + +app.post("/api/summarize", async (c) => { + const { workspace } = getAgentFromQuery(c); + const { path: filePath, content: providedContent, save } = await c.req.json(); + const full = safePath(filePath, workspace); + if (!full) return c.json({ error: "Invalid path" }, 400); + + let content = providedContent; + if (!content) { + if (!fs.existsSync(full)) return c.json({ error: "Not found" }, 404); + content = fs.readFileSync(full, "utf-8"); + } + + // Strip existing frontmatter for summarization + const bodyMatch = content.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?([\s\S]*)$/); + const body = bodyMatch ? bodyMatch[1] : content; + + if (body.trim().length < 50) { + return c.json({ error: "Content too short to summarize" }, 400); + } + + try { + const resp = await fetch(GATEWAY_CHAT_URL, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + model: SUMMARIZE_MODEL, + messages: [ + { + role: "system", + content: "You are a concise summarizer. Given a markdown document, produce a brief summary (1-3 sentences, max 200 chars). Reply with ONLY the summary text, no quotes, no prefix.", + }, + { role: "user", content: body.slice(0, 8000) }, + ], + max_tokens: 256, + temperature: 0.3, + }), + signal: AbortSignal.timeout(30000), + }); + + if (!resp.ok) { + const text = await resp.text(); + return c.json({ error: `Gateway error: ${text}` }, 502); + } + + const data: any = await resp.json(); + const summary = (data.choices?.[0]?.message?.content || "").trim(); + if (!summary) return c.json({ error: "Empty summary returned" }, 502); + + // Optionally save to file frontmatter + if (save) { + const existingFm = content.match(/^---\r?\n([\s\S]*?)\r?\n---/); + let newContent: string; + if (existingFm) { + // Update or add summary field in existing frontmatter + const fmContent = existingFm[1]; + if (/^summary:/m.test(fmContent)) { + const updatedFm = fmContent.replace(/^summary:.*$/m, `summary: "${summary.replace(/"/g, '\\"')}"`); + newContent = content.replace(existingFm[0], `---\n${updatedFm}\n---`); + } else { + newContent = content.replace(existingFm[0], `---\n${fmContent}\nsummary: "${summary.replace(/"/g, '\\"')}"\n---`); + } + } else { + newContent = `---\nsummary: "${summary.replace(/"/g, '\\"')}"\n---\n${content}`; + } + fs.writeFileSync(full, newContent, "utf-8"); + const stat = fs.statSync(full); + return c.json({ summary, saved: true, mtime: stat.mtime }); + } + + return c.json({ summary, saved: false }); + } catch (err: any) { + if (err.name === "AbortError" || err.name === "TimeoutError") { + return c.json({ error: "Gateway timeout (30s)" }, 504); + } + return c.json({ error: err.message || "Summarize failed" }, 502); + } +}); + +// --------------------------------------------------------------------------- +// WebSocket — live file change notifications +// --------------------------------------------------------------------------- +const wsClients = new Set(); + +app.get("/ws", upgradeWebSocket(() => ({ + onOpen(_event, ws) { + wsClients.add(ws); + }, + onClose(_event, ws) { + wsClients.delete(ws); + }, +}))); + +function broadcast(data: object) { + const msg = JSON.stringify(data); + for (const ws of wsClients) { + try { ws.send(msg); } catch { /* ignore */ } + } +} + +const watcher = watch(path.join(DEFAULT_WORKSPACE, "**/*.md"), { + ignoreInitial: true, + ignored: /(^|[/\\])\.(git|node_modules)/, + awaitWriteFinish: { stabilityThreshold: 300 }, +}); + +watcher.on("all", (event, filePath) => { + const rel = path.relative(DEFAULT_WORKSPACE, filePath); + broadcast({ type: "file-change", event, path: rel }); +}); + +// --------------------------------------------------------------------------- +// Workspace assets (images, SVGs, etc.) +// --------------------------------------------------------------------------- +app.get("/workspace-assets/*", async (c) => { + const { workspace } = getAgentFromQuery(c); + const assetPath = c.req.path.replace("/workspace-assets/", ""); + const fullPath = path.join(workspace, "assets", assetPath); + if (!fullPath.startsWith(path.join(workspace, "assets"))) { + return c.json({ error: "Invalid path" }, 403); + } + if (!fs.existsSync(fullPath)) { + return c.json({ error: "Not found" }, 404); + } + const ext = path.extname(fullPath).toLowerCase(); + const mimeTypes: Record = { + ".svg": "image/svg+xml", + ".png": "image/png", + ".jpg": "image/jpeg", + ".jpeg": "image/jpeg", + ".gif": "image/gif", + ".webp": "image/webp", + }; + const contentType = mimeTypes[ext] || "application/octet-stream"; + const content = fs.readFileSync(fullPath); + c.header("Content-Type", contentType); + c.header("Cache-Control", "public, max-age=3600"); + return c.body(content); +}); + +// --------------------------------------------------------------------------- +// Cron API — read OpenClaw cron jobs and run history +// --------------------------------------------------------------------------- +const CRON_JOBS_FILE = path.join(os.homedir(), ".openclaw", "cron", "jobs.json"); +const CRON_RUNS_DIR = path.join(os.homedir(), ".openclaw", "cron", "runs"); + +interface CronJob { + id: string; + name?: string; + enabled: boolean; + schedule?: { kind: string; expr?: string; everyMs?: number; at?: string }; + payload?: { kind: string; text?: string; message?: string }; + sessionTarget?: string; + agentId?: string; + wakeMode?: string; + state?: { nextRunAtMs?: number; lastRunAtMs?: number; lastStatus?: string }; + delivery?: { mode?: string }; +} + +function readCronJobs(): CronJob[] { + try { + const data = fs.readFileSync(CRON_JOBS_FILE, "utf-8"); + const json = JSON.parse(data); + return json.jobs || []; + } catch { + return []; + } +} + +function writeCronJobs(jobs: CronJob[]): boolean { + try { + fs.copyFileSync(CRON_JOBS_FILE, CRON_JOBS_FILE + ".bak"); + fs.writeFileSync(CRON_JOBS_FILE, JSON.stringify({ version: 1, jobs }, null, 2)); + return true; + } catch { + return false; + } +} + +function readCronRuns(jobId: string): any[] { + try { + const runFile = path.join(CRON_RUNS_DIR, `${jobId}.jsonl`); + const data = fs.readFileSync(runFile, "utf-8"); + return data.trim().split("\n").filter(Boolean).map(line => { + try { return JSON.parse(line); } catch { return null; } + }).filter(Boolean).reverse(); + } catch { + return []; + } +} + +function formatCronJob(job: CronJob) { + let scheduleDisplay = "-"; + if (job.schedule) { + if (job.schedule.kind === "cron" && job.schedule.expr) scheduleDisplay = job.schedule.expr; + else if (job.schedule.kind === "every" && job.schedule.everyMs) scheduleDisplay = `every ${Math.round(job.schedule.everyMs / 60000)}m`; + else if (job.schedule.kind === "at" && job.schedule.at) scheduleDisplay = `at ${job.schedule.at}`; + } + return { + id: job.id, + name: job.name || "Unnamed", + enabled: job.enabled !== false, + schedule: scheduleDisplay, + scheduleRaw: job.schedule, + nextRun: job.state?.nextRunAtMs ? new Date(job.state.nextRunAtMs).toISOString() : null, + lastRun: job.state?.lastRunAtMs ? new Date(job.state.lastRunAtMs).toISOString() : null, + lastStatus: job.state?.lastStatus || null, + sessionTarget: job.sessionTarget || job.agentId || "-", + wakeMode: job.wakeMode || "next-heartbeat", + payloadKind: job.payload?.kind || "-", + deliveryMode: job.delivery?.mode || "-", + }; +} + +app.get("/api/crons", (c) => { + const jobs = readCronJobs(); + return c.json({ crons: jobs.map(formatCronJob) }); +}); + +app.get("/api/crons/:id/runs", (c) => { + const { id } = c.req.param(); + const runs = readCronRuns(id); + return c.json({ runs: runs.slice(0, 30) }); +}); + +app.post("/api/crons/:id/toggle", async (c) => { + const { id } = c.req.param(); + const { enabled } = await c.req.json(); + try { + const configPath = path.join(os.homedir(), ".openclaw", "openclaw.json"); + const config = JSON.parse(fs.readFileSync(configPath, "utf-8")); + const port = config.gateway?.port || 18789; + const token = config.gateway?.auth?.token || ""; + + const method = enabled ? "cron.update" : "cron.update"; + const resp = await fetch(`http://127.0.0.1:${port}/rpc`, { + method: "POST", + headers: { + "Content-Type": "application/json", + ...(token ? { Authorization: `Bearer ${token}` } : {}), + }, + body: JSON.stringify({ + jsonrpc: "2.0", + id: 1, + method: "cron.update", + params: { jobId: id, patch: { enabled } }, + }), + signal: AbortSignal.timeout(10000), + }); + const result = await resp.json() as any; + if (result.error) { + return c.json({ success: false, error: result.error.message }, 500); + } + return c.json({ success: true, job: result.result }); + } catch (e: any) { + // Fallback to direct file write + const jobs = readCronJobs(); + const idx = jobs.findIndex(j => j.id === id); + if (idx === -1) return c.json({ error: "Job not found" }, 404); + jobs[idx].enabled = enabled; + const ok = writeCronJobs(jobs); + return c.json({ success: ok, job: formatCronJob(jobs[idx]) }); + } +}); + +app.post("/api/crons/:id/run", async (c) => { + const { id } = c.req.param(); + try { + const { execSync } = await import("child_process"); + const scriptPath = path.join(import.meta.dirname || __dirname, "cron-trigger.mjs"); + const result = execSync(`node ${scriptPath} ${id}`, { + timeout: 12000, + cwd: path.dirname(scriptPath), + encoding: "utf-8", + }).trim(); + const parsed = JSON.parse(result) as any; + return c.json(parsed, parsed.success ? 200 : 500); + } catch (e: any) { + const stderr = e.stderr?.trim() || e.message; + return c.json({ success: false, error: stderr }, 500); + } +}); + +// System Crons API — heartbeat, compaction, pruning, session cleanup +// --------------------------------------------------------------------------- +app.get("/api/system-crons", (c) => { + try { + const configPath = path.join(os.homedir(), ".openclaw", "openclaw.json"); + const config = JSON.parse(fs.readFileSync(configPath, "utf-8")); + const defaults = config.agents?.defaults || {}; + const agentList = config.agents?.list || []; + + const systemCrons: any[] = []; + + // Heartbeat + const hbEvery = defaults.heartbeat?.every || "disabled"; + systemCrons.push({ + id: "sys-heartbeat", + name: "💓 心跳检测", + type: "heartbeat", + schedule: hbEvery === "disabled" ? "禁用" : `每 ${hbEvery}`, + enabled: hbEvery !== "disabled", + description: "定期唤醒 agent 执行 HEARTBEAT.md 检查", + agents: agentList.map((a: any) => ({ + id: a.id, + name: a.identity?.name || a.name || a.id, + heartbeat: a.heartbeat?.every || hbEvery, + enabled: (a.heartbeat?.every || hbEvery) !== "disabled", + })), + }); + + // Compaction + const compMode = defaults.compaction?.mode || "off"; + const flushEnabled = defaults.compaction?.memoryFlush?.enabled || false; + const flushThreshold = defaults.compaction?.memoryFlush?.softThresholdTokens; + systemCrons.push({ + id: "sys-compaction", + name: "🗜️ 上下文压缩", + type: "compaction", + schedule: "按需触发", + enabled: compMode !== "off", + description: `模式: ${compMode}${flushEnabled ? ` | Memory flush: ${flushThreshold ? flushThreshold + " tokens" : "启用"}` : ""}`, + }); + + // Context Pruning + const pruneMode = defaults.contextPruning?.mode || "off"; + const pruneTTL = defaults.contextPruning?.ttl; + systemCrons.push({ + id: "sys-context-pruning", + name: "✂️ 上下文修剪", + type: "context-pruning", + schedule: pruneTTL ? `TTL ${pruneTTL}` : "按需", + enabled: pruneMode !== "off", + description: `模式: ${pruneMode}${pruneTTL ? ` | 缓存过期: ${pruneTTL}` : ""}`, + }); + + // Session cleanup (2026.2.9 feature) + systemCrons.push({ + id: "sys-session-cleanup", + name: "🗑️ Session 清理", + type: "session-cleanup", + schedule: "自动", + enabled: true, + description: "自动修剪过期 session,防止磁盘占满", + }); + + // QMD Memory refresh + const qmd = config.memory?.qmd; + if (qmd && config.memory?.backend === "qmd") { + systemCrons.push({ + id: "sys-qmd-refresh", + name: "🧠 QMD 记忆索引", + type: "qmd", + schedule: qmd.update?.interval ? `每 ${qmd.update.interval}` : "手动", + enabled: true, + description: `后台刷新: ${qmd.update?.onBoot ? "启动时 + " : ""}${qmd.update?.interval || "手动"}`, + }); + } + + return c.json({ systemCrons }); + } catch (e: any) { + return c.json({ error: e.message }, 500); + } +}); + +// --------------------------------------------------------------------------- +// Static file serving +// --------------------------------------------------------------------------- +if (fs.existsSync(STATIC_DIR)) { + app.use("/assets/*", serveStatic({ + root: STATIC_DIR, + rewriteRequestPath: (p) => p, + })); + app.use("*", serveStatic({ root: STATIC_DIR })); + // SPA fallback + app.get("*", (c) => { + const html = fs.readFileSync(path.join(STATIC_DIR, "index.html"), "utf-8"); + c.header("Cache-Control", "no-cache, no-store, must-revalidate"); + return c.html(html); + }); +} + +// --------------------------------------------------------------------------- +// Start +// --------------------------------------------------------------------------- +if (process.env.NODE_ENV !== 'test') { + const server = serve({ fetch: app.fetch, port: PORT, hostname: "0.0.0.0" }, (info) => { + console.log(`📝 Memory Viewer running at http://localhost:${info.port}`); + console.log(`📂 Default Workspace: ${DEFAULT_WORKSPACE}`); + }); + injectWebSocket(server); +} diff --git a/memory-viewer/src/App.tsx b/memory-viewer/src/App.tsx new file mode 100644 index 0000000..76d0c52 --- /dev/null +++ b/memory-viewer/src/App.tsx @@ -0,0 +1,624 @@ +import { useEffect, useState, useCallback } from "react"; +import { fetchFiles, fetchSkills, setBaseUrl, getBaseUrl, type FileNode, type SkillInfo } from "./api"; +import { FileTree } from "./components/FileTree"; +import { FileViewer } from "./components/FileViewer"; +import { Dashboard } from "./components/Dashboard"; +import { SearchPanel } from "./components/SearchPanel"; +import { Connections } from "./components/Connections"; +import { Changelog } from "./components/Changelog"; +import { SkillsPage } from "./components/SkillsPage"; +import { Timeline } from "./components/Timeline"; +import { useWebSocket } from "./hooks/useWebSocket"; +import { useTheme } from "./hooks/useTheme"; +import { useSensitiveState, SensitiveProvider } from "./hooks/useSensitive"; +import { useConnections } from "./hooks/useConnections"; +import { useAgents } from "./hooks/useAgents"; +import { AgentStatusPage } from "./components/AgentStatus"; +import { SettingsPage } from "./components/SettingsPage"; +import { Tags } from "./components/Tags"; +import { CronManager } from "./components/CronManager"; +import { BookOpen, X, List, MagnifyingGlass, Sun, Moon, Eye, EyeSlash, Translate, ShareNetwork, CaretDown, CaretUp, ArrowsClockwise, Gear, Monitor, PuzzlePiece, CaretRight, Calendar, SquaresFour, Power, Clock, Tag, Robot, Timer } from "@phosphor-icons/react"; +import { useSyncExternalStore } from "react"; +import { pluginRegistry } from "./plugins/registry"; +import { useZoom } from "./hooks/useZoom"; +import { useMarkdownTheme } from "./themes"; +import { useResizableSidebar } from "./hooks/useResizableSidebar"; +import { useLocaleState, LocaleContext } from "./hooks/useLocale"; + +export default function App() { + const [files, setFiles] = useState([]); + const [skills, setSkills] = useState([]); + const [activeFile, setActiveFile] = useState(""); + const [view, setView] = useState<"dashboard" | "file" | "connections" | "changelog" | "agent-status" | "skills" | "timeline" | "tags" | "cron" | "settings">("dashboard"); + const [sidebarOpen, setSidebarOpen] = useState(false); + const [searchOpen, setSearchOpen] = useState(false); + const [refreshKey, setRefreshKey] = useState(0); + const [botSelectorOpen, setBotSelectorOpen] = useState(false); + const [agentSelectorOpen, setAgentSelectorOpen] = useState(false); + const [settingsOpen, setSettingsOpen] = useState(false); + const [quickAccessOpen, setQuickAccessOpen] = useState(() => localStorage.getItem("memory-viewer-quickaccess-open") === "true"); + const [teslaMode, setTeslaMode] = useState(() => localStorage.getItem("memory-viewer-tesla") === "true"); + const { zoom, setZoom, ZOOM_LEVELS } = useZoom(); + const { current: currentMdTheme, setTheme: setMdTheme, themes: mdThemes } = useMarkdownTheme(); + const { width: sidebarWidth, onMouseDown: onResizeMouseDown, onTouchStart: onResizeTouchStart } = useResizableSidebar(); + const { theme, toggle: toggleTheme } = useTheme(); + const sensitive = useSensitiveState(); + const localeState = useLocaleState(); + const { t, toggleLocale, locale } = localeState; + const connState = useConnections(); + const agentsState = useAgents(); + const pluginVersion = useSyncExternalStore(pluginRegistry.subscribe, pluginRegistry.getSnapshot); + const allPlugins = pluginRegistry.getAll(); + + // Sync baseUrl when active connection changes + useEffect(() => { + setBaseUrl(connState.active.url); + }, [connState.active]); + + const loadFiles = useCallback(() => { + fetchFiles().then(setFiles).catch(console.error); + fetchSkills().then(setSkills).catch(console.error); + }, []); + + // Reload files when active connection or agent changes + useEffect(() => { + loadFiles(); + }, [loadFiles, connState.active.id, agentsState.selectedAgentId]); + + // Live reload via WebSocket + useWebSocket((data) => { + if (data.type === "file-change") { + loadFiles(); + if (data.path === activeFile) { + setRefreshKey((k) => k + 1); + } + } + }, connState.active.url); + + // Ctrl+K to open search + useEffect(() => { + const handler = (e: KeyboardEvent) => { + if ((e.ctrlKey || e.metaKey) && e.key === "k") { + e.preventDefault(); + setSearchOpen(true); + } + }; + window.addEventListener("keydown", handler); + return () => window.removeEventListener("keydown", handler); + }, []); + + // Close bot selector on outside click + useEffect(() => { + if (!botSelectorOpen) return; + const handler = () => setBotSelectorOpen(false); + setTimeout(() => document.addEventListener("click", handler), 0); + return () => document.removeEventListener("click", handler); + }, [botSelectorOpen]); + + // Close agent selector on outside click + useEffect(() => { + if (!agentSelectorOpen) return; + const handler = () => setAgentSelectorOpen(false); + setTimeout(() => document.addEventListener("click", handler), 0); + return () => document.removeEventListener("click", handler); + }, [agentSelectorOpen]); + + // Close settings on outside click + useEffect(() => { + if (!settingsOpen) return; + const handler = () => setSettingsOpen(false); + setTimeout(() => document.addEventListener("click", handler), 0); + return () => document.removeEventListener("click", handler); + }, [settingsOpen]); + + // Sync hash → state on load and popstate + useEffect(() => { + const readHash = () => { + const hash = window.location.hash; + if (hash.startsWith("#/file/")) { + const path = decodeURIComponent(hash.slice(7)); + if (path) { + setActiveFile(path); + setView("file"); + return; + } + } + if (hash === "#/agent-status") { setView("agent-status"); return; } + if (hash === "#/connections") { setView("connections"); return; } + if (hash === "#/changelog") { setView("changelog"); return; } + if (hash === "#/skills") { setView("skills"); return; } + if (hash === "#/timeline") { setView("timeline"); return; } + if (hash === "#/tags") { setView("tags"); return; } + if (hash === "#/cron") { setView("cron"); return; } + if (hash === "#/settings") { setView("settings"); return; } + }; + readHash(); + window.addEventListener("popstate", readHash); + return () => window.removeEventListener("popstate", readHash); + }, []); + + const openFile = (path: string) => { + setActiveFile(path); + setView("file"); + setSidebarOpen(false); + window.history.pushState(null, "", `#/file/${encodeURIComponent(path)}`); + }; + + const goHome = () => { + setView("dashboard"); + setActiveFile(""); + setSidebarOpen(false); + window.history.pushState(null, "", window.location.pathname); + }; + + const switchBot = (id: string) => { + connState.switchTo(id); + setBotSelectorOpen(false); + setView("dashboard"); + setActiveFile(""); + }; + + const switchAgent = (agentId: string) => { + agentsState.selectAgent(agentId); + setAgentSelectorOpen(false); + setView("dashboard"); + setActiveFile(""); + // Reload files for new agent + setTimeout(() => loadFiles(), 0); + }; + + const online = connState.statuses[connState.active.id] ?? (connState.active.isLocal ? true : false); + const todayFile = `memory/${new Date().toISOString().slice(0, 10)}.md`; + + // Show agent selector only for local connections with multiple agents + const showAgentSelector = connState.active.isLocal && agentsState.agents.length > 1; + + return ( + + +
+ {/* Mobile overlay */} + {sidebarOpen && ( +
setSidebarOpen(false)} /> + )} + + {/* Sidebar - Redesigned */} + + + {/* Main content */} +
+ {/* Mobile top bar */} +
+ + + {view === "file" ? activeFile : view === "changelog" ? t("changelog.title") : view === "connections" ? t("connections.title") : view === "agent-status" ? t("sidebar.agentConfig") : view === "timeline" ? t("timeline.title") : view === "tags" ? t("tags.title") : view === "cron" ? t("cron.title") : view === "settings" ? t("settings.title") : t("dashboard.title")} + + + + + +
+ +
+ {view === "changelog" ? ( + + ) : view === "agent-status" ? ( + + ) : view === "skills" ? ( + + ) : view === "connections" ? ( +
+ +
+ ) : view === "timeline" ? ( +
+ +
+ ) : view === "tags" ? ( +
+ +
+ ) : view === "cron" ? ( + + ) : view === "settings" ? ( + + ) : view === "dashboard" ? ( +
+ +
+ ) : ( + + )} +
+
+ + {/* Search modal */} + {searchOpen && ( + setSearchOpen(false)} /> + )} +
+ + + ); +} diff --git a/memory-viewer/src/api.ts b/memory-viewer/src/api.ts new file mode 100644 index 0000000..31b5143 --- /dev/null +++ b/memory-viewer/src/api.ts @@ -0,0 +1,404 @@ +/** API client for Memory Viewer backend. */ + +let _baseUrl = ""; +let _currentAgent: string | null = null; + +export function getBaseUrl(): string { + return _baseUrl; +} + +export function setBaseUrl(url: string) { + _baseUrl = url.replace(/\/+$/, ""); +} + +export function getCurrentAgent(): string | null { + return _currentAgent; +} + +export function setCurrentAgent(agentId: string | null) { + _currentAgent = agentId; +} + +// Helper to build URL with agent parameter +function buildUrl(endpoint: string, params?: Record): string { + const base = _baseUrl || window.location.origin; + const url = new URL(`${base}${endpoint}`); + if (_currentAgent) { + url.searchParams.set("agent", _currentAgent); + } + if (params) { + Object.entries(params).forEach(([key, value]) => { + url.searchParams.set(key, value); + }); + } + return url.toString(); +} + +export interface FileNode { + name: string; + type: "file" | "dir"; + path: string; + children?: FileNode[]; +} + +export interface FileData { + content: string; + mtime: string; + size: number; +} + +export interface SystemInfo { + uptime: number; + memTotal: number; + memFree: number; + memUsed: number; + load: number[]; + platform: string; + hostname: string; + totalFiles: number; + todayMemory: { + filename: string; + snippet: string; + length: number; + } | null; +} + +export interface SearchResult { + path: string; + matches: { line: number; text: string }[]; +} + +export interface BotInfo { + name: string; + version: string; + description: string; +} + +export interface SkillInfo { id: string; name: string; description: string; path: string; } + +// Agent types +export interface AgentInfo { + id: string; + name: string; + workspace: string; + emoji: string; + skills?: string[]; +} + +export async function fetchAgents(): Promise { + const r = await fetch(`${_baseUrl}/api/agents`); + if (!r.ok) throw new Error("Failed to load agents"); + return r.json(); +} + +export async function fetchSkills(): Promise { + const r = await fetch(buildUrl("/api/skills")); + return r.json(); +} + +export async function fetchFiles(): Promise { + const r = await fetch(buildUrl("/api/files")); + return r.json(); +} + +export async function fetchFile(path: string): Promise { + const r = await fetch(buildUrl("/api/file", { path })); + if (!r.ok) throw new Error("Failed to load file"); + return r.json(); +} + +export interface SaveResult { + ok: boolean; + mtime: string; +} + +export interface ConflictResult { + error: "conflict"; + message: string; + serverMtime: string; + serverContent: string; +} + +export async function saveFile( + path: string, + content: string, + expectedMtime?: string +): Promise { + const r = await fetch(buildUrl("/api/file"), { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ path, content, expectedMtime }), + }); + return r.json(); +} + +export async function fetchSystem(): Promise { + const r = await fetch(buildUrl("/api/system")); + return r.json(); +} + +export async function searchFiles(query: string): Promise { + const r = await fetch(buildUrl("/api/search", { q: query })); + return r.json(); +} + +export interface SemanticResult { + path: string; + title: string; + snippet: string; + score: number; +} + +export async function semanticSearch(query: string, mode: "bm25" | "vector" = "bm25"): Promise { + const r = await fetch(buildUrl("/api/semantic-search", { q: query, mode })); + return r.json(); +} + +export interface RecentFile { + path: string; + mtime: number; + size: number; +} + +export interface MonthlyStats { + month: string; + count: number; +} + +export interface TimelineEntry { + date: string; + path: string; + title: string; + preview: string; + tags: string[]; + charCount: number; +} + +export async function fetchTimeline(): Promise { + const r = await fetch(buildUrl("/api/timeline")); + return r.json(); +} + +// ============================================================================ +// Tags API +// ============================================================================ + +export interface TagInfo { + name: string; + count: number; + files: string[]; +} + +export interface FileWithTags { + path: string; + title: string; + preview: string; + date: string; + tags: string[]; +} + +export async function fetchTags(): Promise { + const r = await fetch(buildUrl("/api/tags")); + return r.json(); +} + +export async function fetchFilesByTag(tag: string): Promise { + const r = await fetch(buildUrl(`/api/files-by-tag/${encodeURIComponent(tag)}`)); + return r.json(); +} + +export async function fetchRecent(limit = 10): Promise { + const r = await fetch(buildUrl("/api/recent", { limit: String(limit) })); + return r.json(); +} + +export async function fetchMonthlyStats(): Promise { + const r = await fetch(buildUrl("/api/stats/monthly")); + return r.json(); +} + +export interface DailyStats { date: string; count: number; size: number; } + +export async function fetchDailyStats(): Promise { + const r = await fetch(buildUrl("/api/stats/daily")); + return r.json(); +} + +export async function fetchBotInfo(baseUrl = ""): Promise { + const url = baseUrl ? baseUrl.replace(/\/+$/, "") : _baseUrl; + const r = await fetch(`${url}/api/info${_currentAgent ? `?agent=${_currentAgent}` : ""}`); + return r.json(); +} + +export async function checkConnection(baseUrl: string): Promise { + try { + const r = await fetch(`${baseUrl.replace(/\/+$/, "")}/api/system`, { signal: AbortSignal.timeout(5000) }); + return r.ok; + } catch { + return false; + } +} + +export interface AgentStatus { + config: any; + gateway: any; + heartbeat: any; +} + +export interface WikilinkResolution { + found: boolean; + path: string | null; +} + +export async function resolveWikilink(link: string): Promise { + const r = await fetch(buildUrl("/api/resolve-wikilink", { link })); + return r.json(); +} + +export interface SummarizeResult { + summary: string; + saved: boolean; + mtime?: string; + error?: string; +} + +export async function summarizeFile(path: string, save = false): Promise { + const r = await fetch(buildUrl("/api/summarize"), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ path, save }), + }); + const data = await r.json(); + if (!r.ok) throw new Error(data.error || "Summarize failed"); + return data; +} + +export async function fetchAgentStatus(): Promise { + const r = await fetch(`${_baseUrl}/api/agent/status${_currentAgent ? `?agent=${_currentAgent}` : ""}`); + return r.json(); +} + +// ============================================================================ +// Cron API +// ============================================================================ + +export interface CronJob { + id: string; + name: string; + enabled: boolean; + schedule: string; + scheduleRaw: any; + nextRun: string | null; + lastRun: string | null; + lastStatus: string | null; + sessionTarget: string; + wakeMode: string; + payloadKind: string; + deliveryMode: string; +} + +export interface CronRun { + status: string; + startedAt?: string; + runAtMs?: number; + ts?: number; + completedAt?: string; + sessionKey?: string; + durationMs?: number; +} + +export interface SystemCron { + id: string; + name: string; + type: string; + schedule: string; + enabled: boolean; + description: string; + agents?: { id: string; name: string; heartbeat: string; enabled: boolean }[]; +} + +export async function fetchSystemCrons(): Promise { + const r = await fetch(buildUrl("/api/system-crons")); + const data = await r.json(); + return data.systemCrons || []; +} + +export async function fetchCronJobs(): Promise { + const r = await fetch(buildUrl("/api/crons")); + const data = await r.json(); + return data.crons || []; +} + +export async function fetchCronRuns(jobId: string): Promise { + const r = await fetch(buildUrl(`/api/crons/${jobId}/runs`)); + const data = await r.json(); + return data.runs || []; +} + +export async function toggleCronJob(jobId: string, enabled: boolean): Promise<{ success: boolean }> { + const r = await fetch(buildUrl(`/api/crons/${jobId}/toggle`), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ enabled }), + }); + return r.json(); +} + +export async function runCronJob(jobId: string): Promise<{ success: boolean; result?: string; error?: string }> { + const r = await fetch(buildUrl(`/api/crons/${jobId}/run`), { + method: "POST", + headers: { "Content-Type": "application/json" }, + }); + return r.json(); +} + +export interface EmbeddingSettings { + enabled: boolean; + apiUrl: string; + apiKey: string; + model: string; + apiKeySet?: boolean; +} + +export interface Settings { + embedding: EmbeddingSettings; +} + +export interface Capabilities { + qmd: boolean; + qmdBm25: boolean; + qmdVector: boolean; + embeddingApi: boolean; +} + +export async function fetchCapabilities(): Promise { + try { + const r = await fetch(buildUrl("/api/capabilities")); + return r.json(); + } catch { + return { qmd: false, qmdBm25: false, qmdVector: false, embeddingApi: false }; + } +} + +export async function fetchSettings(): Promise { + const r = await fetch(buildUrl("/api/settings")); + return r.json(); +} + +export async function saveSettings(settings: Partial): Promise<{ success: boolean }> { + const r = await fetch(buildUrl("/api/settings"), { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(settings), + }); + return r.json(); +} + +export async function testEmbeddingConnection(settings?: Partial): Promise<{ success: boolean; error?: string }> { + const r = await fetch(buildUrl("/api/settings/test-embedding"), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(settings || {}), + }); + return r.json(); +} diff --git a/memory-viewer/src/components/AgentStatus.test.tsx b/memory-viewer/src/components/AgentStatus.test.tsx new file mode 100644 index 0000000..ccaba28 --- /dev/null +++ b/memory-viewer/src/components/AgentStatus.test.tsx @@ -0,0 +1,42 @@ +import { describe, it, expect } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import { AgentStatusPage } from '../components/AgentStatus'; +import { LocaleContext } from '../hooks/useLocale'; + +// Mock dependencies +vi.mock('../api', () => ({ + fetchAgentStatus: vi.fn().mockResolvedValue({ + config: { version: '1.2.0', update: { channel: 'stable' } }, + gateway: { runtime: { status: 'running', pid: 1234 } }, + heartbeat: { lastRun: Date.now() } + }) +})); + +// Mock shiki +vi.mock('shiki', () => ({ + createHighlighter: vi.fn().mockResolvedValue({ + codeToHtml: () => '
mock code
' + }) +})); + +describe('AgentStatusPage', () => { + it('renders loading state initially', () => { + // We can't easily test loading state with async useEffect, + // but we can test the happy path after wait + }); + + it('renders status after load', async () => { + const mockLocale = { t: (k: string) => k, toggleLocale: () => {}, locale: 'en' as const }; + + render( + + + + ); + + // Should eventually show the version + expect(await screen.findByText('v1.2.0')).toBeInTheDocument(); + // Should show gateway running status key + expect(screen.getByText('agent.running')).toBeInTheDocument(); + }); +}); diff --git a/memory-viewer/src/components/AgentStatus.tsx b/memory-viewer/src/components/AgentStatus.tsx new file mode 100644 index 0000000..91140fc --- /dev/null +++ b/memory-viewer/src/components/AgentStatus.tsx @@ -0,0 +1,236 @@ +import { useEffect, useState } from "react"; +import { fetchAgentStatus, type AgentStatus } from "../api"; +import { createHighlighter } from "shiki"; +import { Pulse, HardDrives, Shield, Cpu, Clock, CaretDown, CaretRight, CheckCircle, XCircle, Heartbeat, Lightning } from "@phosphor-icons/react"; +import { useLocale } from "../hooks/useLocale"; + +function StatusCard({ title, icon: Icon, children, className = "" }: any) { + return ( +
+
+
+ +
+

{title}

+
+ {children} +
+ ); +} + +function StatusRow({ label, value, sub }: any) { + return ( +
+ {label} +
+
{value}
+ {sub &&
{sub}
} +
+
+ ); +} + +function TimeAgo({ date }: { date: string | number }) { + if (!date) return -; + const d = new Date(date); + const now = new Date(); + const diff = Math.floor((now.getTime() - d.getTime()) / 1000); + + let text = ""; + if (diff < 60) text = `${diff}s ago`; + else if (diff < 3600) text = `${Math.floor(diff / 60)}m ago`; + else if (diff < 86400) text = `${Math.floor(diff / 3600)}h ago`; + else text = `${Math.floor(diff / 86400)}d ago`; + + return {text}; +} + +// Module-level cache so switching tabs doesn't re-fetch +let _cache: { data: AgentStatus; html: string } | null = null; + +export function AgentStatusPage() { + const [data, setData] = useState(_cache?.data ?? null); + const [loading, setLoading] = useState(!_cache); + const [html, setHtml] = useState(_cache?.html ?? ""); + const [configExpanded, setConfigExpanded] = useState(false); + const { t } = useLocale(); + + useEffect(() => { + if (_cache) return; // Already have data, skip fetch + fetchAgentStatus() + .then(d => { + setData(d); + setLoading(false); + // Highlight config with dual theme + createHighlighter({ + themes: ['github-dark', 'github-light'], + langs: ['json'] + }).then(highlighter => { + const code = JSON.stringify(d.config, null, 2); + const out = highlighter.codeToHtml(code, { + lang: 'json', + themes: { dark: 'github-dark', light: 'github-light' }, + defaultColor: false, + }); + setHtml(out); + _cache = { data: d, html: out }; + }); + }) + .catch(err => { + console.error(err); + setLoading(false); + }); + }, []); + + if (loading) { + return ( +
+
+ {/* Header skeleton */} +
+
+
+
+
+
+
+ + {/* Cards skeleton */} +
+ {[1, 2, 3].map((i) => ( +
+
+
+
+
+
+
+
+
+
+
+
+ ))} +
+ + {/* Config skeleton */} +
+
+
+ ); + } + + if (!data) { + return ( +
+ {t("agent.error")} +
+ ); + } + + const gw = data.gateway || {}; + // Support both flat (gw.runtime) and nested (gw.service.runtime) structures + const runtime = gw.runtime || gw.service?.runtime || {}; + const gwInfo = gw.gateway || {}; + const isGwRunning = runtime.status === "running" || runtime.state === "active" || (runtime.pid && runtime.pid > 0); + const hb = data.heartbeat || {}; + const checks = hb.checks || {}; + + return ( +
+
+ + {/* Header */} +
+

+ + {t("agent.title")} +

+
+ v{data.config.version || "0.0.0"} + {data.config.update?.channel || "stable"} {t("agent.channel")} +
+
+ +
+ + {/* Gateway Card */} + +
+
+ {isGwRunning ? t("agent.running") : t("agent.stopped")} + {isGwRunning && gw.gateway?.uptime && {t("agent.uptime")}} +
+
+ + + +
+ + + {/* Models Card */} + +
+
{t("agent.primary")}
+
+ {data.config.agents?.defaults?.model?.primary || "default"} +
+
+ {/* If we had more model stats they would go here */} +
+ + {t("agent.ready")} +
+
+ + {/* Heartbeat Card */} + +
+ {hb.lastRun ? ( + <> +
+ +
+
{t("agent.lastActivity")}
+ + ) : ( +
{t("agent.noHeartbeat")}
+ )} +
+
+ {Object.entries(checks).map(([k, v]) => ( + : "-"} /> + ))} +
+
+ +
+ + {/* Config Section */} +
+ + + {configExpanded && ( +
+
Loading...

" }} + /> + + )} + + + + + ); +} diff --git a/memory-viewer/src/components/BootstrapWizard.tsx b/memory-viewer/src/components/BootstrapWizard.tsx new file mode 100644 index 0000000..572708e --- /dev/null +++ b/memory-viewer/src/components/BootstrapWizard.tsx @@ -0,0 +1,209 @@ +import { useState, useEffect, useCallback } from "react"; +import { SpinnerGap, CheckCircle, XCircle, Rocket, ArrowRight } from "@phosphor-icons/react"; +import { useLocale } from "../hooks/useLocale"; + +type Step = "checking" | "confirm" | "installing" | "verifying" | "success" | "failed"; + +interface BootstrapWizardProps { + name: string; + gatewayUrl: string; + token: string; + mvPort: number; + onComplete: (mvUrl: string) => void; + onCancel: () => void; +} + +function extractHost(gatewayUrl: string): string { + try { + return new URL(gatewayUrl).hostname; + } catch { + return gatewayUrl.replace(/^https?:\/\//, "").split(":")[0].split("/")[0]; + } +} + +const INSTALL_PROMPT = `Please install and start the Memory Viewer server. Run these commands: + +1. Clone the repo: + cd ~ && git clone https://github.com/silicondawn/memory-viewer.git + +2. Install dependencies and build: + cd memory-viewer && npm install && npm run build + +3. Start the server (replace WORKSPACE_DIR with your actual workspace path): + PORT=8901 WORKSPACE_DIR=~/clawd node --import tsx/esm server/index.ts & + +4. Verify it's running: + curl -s http://localhost:8901/api/system + +Please run these commands and confirm when the server is running.`; + +export function BootstrapWizard({ name, gatewayUrl, token, mvPort, onComplete, onCancel }: BootstrapWizardProps) { + const { t } = useLocale(); + const [step, setStep] = useState("checking"); + const [botResponse, setBotResponse] = useState(""); + const [error, setError] = useState(""); + + const host = extractHost(gatewayUrl); + const mvUrl = `http://${host}:${mvPort}`; + + const checkConnection = useCallback(async (): Promise => { + try { + const r = await fetch(`${mvUrl}/api/system`, { signal: AbortSignal.timeout(5000) }); + return r.ok; + } catch { + return false; + } + }, [mvUrl]); + + // Step 1: initial check + useEffect(() => { + if (step !== "checking") return; + checkConnection().then((ok) => { + if (ok) { + onComplete(mvUrl); + setStep("success"); + } else { + setStep("confirm"); + } + }); + }, [step, checkConnection, mvUrl, onComplete]); + + const doInstall = async () => { + setStep("installing"); + setBotResponse(""); + setError(""); + try { + const resp = await fetch("/api/gateway/chat", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + gatewayUrl, + token, + messages: [{ role: "user", content: INSTALL_PROMPT.replace(/PORT=8901/g, `PORT=${mvPort}`) }], + }), + }); + if (!resp.ok) { + const data = await resp.json().catch(() => ({ error: resp.statusText })); + throw new Error(data.error || `HTTP ${resp.status}`); + } + const data = await resp.json(); + const content = data.choices?.[0]?.message?.content || JSON.stringify(data); + setBotResponse(content); + + // Step 4: verify + setStep("verifying"); + // Wait a bit then check + await new Promise((r) => setTimeout(r, 3000)); + const ok = await checkConnection(); + if (ok) { + onComplete(mvUrl); + setStep("success"); + } else { + // Retry a few times + for (let i = 0; i < 3; i++) { + await new Promise((r) => setTimeout(r, 5000)); + if (await checkConnection()) { + onComplete(mvUrl); + setStep("success"); + return; + } + } + setStep("failed"); + } + } catch (err: any) { + setError(err.message); + setStep("failed"); + } + }; + + const retryVerify = async () => { + setStep("verifying"); + await new Promise((r) => setTimeout(r, 2000)); + const ok = await checkConnection(); + if (ok) { + onComplete(mvUrl); + setStep("success"); + } else { + setStep("failed"); + } + }; + + const inputStyle = { background: "var(--bg-hover)", color: "var(--text-primary)", border: "1px solid var(--border)" }; + + return ( +
+

+ Bootstrap: {name} +

+
+ {mvUrl} +
+ + {step === "checking" && ( +
+ {t("bootstrap.checking")} +
+ )} + + {step === "confirm" && ( +
+

{t("bootstrap.notInstalled")}

+

{t("bootstrap.installPrompt")}

+
+ + +
+
+ )} + + {step === "installing" && ( +
+
+ {t("bootstrap.installing")} +
+
+ )} + + {step === "verifying" && ( +
+ {botResponse && ( +
+
{t("bootstrap.botResponse")}:
+ {botResponse} +
+ )} +
+ {t("bootstrap.verifying")} +
+
+ )} + + {step === "success" && ( +
+ {t("bootstrap.success")} +
+ )} + + {step === "failed" && ( +
+ {botResponse && ( +
+
{t("bootstrap.botResponse")}:
+ {botResponse} +
+ )} + {error && ( +
{t("bootstrap.error")}: {error}
+ )} +
{t("bootstrap.failed")}
+
+ + +
+
+ )} +
+ ); +} diff --git a/memory-viewer/src/components/Changelog.tsx b/memory-viewer/src/components/Changelog.tsx new file mode 100644 index 0000000..8ea61b3 --- /dev/null +++ b/memory-viewer/src/components/Changelog.tsx @@ -0,0 +1,33 @@ +import { useEffect, useState } from "react"; +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import { useLocale } from "../hooks/useLocale"; +import { ArrowLeft } from "@phosphor-icons/react"; + +// Bundled at build time via ?raw +import changelogRaw from "../../CHANGELOG.md?raw"; + +export function Changelog({ onBack }: { onBack: () => void }) { + const { t } = useLocale(); + + return ( +
+
+ + +
+ + {changelogRaw} + +
+
+
+ ); +} diff --git a/memory-viewer/src/components/Connections.tsx b/memory-viewer/src/components/Connections.tsx new file mode 100644 index 0000000..93583ae --- /dev/null +++ b/memory-viewer/src/components/Connections.tsx @@ -0,0 +1,275 @@ +import { useState } from "react"; +import { type BotConnection } from "../hooks/useConnections"; +import { ShareNetwork, Plus, Trash, PencilSimple, Check, X, ArrowsClockwise } from "@phosphor-icons/react"; +import { useLocale } from "../hooks/useLocale"; +import { BootstrapWizard } from "./BootstrapWizard"; + +interface ConnectionsProps { + connections: BotConnection[]; + statuses: Record; + activeId: string; + onAdd: (conn: Omit) => void; + onUpdate: (id: string, updates: Partial) => void; + onRemove: (id: string) => void; + onSwitch: (id: string) => void; + onRefresh: () => void; +} + +type ConnMode = "direct" | "gateway"; + +interface GatewayBootstrap { + name: string; + gatewayUrl: string; + token: string; + mvPort: number; +} + +export function Connections({ connections, statuses, activeId, onAdd, onUpdate, onRemove, onSwitch, onRefresh }: ConnectionsProps) { + const { t } = useLocale(); + const [showForm, setShowForm] = useState(false); + const [editId, setEditId] = useState(null); + const [mode, setMode] = useState("direct"); + const [form, setForm] = useState({ name: "", url: "", token: "" }); + const [gwForm, setGwForm] = useState({ name: "", gatewayUrl: "", token: "", mvPort: "8901" }); + const [bootstrap, setBootstrap] = useState(null); + + const startAdd = () => { + setForm({ name: "", url: "", token: "" }); + setGwForm({ name: "", gatewayUrl: "", token: "", mvPort: "8901" }); + setEditId(null); + setMode("direct"); + setShowForm(true); + }; + + const startEdit = (conn: BotConnection) => { + setForm({ name: conn.name, url: conn.url, token: conn.token || "" }); + setEditId(conn.id); + setMode("direct"); + setShowForm(true); + }; + + const save = () => { + if (mode === "direct") { + if (!form.name.trim() || !form.url.trim()) return; + if (editId) { + onUpdate(editId, { name: form.name.trim(), url: form.url.trim(), token: form.token.trim() || undefined }); + } else { + onAdd({ name: form.name.trim(), url: form.url.trim(), token: form.token.trim() || undefined }); + } + setShowForm(false); + setEditId(null); + setTimeout(onRefresh, 500); + } else { + // Gateway mode — start bootstrap + if (!gwForm.name.trim() || !gwForm.gatewayUrl.trim() || !gwForm.token.trim()) return; + setBootstrap({ + name: gwForm.name.trim(), + gatewayUrl: gwForm.gatewayUrl.trim(), + token: gwForm.token.trim(), + mvPort: parseInt(gwForm.mvPort) || 8901, + }); + setShowForm(false); + } + }; + + const handleBootstrapComplete = (mvUrl: string) => { + if (!bootstrap) return; + onAdd({ name: bootstrap.name, url: mvUrl }); + setTimeout(onRefresh, 500); + }; + + const inputStyle = { + background: "var(--bg-hover)", + color: "var(--text-primary)", + border: "1px solid var(--border)", + }; + + return ( +
+
+

+ {t("connections.title")} +

+
+ + +
+
+ + {/* Bootstrap Wizard */} + {bootstrap && ( + setBootstrap(null)} + /> + )} + + {/* Add/Edit form */} + {showForm && ( +
+
+

+ {editId ? t("connections.edit") : t("connections.addNew")} +

+ {!editId && ( +
+ + +
+ )} +
+ + {mode === "direct" ? ( +
+ setForm((f) => ({ ...f, name: e.target.value }))} + /> + setForm((f) => ({ ...f, url: e.target.value }))} + /> + setForm((f) => ({ ...f, token: e.target.value }))} + /> +
+ ) : ( +
+ setGwForm((f) => ({ ...f, name: e.target.value }))} + /> + setGwForm((f) => ({ ...f, gatewayUrl: e.target.value }))} + /> + setGwForm((f) => ({ ...f, token: e.target.value }))} + /> + setGwForm((f) => ({ ...f, mvPort: e.target.value }))} + /> +
+ )} + +
+ + +
+
+ )} + + {/* Connection list */} +
+ {connections.map((conn) => { + const online = statuses[conn.id] ?? false; + const isActive = conn.id === activeId; + return ( +
onSwitch(conn.id)} + > +
+
+ + + {conn.name} + +
+ {!conn.isLocal && ( +
+ + +
+ )} +
+
+ {conn.isLocal ? "localhost (current)" : conn.url} +
+ {isActive && ( +
+ ● {t("connections.active")} +
+ )} +
+ ); + })} +
+
+ ); +} diff --git a/memory-viewer/src/components/ContributionHeatmap.tsx b/memory-viewer/src/components/ContributionHeatmap.tsx new file mode 100644 index 0000000..56a44ab --- /dev/null +++ b/memory-viewer/src/components/ContributionHeatmap.tsx @@ -0,0 +1,227 @@ +import { useMemo, useState, useSyncExternalStore } from "react"; +import type { DailyStats } from "../api"; +import { useLocale } from "../hooks/useLocale"; + +const CELL = 11; +const GAP = 2; +const STEP = CELL + GAP; + +const COLORS_DARK = ["#1a1c2b", "#1b3a2a", "#1a5c35", "#26a641", "#39d353"]; +const COLORS_LIGHT = ["#f0e8de", "#d4c4a0", "#b49555", "#92400e", "#78350f"]; + +function useIsDark() { + return useSyncExternalStore( + (cb) => { + const obs = new MutationObserver(cb); + obs.observe(document.documentElement, { attributes: true, attributeFilter: ["class"] }); + return () => obs.disconnect(); + }, + () => document.documentElement.classList.contains("dark"), + ); +} + +function getLevel(size: number, thresholds: number[]): number { + if (size === 0) return 0; + for (let i = thresholds.length - 1; i >= 0; i--) { + if (size >= thresholds[i]) return i + 1; + } + return 1; +} + +function formatSize(bytes: number): string { + if (bytes < 1024) return `${bytes} B`; + return `${(bytes / 1024).toFixed(1)} KB`; +} + +interface Props { + data: DailyStats[]; + onOpenFile: (path: string) => void; +} + +export function ContributionHeatmap({ data, onOpenFile }: Props) { + const { t } = useLocale(); + const [tooltip, setTooltip] = useState<{ x: number; y: number; text: string } | null>(null); + const isDark = useIsDark(); + + const colors = isDark ? COLORS_DARK : COLORS_LIGHT; + + const { weeks, monthLabels, thresholds } = useMemo(() => { + const map = new Map(); + for (const d of data) map.set(d.date, d.size); + + // Compute thresholds from non-zero sizes + const sizes = data.map((d) => d.size).filter((s) => s > 0).sort((a, b) => a - b); + let th = [1, 1000, 3000, 6000]; + if (sizes.length >= 4) { + const q = (i: number) => sizes[Math.floor((i * (sizes.length - 1)) / 4)]; + th = [1, q(1), q(2), q(3)]; + } + + // Build 52 weeks ending today + const today = new Date(); + const todayDay = today.getDay(); // 0=Sun + // End of this week (Saturday) or today + const endDate = new Date(today); + const startDate = new Date(today); + startDate.setDate(startDate.getDate() - (52 * 7) - todayDay); + + const weeks: { date: string; size: number; dow: number }[][] = []; + const monthLabels: { col: number; label: string }[] = []; + let currentWeek: { date: string; size: number; dow: number }[] = []; + let lastMonth = -1; + + const cursor = new Date(startDate); + cursor.setDate(cursor.getDate() + 1); // start from next day + + while (cursor <= endDate) { + const dow = cursor.getDay(); + const dateStr = cursor.toISOString().slice(0, 10); + const month = cursor.getMonth(); + + if (dow === 0 && currentWeek.length > 0) { + weeks.push(currentWeek); + currentWeek = []; + } + + if (month !== lastMonth) { + monthLabels.push({ col: weeks.length, label: t(`month.${String(month + 1).padStart(2, "0")}`) }); + lastMonth = month; + } + + currentWeek.push({ date: dateStr, size: map.get(dateStr) || 0, dow }); + cursor.setDate(cursor.getDate() + 1); + } + if (currentWeek.length > 0) weeks.push(currentWeek); + + return { weeks, monthLabels, thresholds: th }; + }, [data, t]); + + const totalSize = data.reduce((s, d) => s + d.size, 0); + const totalDays = data.filter((d) => d.size > 0).length; + const dayLabels = ["", "Mon", "", "Wed", "", "Fri", ""]; + const labelWidth = 28; + const svgW = labelWidth + weeks.length * STEP + 10; + const svgH = 7 * STEP + 28; // extra for month labels + + return ( +
+
+ {totalDays} {t("heatmap.activeDays")} + {totalSize < 1024 * 1024 ? `${(totalSize / 1024).toFixed(1)} KB` : `${(totalSize / 1024 / 1024).toFixed(2)} MB`} {t("heatmap.total")} + {totalDays > 0 && ~{formatSize(Math.round(totalSize / totalDays))}{t("heatmap.perDay")}} +
+ + {/* Month labels */} + {monthLabels.map((m, i) => ( + + {m.label} + + ))} + {/* Day labels */} + {dayLabels.map((label, i) => + label ? ( + + {label} + + ) : null + )} + {/* Cells */} + {weeks.map((week, wi) => + week.map((day) => { + const level = getLevel(day.size, thresholds); + const x = labelWidth + wi * STEP; + const y = 18 + day.dow * STEP; + return ( + 0 ? "pointer" : "default" }} + onMouseEnter={(e) => { + const rect = (e.target as SVGRectElement).getBoundingClientRect(); + setTooltip({ + x: rect.left + CELL / 2, + y: rect.top - 8, + text: `${day.date} · ${day.size > 0 ? formatSize(day.size) : t("heatmap.noData")}`, + }); + }} + onMouseLeave={() => setTooltip(null)} + onClick={() => { + if (day.size > 0) onOpenFile(`memory/${day.date}.md`); + }} + /> + ); + }) + )} + + + {/* Legend */} +
+ {t("heatmap.less")} + {colors.map((c, i) => ( + + ))} + {t("heatmap.more")} +
+ + {/* Tooltip */} + {tooltip && ( +
+ {tooltip.text} +
+ )} +
+ ); +} diff --git a/memory-viewer/src/components/CronManager.tsx b/memory-viewer/src/components/CronManager.tsx new file mode 100644 index 0000000..4d212dc --- /dev/null +++ b/memory-viewer/src/components/CronManager.tsx @@ -0,0 +1,486 @@ +import { useEffect, useState } from "react"; +import { + Clock, + Play, + Pause, + Lightning, + CaretRight, + ArrowsClockwise, + CheckCircle, + XCircle, + Timer, + Heartbeat, + Gear, + X, +} from "@phosphor-icons/react"; +import { + fetchCronJobs, + fetchCronRuns, + fetchSystemCrons, + toggleCronJob, + runCronJob, + type CronJob, + type CronRun, + type SystemCron, +} from "../api"; +import { useLocale } from "../hooks/useLocale"; + +type Tab = "user" | "system"; + +export function CronManager() { + const { t } = useLocale(); + const [tab, setTab] = useState("user"); + const [jobs, setJobs] = useState([]); + const [systemCrons, setSystemCrons] = useState([]); + const [loading, setLoading] = useState(true); + const [selectedJob, setSelectedJob] = useState(null); + const [runs, setRuns] = useState([]); + const [runsLoading, setRunsLoading] = useState(false); + const [actionLoading, setActionLoading] = useState(null); + const [toast, setToast] = useState<{ message: string; type: "ok" | "error" } | null>(null); + + const showToast = (message: string, type: "ok" | "error" = "ok") => { + setToast({ message, type }); + setTimeout(() => setToast(null), 3000); + }; + + const loadJobs = async () => { + try { + const data = await fetchCronJobs(); + setJobs(data); + } catch (e) { + console.error("Failed to load cron jobs:", e); + } finally { + setLoading(false); + } + }; + + const loadSystemCrons = async () => { + try { + const data = await fetchSystemCrons(); + setSystemCrons(data); + } catch (e) { + console.error("Failed to load system crons:", e); + } + }; + + useEffect(() => { + loadJobs(); + loadSystemCrons(); + const interval = setInterval(loadJobs, 30000); + return () => clearInterval(interval); + }, []); + + useEffect(() => { + if (!selectedJob) { + setRuns([]); + return; + } + (async () => { + setRunsLoading(true); + try { + const data = await fetchCronRuns(selectedJob); + setRuns(data); + } catch (e) { + console.error("Failed to load runs:", e); + } finally { + setRunsLoading(false); + } + })(); + }, [selectedJob]); + + const handleToggle = async (job: CronJob) => { + setActionLoading(job.id); + try { + await toggleCronJob(job.id, !job.enabled); + showToast(`${!job.enabled ? "✅ 已启用" : "⏸ 已禁用"} ${job.name}`); + await loadJobs(); + } catch (e: any) { + showToast(`❌ ${e.message || "操作失败"}`, "error"); + } finally { + setActionLoading(null); + } + }; + + const handleRun = async (job: CronJob) => { + setActionLoading(`run-${job.id}`); + try { + const result = await runCronJob(job.id); + if (result.success) { + showToast(`⚡ ${job.name} 已触发运行`); + setTimeout(loadJobs, 2000); + } else { + showToast(`❌ ${result.error || "运行失败"}`, "error"); + } + } catch (e: any) { + showToast(`❌ ${e.message || "请求失败"}`, "error"); + } finally { + setActionLoading(null); + } + }; + + const enabledCount = jobs.filter((j) => j.enabled).length; + const disabledCount = jobs.length - enabledCount; + + function formatRelativeTime(iso: string | null): string { + if (!iso) return "-"; + const date = new Date(iso); + const now = new Date(); + const diffMs = date.getTime() - now.getTime(); + const absDiff = Math.abs(diffMs); + const isPast = diffMs < 0; + + if (absDiff < 60000) return isPast ? t("cron.justNow") : t("cron.soonLabel"); + if (absDiff < 3600000) { + const mins = Math.floor(absDiff / 60000); + return isPast ? `${mins}${t("cron.minAgo")}` : `${mins}${t("cron.minLater")}`; + } + if (absDiff < 86400000) { + const hours = Math.floor(absDiff / 3600000); + return isPast ? `${hours}${t("cron.hAgo")}` : `${hours}${t("cron.hLater")}`; + } + const days = Math.floor(absDiff / 86400000); + return isPast ? `${days}${t("cron.dAgo")}` : `${days}${t("cron.dLater")}`; + } + + function statusColor(status: string | null): string { + if (!status) return "var(--text-muted)"; + if (status === "ok" || status === "completed") return "#22c55e"; + if (status === "failed" || status === "error") return "#ef4444"; + return "#eab308"; + } + + if (loading) { + return ( +
+ + {t("cron.loading")} +
+ ); + } + + return ( +
+ {/* Toast */} + {toast && ( +
+ {toast.message} +
+ )} + +
+ {/* Header */} +
+
+

+ + {t("cron.title")} +

+

+ {t("cron.subtitle")} +

+
+ +
+ + {/* Tabs */} +
+ + +
+ + {tab === "user" && ( + <> + {/* Stats */} +
+
+
{jobs.length}
+
{t("cron.total")}
+
+
+
{enabledCount}
+
{t("cron.enabled")}
+
+
+
{disabledCount}
+
{t("cron.disabled")}
+
+
+ + {/* Job List */} +
+ {jobs.map((job) => ( +
+
+ +
+
+ + {job.name} + + + {job.schedule} + +
+
+ {job.lastRun && ( + + + {formatRelativeTime(job.lastRun)} + + )} + {job.nextRun && job.enabled && ( + + + {formatRelativeTime(job.nextRun)} + + )} + {job.sessionTarget} +
+
+
+ + + +
+
+ + {/* Run History */} + {selectedJob === job.id && ( +
+
+ {t("cron.runHistory")} +
+ {runsLoading ? ( +
+ + {t("cron.loading")} +
+ ) : runs.length === 0 ? ( +
+ {t("cron.noRuns")} +
+ ) : ( +
+ {runs.map((run, i) => ( +
+
+ {run.status === "completed" || run.status === "ok" ? ( + + ) : run.status === "failed" || run.status === "error" ? ( + + ) : ( + + )} + + {run.status || "unknown"} + +
+
+ {run.durationMs != null && {(run.durationMs / 1000).toFixed(1)}s} + + {(() => { + const ts = run.runAtMs || run.ts || run.startedAt; + if (!ts) return "—"; + const d = new Date(typeof ts === "number" ? ts : ts); + return isNaN(d.getTime()) ? "—" : d.toLocaleString(undefined, { + month: "short", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + }); + })()} + +
+
+ ))} +
+ )} +
+ )} +
+ ))} +
+ + {jobs.length === 0 && ( +
+ +

{t("cron.empty")}

+
+ )} + + )} + + {tab === "system" && ( +
+ {systemCrons.map((sc) => ( +
+
+ +
+
+ + {sc.name} + + + {sc.schedule} + +
+
+ {sc.description} +
+
+ + {sc.enabled ? "运行中" : "禁用"} + +
+ + {/* Heartbeat agent details */} + {sc.type === "heartbeat" && sc.agents && ( +
+
+ {sc.agents.map((agent) => ( +
+ + {agent.name} + ({agent.id}) + + + {agent.heartbeat === "disabled" ? "禁用" : agent.heartbeat} + +
+ ))} +
+
+ )} +
+ ))} + + {systemCrons.length === 0 && ( +
+ +

无法读取系统调度信息

+
+ )} +
+ )} +
+
+ ); +} diff --git a/memory-viewer/src/components/Dashboard.tsx b/memory-viewer/src/components/Dashboard.tsx new file mode 100644 index 0000000..48dbe5c --- /dev/null +++ b/memory-viewer/src/components/Dashboard.tsx @@ -0,0 +1,228 @@ +import { useEffect, useState } from "react"; +import { fetchSystem, fetchRecent, fetchDailyStats, fetchAgents, type SystemInfo, type RecentFile, type DailyStats, type AgentInfo } from "../api"; +import { ContributionHeatmap } from "./ContributionHeatmap"; +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import { SquaresFour, FileText, Clock, ChartBar, Lightning, Robot, Folder } from "@phosphor-icons/react"; +import { useLocale } from "../hooks/useLocale"; + +function formatUptime(seconds: number): string { + const d = Math.floor(seconds / 86400); + const h = Math.floor((seconds % 86400) / 3600); + const m = Math.floor((seconds % 3600) / 60); + const parts: string[] = []; + if (d > 0) parts.push(`${d}d`); + parts.push(`${h}h ${m}m`); + return parts.join(" "); +} + +function formatBytes(bytes: number): string { + return (bytes / 1024 / 1024 / 1024).toFixed(1) + " GB"; +} + +function timeAgo(mtime: number, t: (key: string) => string): string { + const diff = Date.now() - mtime; + const seconds = Math.floor(diff / 1000); + if (seconds < 60) return t("dashboard.justNow"); + const minutes = Math.floor(seconds / 60); + if (minutes < 60) return `${minutes} ${t("dashboard.minAgo")}`; + const hours = Math.floor(minutes / 60); + if (hours < 24) return `${hours}${t("dashboard.hAgo")}`; + const days = Math.floor(hours / 24); + return `${days}${t("dashboard.dAgo")}`; +} + +const PINNED_FILES = ["MEMORY.md", "SOUL.md", "USER.md", "AGENTS.md"]; + +export function Dashboard({ onOpenFile }: { onOpenFile: (path: string) => void }) { + const { t } = useLocale(); + const [info, setInfo] = useState(null); + const [recent, setRecent] = useState([]); + const [daily, setDaily] = useState([]); + const [agents, setAgents] = useState([]); + + useEffect(() => { + fetchSystem().then(setInfo).catch(console.error); + fetchRecent(10).then(setRecent).catch(console.error); + fetchDailyStats().then(setDaily).catch(console.error); + fetchAgents().then(setAgents).catch(console.error); + }, []); + + if (!info) { + return ( +
+
+ {t("dashboard.loading")} +
+ ); + } + + const memPercent = ((info.memUsed / info.memTotal) * 100).toFixed(1); + + // Quick access: pinned + recent files not in pinned + const recentQuick = recent + .map((r) => r.path) + .filter((p) => !PINNED_FILES.includes(p)) + .slice(0, 4); + + return ( +
+

+ {t("dashboard.title")} +

+ + {/* Stats */} +
+ + + l.toFixed(2)).join(" · ")} /> + +
+ + {/* Host info */} +
+ + {info.hostname} · {info.platform} +
+ + {/* Agents Overview */} + {agents.length > 1 && ( +
+

+ Agents + {agents.length} configured +

+
+ {agents.map((agent) => ( +
+ {agent.emoji} +
+
+ {agent.name} +
+
+ + {agent.workspace} +
+
+
+ ))} +
+
+ )} + + {/* Two-column: Recently Modified + Monthly Stats */} +
+ {/* Recently Modified */} +
+

+ {t("dashboard.recentlyModified")} +

+
+ {recent.slice(0, 5).map((f) => ( + + ))} + {recent.length === 0 && ( +

{t("dashboard.noFiles")}

+ )} +
+
+ + {/* Memory Activity Heatmap */} +
+

+ {t("dashboard.memoryByMonth")} +

+ {daily.length > 0 ? ( + + ) : ( +

{t("dashboard.noMemoryFiles")}

+ )} +
+
+ + {/* Today's memory */} +
+
+

+ {t("dashboard.todayMemory")} +

+ {info.todayMemory && ( + + )} +
+ {info.todayMemory ? ( +
+ + {info.todayMemory.snippet} + +
+ {info.todayMemory.length.toLocaleString()} {t("dashboard.characters")} +
+
+ ) : ( +

{t("dashboard.noMemoryToday")}

+ )} +
+ + {/* Quick Access */} +
+

+ {t("dashboard.quickAccess")} +

+
+ {PINNED_FILES.map((f) => ( + + ))} + {recentQuick.map((f) => ( + + ))} +
+
+
+ ); +} + +function StatCard({ label, value, sub }: { label: string; value: string; sub?: string }) { + return ( +
+
{label}
+
{value}
+ {sub &&
{sub}
} +
+ ); +} diff --git a/memory-viewer/src/components/FileTree.tsx b/memory-viewer/src/components/FileTree.tsx new file mode 100644 index 0000000..9f183c0 --- /dev/null +++ b/memory-viewer/src/components/FileTree.tsx @@ -0,0 +1,252 @@ +import { useState, useMemo, useEffect, useCallback } from "react"; +import type { FileNode } from "../api"; +import { CaretDown, CaretRight, Folder, FileText, Brain, Dna, Robot, User, Wrench, ListChecks, Heartbeat, IdentificationCard, Gear, Calendar, Clock, CaretUp } from "@phosphor-icons/react"; +import { useLocale } from "../hooks/useLocale"; + +/** Well-known bot config files shown in the top section */ +const BOT_FILES = new Set([ + "AGENTS.md", "SOUL.md", "MEMORY.md", "USER.md", "TOOLS.md", + "TODO.md", "HEARTBEAT.md", "IDENTITY.md", "BOOTSTRAP.md", +]); + +function isBotFile(name: string): boolean { + return BOT_FILES.has(name); +} + +/** Check if a path is a daily note (memory/YYYY-MM-DD*.md) */ +function isDailyNote(path: string): boolean { + return /^memory\/\d{4}-\d{2}-\d{2}.*\.md$/.test(path); +} + +/** Get display label for daily note */ +function getDailyNoteLabel(path: string): { label: string; isToday: boolean; isYesterday: boolean } { + const match = path.match(/memory\/(\d{4}-\d{2}-\d{2})/); + if (!match) return { label: path, isToday: false, isYesterday: false }; + + const dateStr = match[1]; + const today = new Date().toISOString().slice(0, 10); + const yesterday = new Date(Date.now() - 86400000).toISOString().slice(0, 10); + + if (dateStr === today) return { label: "Today", isToday: true, isYesterday: false }; + if (dateStr === yesterday) return { label: "Yesterday", isYesterday: true, isToday: false }; + + // Show date in a readable format for older notes + const date = new Date(dateStr); + const options: Intl.DateTimeFormatOptions = { month: "short", day: "numeric" }; + return { label: date.toLocaleDateString("en-US", options), isToday: false, isYesterday: false }; +} + +/** Local storage key for collapsed state */ +const COLLAPSED_KEY = "memory-viewer-collapsed"; +const SECTIONS_KEY = "memory-viewer-sections"; + +interface SectionState { + coreFiles: boolean; + files: boolean; +} + +function loadCollapsedState(): Set { + try { + const stored = localStorage.getItem(COLLAPSED_KEY); + return stored ? new Set(JSON.parse(stored)) : new Set(); + } catch { + return new Set(); + } +} + +function saveCollapsedState(collapsed: Set) { + try { + localStorage.setItem(COLLAPSED_KEY, JSON.stringify([...collapsed])); + } catch { + // Ignore storage errors + } +} + +function loadSectionState(): SectionState { + try { + const stored = localStorage.getItem(SECTIONS_KEY); + return stored ? JSON.parse(stored) : { coreFiles: false, files: true }; + } catch { + return { coreFiles: false, files: true }; + } +} + +function saveSectionState(state: SectionState) { + try { + localStorage.setItem(SECTIONS_KEY, JSON.stringify(state)); + } catch { + // Ignore storage errors + } +} + +interface FileTreeProps { + nodes: FileNode[]; + activeFile: string; + onSelect: (path: string) => void; +} + +export function FileTree({ nodes, activeFile, onSelect }: FileTreeProps) { + const { t } = useLocale(); + const [collapsed, setCollapsed] = useState>(() => loadCollapsedState()); + const [sections, setSections] = useState(() => loadSectionState()); + + // Persist collapsed state + useEffect(() => { + saveCollapsedState(collapsed); + }, [collapsed]); + + // Persist section state + useEffect(() => { + saveSectionState(sections); + }, [sections]); + + const toggleSection = (key: keyof SectionState) => { + setSections(prev => ({ ...prev, [key]: !prev[key] })); + }; + + const toggleCollapsed = useCallback((path: string) => { + setCollapsed(prev => { + const next = new Set(prev); + if (next.has(path)) { + next.delete(path); + } else { + next.add(path); + } + return next; + }); + }, []); + + const { botFiles, otherNodes } = useMemo(() => { + const bot: FileNode[] = []; + const other: FileNode[] = []; + + for (const node of nodes) { + if (node.type === "file" && isBotFile(node.name)) { + bot.push(node); + } else { + other.push(node); + } + } + + const order = [...BOT_FILES]; + bot.sort((a, b) => order.indexOf(a.name) - order.indexOf(b.name)); + other.sort((a, b) => { + if (a.type === "dir" && b.type !== "dir") return -1; + if (a.type !== "dir" && b.type === "dir") return 1; + return a.name.localeCompare(b.name); + }); + + return { botFiles: bot, otherNodes: other }; + }, [nodes]); + + return ( + + ); +} + +function TreeNode({ node, activeFile, onSelect, depth, collapsed, onToggle }: { + node: FileNode; + activeFile: string; + onSelect: (path: string) => void; + depth: number; + collapsed: Set; + onToggle: (path: string) => void; +}) { + const indent = depth * 12 + 8; + const isCollapsed = collapsed.has(node.path); + // Default: all directories are collapsed unless explicitly expanded + const isOpen = !collapsed.has(node.path); + + if (node.type === "dir") { + return ( +
+ + {!isCollapsed && node.children?.slice().sort((a, b) => { + if (a.type === "dir" && b.type !== "dir") return -1; + if (a.type !== "dir" && b.type === "dir") return 1; + return a.name.localeCompare(b.name); + }).map((child) => ( + + ))} +
+ ); + } + + const isActive = activeFile === node.path; + return ( + + ); +} diff --git a/memory-viewer/src/components/FileViewer.tsx b/memory-viewer/src/components/FileViewer.tsx new file mode 100644 index 0000000..015340f --- /dev/null +++ b/memory-viewer/src/components/FileViewer.tsx @@ -0,0 +1,708 @@ +import { useEffect, useState, useCallback, useRef, useMemo } from "react"; +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import remarkFrontmatter from "remark-frontmatter"; +import rehypeRaw from "rehype-raw"; +import { fetchFile, saveFile, resolveWikilink, ConflictResult } from "../api"; +import { PencilSimple, FloppyDisk, X, Check, WarningCircle, CaretRight, ArrowUp, Copy, Warning, ArrowsClockwise, PenNib, Cube } from "@phosphor-icons/react"; +import { PluginSlot } from "../plugins/PluginSlot"; +import { SensitiveText } from "./SensitiveMask"; +import { useLocale } from "../hooks/useLocale"; +import { lazy, Suspense } from "react"; +import { renderMermaid, THEMES } from "beautiful-mermaid"; +import { useMarkdownTheme } from "../themes"; +import { applyThemeStyles, cleanInlineStyles } from "../themes/apply"; +import mermaid from "mermaid"; +const MarkdownEditor = lazy(() => import("./MarkdownEditor").then(m => ({ default: m.MarkdownEditor }))); + +// Initialize mermaid for different styles +function initMermaid(isDark: boolean, handDrawn: boolean) { + mermaid.initialize({ + startOnLoad: false, + securityLevel: "loose", + theme: isDark ? "dark" : "default", + look: handDrawn ? "handDrawn" : "classic", + fontFamily: handDrawn + ? "Virgil, Segoe Print, Bradley Hand, Chilanka, TSCu_Comic, casual, cursive" + : "Inter, sans-serif", + }); +} + +type MermaidStyle = "normal" | "handDrawn"; + +/** Mermaid diagram renderer with style toggle */ +function MermaidBlock({ code }: { code: string }) { + const [svg, setSvg] = useState(""); + const [error, setError] = useState(""); + const [style, setStyle] = useState("normal"); + const containerRef = useRef(null); + + useEffect(() => { + const isDark = document.documentElement.classList.contains("dark"); + // Generate unique ID for each render to avoid conflicts + const renderId = `mermaid-${Math.random().toString(36).slice(2)}`; + + if (style === "handDrawn") { + // Use native mermaid with hand-drawn look + initMermaid(isDark, true); + console.log("[Mermaid] Rendering hand-drawn style with ID:", renderId); + mermaid.render(renderId, code) + .then((result) => { + console.log("[Mermaid] Render success, svg length:", result.svg?.length); + setSvg(result.svg); + setError(""); + }) + .catch((e) => { + console.error("[Mermaid] Render failed:", e); + setError(e.message || "Failed to render diagram"); + setSvg(""); + }); + } else { + // Use beautiful-mermaid for normal style + const baseTheme = isDark ? THEMES["github-dark"] : THEMES["github-light"]; + const theme = { ...baseTheme, bg: "transparent" }; + renderMermaid(code, theme) + .then((result) => { + setSvg(typeof result === "string" ? result : (result as any).svg || String(result)); + setError(""); + }) + .catch((e) => { + setError(e.message || "Failed to render diagram"); + setSvg(""); + }); + } + }, [code, style]); + + if (error) { + return ( +
+
⚠ Mermaid render error: {error}
+
{code}
+
+ ); + } + + if (!svg) { + return
Rendering diagram...
; + } + + return ( +
+ {/* Style toggle button */} +
+ + +
+
+
+ ); +} + +/** Extract YAML front matter and return { meta, body } */ +interface FrontMatterResult { + meta: Record | null; + metadata: Record | null; + body: string; +} + +function parseFrontMatter(raw: string): FrontMatterResult { + const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/); + if (!match) return { meta: null, metadata: null, body: raw }; + const yamlBlock = match[1]; + const body = match[2]; + const meta: Record = {}; + let metadata: Record | null = null; + for (const line of yamlBlock.split("\n")) { + const idx = line.indexOf(":"); + if (idx > 0) { + const key = line.slice(0, idx).trim(); + const val = line.slice(idx + 1).trim().replace(/^['"]|['"]$/g, ""); + if (!key || !val) continue; + if (key === "metadata") { + try { metadata = JSON.parse(val); } catch { meta[key] = val; } + } else { + meta[key] = val; + } + } + } + return { meta: Object.keys(meta).length ? meta : null, metadata, body }; +} + +/** Recursively wrap string children with SensitiveText and WikiLinks */ +function maskChildren(children: React.ReactNode, onOpenFile?: (path: string) => void): React.ReactNode { + if (typeof children === "string") { + // Check for wikilinks first + if (children.includes("[[")) { + const parts = processWikiLinks(children, onOpenFile); + return parts.map((part, i) => + typeof part === "string" ? {part} : part + ); + } + return {children}; + } + if (Array.isArray(children)) return children.map((c, i) => + typeof c === "string" ? ( + c.includes("[[") ? ( + {processWikiLinks(c, onOpenFile).map((part, j) => + typeof part === "string" ? {part} : part + )} + ) : {c} + ) : c + ); + return children; +} + +/** Shiki highlighter singleton */ +import { createHighlighter, type Highlighter } from "shiki"; + +let highlighterPromise: Promise | null = null; +function getHighlighter(): Promise { + if (!highlighterPromise) { + highlighterPromise = createHighlighter({ + themes: ["github-dark", "github-light"], + langs: ["bash", "javascript", "typescript", "python", "json", "yaml", "markdown", "css", "html", "go", "rust", "sql", "diff", "dockerfile", "toml", "ini", "tsx", "jsx", "java", "c", "cpp", "shell", "ruby", "php", "swift", "kotlin"], + }); + } + return highlighterPromise; +} + +/** Code block with copy button */ +function CodeBlock({ className, children, ...props }: any) { + const { t } = useLocale(); + const [copied, setCopied] = useState(false); + const [html, setHtml] = useState(""); + const match = /language-(\w+)/.exec(className || ""); + const text = String(children).replace(/\n$/, ""); + const isBlock = !!match || text.includes("\n"); + const isDark = document.documentElement.classList.contains("dark"); + + useEffect(() => { + if (!isBlock || !match) return; + if (match[1] === "mermaid") return; + let cancelled = false; + getHighlighter().then((hl) => { + if (cancelled) return; + const lang = hl.getLoadedLanguages().includes(match[1] as any) ? match[1] : "text"; + const result = hl.codeToHtml(text, { + lang, + theme: isDark ? "github-dark" : "github-light", + }); + setHtml(result); + }); + return () => { cancelled = true; }; + }, [text, match?.[1], isDark, isBlock]); + + if (!isBlock) { + if (typeof children === "string") { + return {children}; + } + return {children}; + } + // Mermaid diagrams + if (match && match[1] === "mermaid") { + return ; + } + // Plain text code blocks (no language) - use simple
 for uniform background
+  if (!match) {
+    return (
+      
+ +
+          {text}
+        
+
+ ); + } + return ( +
+ + {html ? ( +
+ ) : ( +
+          {text}
+        
+ )} +
+ ); +} + +/** Breadcrumb path */ +function Breadcrumb({ path, hasChanges, onNavigate }: { path: string; hasChanges: boolean; onNavigate?: (dir: string) => void }) { + const parts = path.split("/"); + return ( + + {hasChanges && "● "} + {parts.map((part, i) => { + const isLast = i === parts.length - 1; + const dir = parts.slice(0, i + 1).join("/"); + return ( + + {i > 0 && } + {isLast ? ( + {part} + ) : ( + + )} + + ); + })} + + ); +} + +/** WikiLink component: renders [[xxx]] as clickable link */ +function WikiLink({ target, onOpenFile }: { target: string; onOpenFile?: (path: string) => void }) { + const [resolved, setResolved] = useState<{ found: boolean; path: string | null } | null>(null); + + useEffect(() => { + resolveWikilink(target).then(setResolved).catch(() => setResolved({ found: false, path: null })); + }, [target]); + + const handleClick = (e: React.MouseEvent) => { + e.preventDefault(); + if (resolved?.found && resolved.path && onOpenFile) { + onOpenFile(resolved.path); + } + }; + + if (!resolved) return [[{target}]]; + + if (resolved.found) { + return ( +
+ {target} + + ); + } + + return ( + + {target} + + ); +} + +/** Process text to replace [[xxx]] with WikiLink components */ +function processWikiLinks(text: string, onOpenFile?: (path: string) => void): React.ReactNode[] { + const parts: React.ReactNode[] = []; + const regex = /\[\[([^\]]+)\]\]/g; + let lastIndex = 0; + let match; + + while ((match = regex.exec(text)) !== null) { + if (match.index > lastIndex) { + parts.push(text.slice(lastIndex, match.index)); + } + parts.push(); + lastIndex = regex.lastIndex; + } + + if (lastIndex < text.length) { + parts.push(text.slice(lastIndex)); + } + + return parts; +} + +interface FileViewerProps { + filePath: string; + refreshKey?: number; + onNavigate?: (dir: string) => void; + onOpenFile?: (path: string) => void; +} + +export function FileViewer({ filePath, refreshKey, onNavigate, onOpenFile }: FileViewerProps) { + const { t } = useLocale(); + const [content, setContent] = useState(""); + const [editContent, setEditContent] = useState(""); + const [mtime, setMtime] = useState(""); + const [editing, setEditing] = useState(false); + const [loading, setLoading] = useState(true); + const [toast, setToast] = useState(""); + const [conflict, setConflict] = useState(null); + const contentRef = useRef(null); + const [showScrollTop, setShowScrollTop] = useState(false); + const { current: mdTheme } = useMarkdownTheme(); + + useEffect(() => { + setLoading(true); + setEditing(false); + fetchFile(filePath) + .then((data) => { + setContent(data.content); + setEditContent(data.content); + setMtime(data.mtime); + }) + .catch(() => showToast(t("file.failedToLoad"))) + .finally(() => setLoading(false)); + }, [filePath, refreshKey]); + + // Auto-refresh every 10s when not editing (for when WebSocket is unavailable) + useEffect(() => { + if (editing) return; + const interval = setInterval(() => { + fetchFile(filePath).then((data) => { + if (data.mtime !== mtime) { + setContent(data.content); + setEditContent(data.content); + setMtime(data.mtime); + } + }).catch(() => {}); + }, 10000); + return () => clearInterval(interval); + }, [filePath, editing, mtime]); + + const [refreshing, setRefreshing] = useState(false); + const handleRefresh = useCallback(() => { + setRefreshing(true); + fetchFile(filePath) + .then((data) => { + setContent(data.content); + setEditContent(data.content); + setMtime(data.mtime); + showToast(t("file.reloaded") || "Refreshed"); + }) + .catch(() => showToast(t("file.failedToLoad"))) + .finally(() => setRefreshing(false)); + }, [filePath]); + + const showToast = (msg: string) => { + setToast(msg); + setTimeout(() => setToast(""), 2000); + }; + + const hasChanges = editing && editContent !== content; + + const handleSave = useCallback(async (force = false) => { + try { + const result = await saveFile(filePath, editContent, force ? undefined : mtime); + if ("error" in result && result.error === "conflict") { + setConflict(result as ConflictResult); + return; + } + if ("ok" in result && result.ok) { + setContent(editContent); + setMtime(result.mtime); + setEditing(false); + setConflict(null); + showToast(t("file.saved")); + } + } catch { + showToast(t("file.saveFailed")); + } + }, [filePath, editContent, mtime]); + + const handleConflictOverwrite = useCallback(() => { + handleSave(true); + }, [handleSave]); + + const handleConflictReload = useCallback(() => { + if (conflict) { + setContent(conflict.serverContent); + setEditContent(conflict.serverContent); + setMtime(conflict.serverMtime); + setConflict(null); + showToast(t("file.reloaded")); + } + }, [conflict]); + + const handleCancel = () => { + if (hasChanges && !confirm(t("file.discardChanges"))) return; + setEditContent(content); + setEditing(false); + }; + + const [isDark, setIsDark] = useState(() => document.documentElement.classList.contains("dark")); + useEffect(() => { + const obs = new MutationObserver(() => setIsDark(document.documentElement.classList.contains("dark"))); + obs.observe(document.documentElement, { attributes: true, attributeFilter: ["class"] }); + return () => obs.disconnect(); + }, []); + + const handleEdit = () => { + setEditing(true); + }; + + useEffect(() => { + const handler = (e: BeforeUnloadEvent) => { + if (hasChanges) e.preventDefault(); + }; + window.addEventListener("beforeunload", handler); + return () => window.removeEventListener("beforeunload", handler); + }, [hasChanges]); + + const frontMatter = useMemo(() => parseFrontMatter(content), [content]); + + // Apply markdown theme + useEffect(() => { + if (!contentRef.current || editing) return; + const article = contentRef.current.querySelector(".markdown-body"); + if (!article || (!mdTheme.styles && !mdTheme.darkStyles)) { + cleanInlineStyles(article); + return; + } + applyThemeStyles(article as HTMLElement, mdTheme); + }, [content, mdTheme, editing, refreshKey, isDark]); + + const fileStats = useMemo(() => { + const bytes = new Blob([content]).size; + const words = content.trim() ? content.trim().split(/\s+/).length : 0; + const sizeStr = bytes < 1024 ? `${bytes} B` : `${(bytes / 1024).toFixed(1)} KB`; + return { sizeStr, words }; + }, [content]); + + const handleScroll = useCallback((e: React.UIEvent) => { + setShowScrollTop(e.currentTarget.scrollTop > 300); + }, []); + + const scrollToTop = () => { + contentRef.current?.scrollTo({ top: 0, behavior: "smooth" }); + }; + + if (loading) { + return ( +
+
+ {t("file.loading")} +
+ ); + } + + return ( +
+ {/* Toolbar */} +
+
+ + + {new Date(mtime).toLocaleString()} + +
+
+ + {fileStats.sizeStr} + · + {fileStats.words} {t("file.words")} + +
+ {editing ? ( + <> + + + + ) : ( + <> + + + + + )} +
+
+
+ + {/* Content */} +
+ {editing ? ( + Loading editor...
}> + + + ) : ( +
+ {(frontMatter.meta || frontMatter.metadata) && (() => { + const md = frontMatter.metadata; + const cb = md?.clawdbot || md?.openclaw; + const emoji = cb?.emoji || "🧩"; + const requires = cb?.requires; + const extraMeta = frontMatter.meta ? Object.entries(frontMatter.meta).filter(([k]) => k !== "name" && k !== "description") : []; + return ( +
+ {/* Header */} +
+
+ {frontMatter.meta?.name && ( +
+ {emoji} +

{frontMatter.meta.name}

+
+ )} +
+ {frontMatter.meta?.description && ( +

{frontMatter.meta.description}

+ )} +
+ {/* Tags: extra fields + requires */} + {(extraMeta.length > 0 || requires) && ( +
+ {extraMeta.map(([k, v]) => ( + + {k}: {v} + + ))} + {requires?.skills?.map((s: string) => ( + + 🔗 {s} + + ))} + {requires?.tools?.map((t: string) => ( + + 🔧 {t} + + ))} + {requires?.secrets?.map((s: string) => ( + + 🔑 {s} + + ))} +
+ )} +
+ ); + })()} + {children}; + }, + code: CodeBlock, + // Mask in plain text nodes within paragraphs + p({ children }) { + return

{maskChildren(children, onOpenFile)}

; + }, + li({ children }) { + return
  • {maskChildren(children, onOpenFile)}
  • ; + }, + td({ children }) { + return {maskChildren(children, onOpenFile)}; + }, + }} + >{content}
    +
    + )} +
    + + {/* Scroll to top */} + {showScrollTop && !editing && ( + + )} + + {/* Conflict Dialog */} + {conflict && ( +
    +
    +
    + +

    {t("file.conflictTitle")}

    +
    +

    + {t("file.conflictDesc")} +

    +

    + {t("file.conflictTime")}: {new Date(conflict.serverMtime).toLocaleString()} +

    +
    + + + +
    +
    +
    + )} + + {/* Toast */} + {toast &&
    {toast}
    } +
    + ); +} diff --git a/memory-viewer/src/components/MarkdownEditor.tsx b/memory-viewer/src/components/MarkdownEditor.tsx new file mode 100644 index 0000000..803c41e --- /dev/null +++ b/memory-viewer/src/components/MarkdownEditor.tsx @@ -0,0 +1,97 @@ +import { useEffect, useRef, useCallback } from "react"; +import { EditorView, keymap, lineNumbers } from "@codemirror/view"; +import { EditorState } from "@codemirror/state"; +import { markdown, markdownLanguage } from "@codemirror/lang-markdown"; +import { languages } from "@codemirror/language-data"; +import { oneDark } from "@codemirror/theme-one-dark"; +import { defaultKeymap, indentWithTab } from "@codemirror/commands"; +import { syntaxHighlighting, defaultHighlightStyle } from "@codemirror/language"; + +interface MarkdownEditorProps { + value: string; + onChange: (value: string) => void; + onSave: () => void; + dark?: boolean; +} + +export function MarkdownEditor({ value, onChange, onSave, dark = true }: MarkdownEditorProps) { + const containerRef = useRef(null); + const viewRef = useRef(null); + const onChangeRef = useRef(onChange); + const onSaveRef = useRef(onSave); + onChangeRef.current = onChange; + onSaveRef.current = onSave; + + // Track if update is from external prop change + const externalUpdate = useRef(false); + + const createView = useCallback(() => { + if (!containerRef.current) return; + viewRef.current?.destroy(); + + const themeExtensions = dark + ? [oneDark] + : [syntaxHighlighting(defaultHighlightStyle)]; + + const state = EditorState.create({ + doc: value, + extensions: [ + lineNumbers(), + EditorView.lineWrapping, + keymap.of([ + ...defaultKeymap, + indentWithTab, + { key: "Mod-s", run: () => { onSaveRef.current(); return true; } }, + ]), + markdown({ base: markdownLanguage, codeLanguages: languages }), + ...themeExtensions, + EditorView.updateListener.of((update) => { + if (update.docChanged && !externalUpdate.current) { + onChangeRef.current(update.state.doc.toString()); + } + }), + EditorView.theme({ + "&": { height: "100%", fontSize: "14px" }, + ".cm-scroller": { overflow: "auto" }, + ".cm-content": { fontFamily: "'JetBrains Mono', 'Fira Code', monospace" }, + ".cm-gutters": { borderRight: "none" }, + }), + ], + }); + + viewRef.current = new EditorView({ state, parent: containerRef.current }); + }, [dark]); + + // Create/recreate on dark change + useEffect(() => { + createView(); + return () => viewRef.current?.destroy(); + }, [createView]); + + // Sync external value changes + useEffect(() => { + const view = viewRef.current; + if (!view) return; + const current = view.state.doc.toString(); + if (value !== current) { + externalUpdate.current = true; + view.dispatch({ + changes: { from: 0, to: current.length, insert: value }, + }); + externalUpdate.current = false; + } + }, [value]); + + // Focus on mount + useEffect(() => { + setTimeout(() => viewRef.current?.focus(), 50); + }, []); + + return ( +
    + ); +} diff --git a/memory-viewer/src/components/SearchPanel.tsx b/memory-viewer/src/components/SearchPanel.tsx new file mode 100644 index 0000000..741dc30 --- /dev/null +++ b/memory-viewer/src/components/SearchPanel.tsx @@ -0,0 +1,245 @@ +import { useState, useRef, useEffect, useCallback } from "react"; +import { searchFiles, semanticSearch, fetchCapabilities, type SearchResult, type SemanticResult } from "../api"; +import { MagnifyingGlass, FileText, TextAa, Brain } from "@phosphor-icons/react"; +import { useLocale } from "../hooks/useLocale"; + +type SearchMode = "text" | "bm25" | "vector"; + +interface SearchPanelProps { + onSelect: (path: string) => void; + onClose: () => void; +} + +export function SearchPanel({ onSelect, onClose }: SearchPanelProps) { + const { t } = useLocale(); + const [query, setQuery] = useState(""); + const [mode, setMode] = useState("text"); + const [textResults, setTextResults] = useState([]); + const [semanticResults, setSemanticResults] = useState([]); + const [loading, setLoading] = useState(false); + const [hasBm25, setHasBm25] = useState(false); + const [hasVector, setHasVector] = useState(false); + const inputRef = useRef(null); + const timerRef = useRef>(); + + useEffect(() => { + inputRef.current?.focus(); + fetchCapabilities().then((cap) => { + setHasBm25(cap.qmdBm25); + setHasVector(cap.qmdVector); + }); + }, []); + + useEffect(() => { + const handler = (e: KeyboardEvent) => { + if (e.key === "Escape") onClose(); + }; + window.addEventListener("keydown", handler); + return () => window.removeEventListener("keydown", handler); + }, [onClose]); + + const doSearch = useCallback((q: string, m: SearchMode) => { + if (q.length < 2) { + setTextResults([]); + setSemanticResults([]); + return; + } + setLoading(true); + if (m === "text") { + searchFiles(q) + .then(setTextResults) + .catch(() => setTextResults([])) + .finally(() => setLoading(false)); + } else { + semanticSearch(q, m) + .then(setSemanticResults) + .catch(() => setSemanticResults([])) + .finally(() => setLoading(false)); + } + }, []); + + const handleInput = (val: string) => { + setQuery(val); + clearTimeout(timerRef.current); + const delay = mode === "text" ? 300 : 500; + timerRef.current = setTimeout(() => doSearch(val, mode), delay); + }; + + const handleModeChange = (m: SearchMode) => { + setMode(m); + setTextResults([]); + setSemanticResults([]); + if (query.length >= 2) { + setLoading(true); + const delay = m === "text" ? 0 : 100; + setTimeout(() => doSearch(query, m), delay); + } + }; + + const handleSelect = (path: string) => { + onSelect(path); + onClose(); + }; + + const totalMatches = mode === "text" + ? textResults.reduce((s, r) => s + r.matches.length, 0) + : semanticResults.length; + + const modeButtons: { key: SearchMode; icon: typeof TextAa; label: string }[] = [ + { key: "text", icon: TextAa, label: t("search.modeText") }, + ...(hasBm25 ? [{ key: "bm25" as SearchMode, icon: MagnifyingGlass, label: "BM25" }] : []), + ...(hasVector ? [{ key: "vector" as SearchMode, icon: Brain, label: t("search.modeSemantic") }] : []), + ]; + + return ( +
    +
    e.stopPropagation()} + > + {/* Search input */} +
    + + handleInput(e.target.value)} + placeholder={t("search.placeholder")} + className="flex-1 bg-transparent outline-none text-base" + style={{ color: "var(--text-primary)" }} + /> + {loading && ( +
    + {mode !== "text" && 搜索中…} +
    +
    + )} + + ESC + +
    + + {/* Mode toggle — only show if QMD is available */} + {(hasBm25 || hasVector) &&
    + {modeButtons.map(({ key, icon: Icon, label }) => ( + + ))} +
    } + + {/* Results */} +
    + {loading && query.length >= 2 && mode !== "text" && ( +
    + {[1, 2, 3].map((i) => ( +
    +
    +
    +
    +
    + ))} +
    + )} + {query.length >= 2 && totalMatches === 0 && !loading && ( +
    + {t("search.noResults")} “{query}” +
    + )} + + {/* Text search results */} + {mode === "text" && textResults.map((r) => ( + + ))} + + {/* Semantic search results */} + {mode !== "text" && semanticResults.map((r, idx) => ( + + ))} +
    + + {/* Footer */} + {totalMatches > 0 && ( +
    + {mode === "text" + ? `${textResults.length} ${t("search.files")} · ${totalMatches} ${t("search.matches")}` + : `${semanticResults.length} ${t("search.results")} · ${mode === "vector" ? "🧠" : "📊"} ${mode.toUpperCase()}` + } +
    + )} +
    +
    + ); +} + +function highlightMatch(text: string, query: string) { + const lower = text.toLowerCase(); + const idx = lower.indexOf(query.toLowerCase()); + if (idx === -1) return {text}; + return ( + + {text.slice(0, idx)} + {text.slice(idx, idx + query.length)} + {text.slice(idx + query.length)} + + ); +} diff --git a/memory-viewer/src/components/SensitiveMask.tsx b/memory-viewer/src/components/SensitiveMask.tsx new file mode 100644 index 0000000..27c9858 --- /dev/null +++ b/memory-viewer/src/components/SensitiveMask.tsx @@ -0,0 +1,77 @@ +import { useSensitive } from "../hooks/useSensitive"; + +/** + * Patterns that match API tokens, keys, secrets, passwords, etc. + * Each match will be blurred when sensitive mode is on. + */ +const SENSITIVE_PATTERNS = [ + // Generic API keys/tokens (long hex/alphanum strings after key-like labels) + /(?<=(?:key|token|secret|password|apikey|api_key|api-key|bearer|authorization)\s*[:=]\s*)[A-Za-z0-9_\-./+]{16,}/gi, + // Specific formats + /pplx-[A-Za-z0-9]{40,}/g, // Perplexity + /sk-[A-Za-z0-9_\-]{32,}/g, // OpenAI-style + /re_[A-Za-z0-9_]{20,}/g, // Resend + /ghp_[A-Za-z0-9]{36,}/g, // GitHub PAT + /gho_[A-Za-z0-9]{36,}/g, // GitHub OAuth + /xai-[A-Za-z0-9]{40,}/g, // xAI + /GOCSPX-[A-Za-z0-9_\-]{20,}/g, // Google client secret + /AIza[A-Za-z0-9_\-]{30,}/g, // Google API key + /[0-9a-f]{48,}/g, // Long hex strings (48+ chars, likely tokens) + /eyJ[A-Za-z0-9_\-]{20,}\.[A-Za-z0-9_\-]+/g, // JWT tokens +]; + +/** + * Replace sensitive substrings in text with masked spans. + */ +export function maskSensitiveText(text: string, hidden: boolean): (string | JSX.Element)[] { + if (!hidden) return [text]; + + // Collect all match ranges + const ranges: { start: number; end: number }[] = []; + for (const pattern of SENSITIVE_PATTERNS) { + const re = new RegExp(pattern.source, pattern.flags); + let m; + while ((m = re.exec(text)) !== null) { + ranges.push({ start: m.index, end: m.index + m[0].length }); + } + } + + if (ranges.length === 0) return [text]; + + // Merge overlapping ranges + ranges.sort((a, b) => a.start - b.start); + const merged: { start: number; end: number }[] = [ranges[0]]; + for (let i = 1; i < ranges.length; i++) { + const last = merged[merged.length - 1]; + if (ranges[i].start <= last.end) { + last.end = Math.max(last.end, ranges[i].end); + } else { + merged.push(ranges[i]); + } + } + + // Build result + const result: (string | JSX.Element)[] = []; + let pos = 0; + for (const { start, end } of merged) { + if (start > pos) result.push(text.slice(pos, start)); + result.push( + + {text.slice(start, end)} + + ); + pos = end; + } + if (pos < text.length) result.push(text.slice(pos)); + return result; +} + +/** + * Wrap around inline text nodes to auto-mask sensitive content. + */ +export function SensitiveText({ children }: { children: string }) { + const { hidden } = useSensitive(); + if (typeof children !== "string") return <>{children}; + const parts = maskSensitiveText(children, hidden); + return <>{parts}; +} diff --git a/memory-viewer/src/components/SettingsPage.tsx b/memory-viewer/src/components/SettingsPage.tsx new file mode 100644 index 0000000..0429c18 --- /dev/null +++ b/memory-viewer/src/components/SettingsPage.tsx @@ -0,0 +1,305 @@ +import { useState, useEffect } from "react"; +import { fetchSettings, saveSettings, testEmbeddingConnection, type EmbeddingSettings, getBaseUrl } from "../api"; +import { Gear, FloppyDisk, Lightning, CheckCircle, XCircle, Database, Files } from "@phosphor-icons/react"; +import { useLocale } from "../hooks/useLocale"; + +export function SettingsPage() { + const { t } = useLocale(); + const [settings, setSettings] = useState({ + enabled: false, + apiUrl: "", + apiKey: "", + model: "", + apiKeySet: false + }); + const [loading, setLoading] = useState(true); + const [saving, setSaving] = useState(false); + const [testing, setTesting] = useState(false); + const [testResult, setTestResult] = useState<{ success: boolean; message?: string } | null>(null); + const [touched, setTouched] = useState(false); + const [embStats, setEmbStats] = useState<{ cachedFiles: number; totalFiles: number; coverage: number; dbSize: number; model: string } | null>(null); + + useEffect(() => { + loadSettings(); + loadEmbStats(); + }, []); + + const loadEmbStats = async () => { + try { + const r = await fetch(`${getBaseUrl()}/api/settings/embedding-stats`); + setEmbStats(await r.json()); + } catch {} + }; + + const loadSettings = async () => { + try { + const data = await fetchSettings(); + setSettings(data.embedding); + } catch (err) { + console.error("Failed to load settings:", err); + } finally { + setLoading(false); + } + }; + + const handleChange = (field: keyof EmbeddingSettings, value: any) => { + setSettings(prev => ({ ...prev, [field]: value })); + setTouched(true); + }; + + const handleSave = async () => { + setSaving(true); + try { + await saveSettings({ embedding: settings }); + setTouched(false); + // Reload to get the safe version (with apiKey hidden) + await loadSettings(); + } catch (err) { + console.error("Failed to save settings:", err); + } finally { + setSaving(false); + } + }; + + const handleTest = async () => { + setTesting(true); + setTestResult(null); + try { + const result = await testEmbeddingConnection(settings); + setTestResult({ + success: result.success, + message: result.error || "Connection successful" + }); + } catch (err: any) { + setTestResult({ + success: false, + message: err.message || "Test failed" + }); + } finally { + setTesting(false); + } + }; + + if (loading) { + return ( +
    +
    + Loading settings... +
    + ); + } + + return ( +
    +

    + {t("settings.title") || "⚙️ Settings"} +

    + + {/* Embedding Settings */} +
    +

    + {t("settings.embedding.title") || "向量搜索 (Embedding)"} +

    + +
    + {/* Enable/Disable toggle */} +
    +
    +
    + {t("settings.embedding.enable") || "启用向量搜索"} +
    +
    + {t("settings.embedding.enableDesc") || "使用 OpenAI Embeddings API 进行语义搜索"} +
    +
    +
    + + {/* Embedding Stats */} + {settings.enabled && embStats && embStats.cachedFiles > 0 && ( +
    +
    + + Embedding 缓存状态 +
    +
    +
    +
    + {embStats.cachedFiles}/{embStats.totalFiles} +
    +
    已缓存文件
    +
    +
    +
    + {embStats.coverage}% +
    +
    覆盖率
    +
    +
    +
    + {embStats.dbSize > 1048576 ? `${(embStats.dbSize / 1048576).toFixed(1)}MB` : `${Math.round(embStats.dbSize / 1024)}KB`} +
    +
    缓存大小
    +
    +
    + {/* Coverage bar */} +
    +
    +
    +
    + 模型: {embStats.model} +
    +
    + )} + + {/* Save Button */} +
    + +
    +
    +
    + ); +} \ No newline at end of file diff --git a/memory-viewer/src/components/SkillsPage.tsx b/memory-viewer/src/components/SkillsPage.tsx new file mode 100644 index 0000000..5f11782 --- /dev/null +++ b/memory-viewer/src/components/SkillsPage.tsx @@ -0,0 +1,67 @@ +import { PuzzlePiece, ArrowSquareOut, FileText } from "@phosphor-icons/react"; +import type { SkillInfo } from "../api"; +import { useLocale } from "../hooks/useLocale"; + +interface SkillsPageProps { + skills: SkillInfo[]; + onOpenFile: (path: string) => void; +} + +export function SkillsPage({ skills, onOpenFile }: SkillsPageProps) { + const { t } = useLocale(); + + return ( +
    +
    + {/* Header */} +
    +

    + + {t("skills.title") || "Skills"} +

    +

    + {t("skills.description") || "Agent capabilities and extensions"} +

    +
    + + {/* Skills Grid */} + {skills.length === 0 ? ( +
    + {t("skills.empty") || "No skills found"} +
    + ) : ( +
    + {skills.map((skill) => ( + + ))} +
    + )} +
    +
    + ); +} diff --git a/memory-viewer/src/components/Tags.tsx b/memory-viewer/src/components/Tags.tsx new file mode 100644 index 0000000..53f9439 --- /dev/null +++ b/memory-viewer/src/components/Tags.tsx @@ -0,0 +1,311 @@ +import { useEffect, useMemo, useState } from "react"; +import { Hash, FileText, CaretRight, Clock, Tag as TagIcon, X } from "@phosphor-icons/react"; +import { fetchTags, fetchFilesByTag, type TagInfo, type FileWithTags } from "../api"; +import { useLocale } from "../hooks/useLocale"; + +interface Props { + onOpenFile: (path: string) => void; +} + +export function Tags({ onOpenFile }: Props) { + const { t } = useLocale(); + const [tags, setTags] = useState([]); + const [selectedTag, setSelectedTag] = useState(null); + const [files, setFiles] = useState([]); + const [loading, setLoading] = useState(true); + const [filesLoading, setFilesLoading] = useState(false); + + // Load all tags on mount + useEffect(() => { + (async () => { + setLoading(true); + try { + const data = await fetchTags(); + setTags(data); + } catch (e) { + console.error("Tags load failed:", e); + } finally { + setLoading(false); + } + })(); + }, []); + + // Load files when tag selected + useEffect(() => { + if (!selectedTag) { + setFiles([]); + return; + } + (async () => { + setFilesLoading(true); + try { + const data = await fetchFilesByTag(selectedTag); + setFiles(data); + } catch (e) { + console.error("Files by tag load failed:", e); + } finally { + setFilesLoading(false); + } + })(); + }, [selectedTag]); + + // Calculate tag sizes for cloud display + const tagSizes = useMemo(() => { + if (tags.length === 0) return []; + const maxCount = Math.max(...tags.map(t => t.count)); + const minCount = Math.min(...tags.map(t => t.count)); + const range = maxCount - minCount || 1; + + return tags.map(tag => { + // Normalize to 1-5 scale + const size = 1 + ((tag.count - minCount) / range) * 4; + return { ...tag, size: Math.round(size) }; + }); + }, [tags]); + + // Group tags by first letter/category + const groupedTags = useMemo(() => { + const groups: Record = {}; + for (const tag of tags) { + const firstChar = tag.name.charAt(0); + const key = /[\u4e00-\u9fa5]/.test(firstChar) ? "中文" : + /[a-zA-Z]/.test(firstChar) ? firstChar.toUpperCase() : + "#"; + (groups[key] ||= []).push(tag); + } + return Object.entries(groups).sort(([a], [b]) => a.localeCompare(b)); + }, [tags]); + + const stats = useMemo(() => ({ + totalTags: tags.length, + totalFiles: tags.reduce((s, t) => s + t.count, 0), + avgPerTag: tags.length > 0 ? (tags.reduce((s, t) => s + t.count, 0) / tags.length).toFixed(1) : "0", + }), [tags]); + + // Get color based on tag size + const getTagColor = (size: number) => { + const colors = [ + "var(--text-faint)", + "var(--text-muted)", + "var(--text-secondary)", + "var(--accent)", + "#3b82f6", + ]; + return colors[size - 1] || colors[0]; + }; + + const getTagSize = (size: number) => { + const sizes = ["0.75rem", "0.875rem", "1rem", "1.125rem", "1.25rem"]; + return sizes[size - 1] || sizes[0]; + }; + + return ( +
    + {/* Header */} +
    +
    +
    + +
    +
    +

    + {t("tags.title", "标签")} +

    +

    + {t("tags.subtitle", "按主题浏览记忆")} +

    +
    +
    + + {selectedTag && ( + + )} +
    + + {/* Stats bar */} +
    +
    + + {stats.totalTags} + {t("tags.totalTags", "标签")} +
    +
    + + {stats.totalFiles} + {t("tags.totalFiles", "文件")} +
    +
    + + {stats.avgPerTag} + {t("tags.avgPerTag", "平均")} +
    + {loading && ( +
    + )} +
    + + {/* Selected tag files view */} + {selectedTag ? ( +
    +
    + {t("tags.showing", "显示标签")} + + {selectedTag} + + + ({files.length} {t("tags.files", "个文件")}) + +
    + + {filesLoading ? ( +
    +
    +
    + ) : files.length === 0 ? ( +
    + +

    {t("tags.noFiles", "没有找到相关文件")}

    +
    + ) : ( +
    + {files.map((file, i) => ( + + ))} +
    + )} +
    + ) : ( + /* Tag cloud view */ +
    + {/* Popular tags cloud */} + {tagSizes.length > 0 && ( +
    +

    + + {t("tags.popular", "热门标签")} +

    +
    + {tagSizes.slice(0, 30).map(({ name, count, size }) => ( + + ))} +
    +
    + )} + + {/* Grouped tags list */} +
    + {groupedTags.map(([key, groupTags]) => ( +
    +

    + + {key} + + {groupTags.length} {t("tags.tags", "个标签")} +

    +
    + {groupTags.map(({ name, count }) => ( + + ))} +
    +
    + ))} +
    + + {tags.length === 0 && !loading && ( +
    + +

    {t("tags.empty", "暂无标签")}

    +

    {t("tags.emptyHint", "在 Markdown 中使用 ## 标题 或 #标签 来创建标签")}

    +
    + )} +
    + )} +
    + ); +} diff --git a/memory-viewer/src/components/Timeline.tsx b/memory-viewer/src/components/Timeline.tsx new file mode 100644 index 0000000..2b95de3 --- /dev/null +++ b/memory-viewer/src/components/Timeline.tsx @@ -0,0 +1,242 @@ +import { useEffect, useMemo, useState } from "react"; +import { Calendar, FileText, CaretDown, CaretRight, Clock, Hash, Notebook, TextAa } from "@phosphor-icons/react"; +import { fetchTimeline, type TimelineEntry } from "../api"; +import { useLocale } from "../hooks/useLocale"; + +type DiaryEntry = TimelineEntry; + +interface MonthGroup { + key: string; + label: string; + entries: DiaryEntry[]; + totalChars: number; +} + +interface Props { + onOpenFile: (path: string) => void; +} + +export function Timeline({ onOpenFile }: Props) { + const { t, locale } = useLocale(); + const [entries, setEntries] = useState([]); + const [loading, setLoading] = useState(true); + const [expanded, setExpanded] = useState>(new Set()); + const [tagFilter, setTagFilter] = useState(null); + + useEffect(() => { + (async () => { + setLoading(true); + try { + const data = await fetchTimeline(); + setEntries(data); + const now = new Date().toISOString().slice(0, 7); + setExpanded(new Set([now])); + } catch (e) { + console.error("Timeline load failed:", e); + } finally { + setLoading(false); + } + })(); + }, []); + + const filtered = useMemo(() => { + if (!tagFilter) return entries; + return entries.filter(e => e.tags.some(t => t.includes(tagFilter))); + }, [entries, tagFilter]); + + const months = useMemo((): MonthGroup[] => { + const map: Record = {}; + for (const e of filtered) { + const k = e.date.slice(0, 7); + (map[k] ||= []).push(e); + } + const zhMonths = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]; + const enMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + return Object.entries(map) + .sort(([a], [b]) => b.localeCompare(a)) + .map(([k, entries]) => { + const [y, m] = k.split("-"); + const mi = parseInt(m) - 1; + const label = locale.startsWith("zh") ? `${y} 年 ${zhMonths[mi]}` : `${enMonths[mi]} ${y}`; + return { + key: k, + label, + entries: entries.sort((a, b) => b.date.localeCompare(a.date)), + totalChars: entries.reduce((s, e) => s + e.charCount, 0), + }; + }); + }, [filtered, locale]); + + const allTags = useMemo(() => { + const count: Record = {}; + for (const e of entries) for (const t of e.tags) count[t] = (count[t] || 0) + 1; + return Object.entries(count).sort(([, a], [, b]) => b - a).slice(0, 12); + }, [entries]); + + const stats = useMemo(() => ({ + total: entries.length, + chars: entries.reduce((s, e) => s + e.charCount, 0), + months: new Set(entries.map(e => e.date.slice(0, 7))).size, + }), [entries]); + + const toggle = (k: string) => setExpanded(prev => { + const next = new Set(prev); + next.has(k) ? next.delete(k) : next.add(k); + return next; + }); + + const weekday = (d: string) => { + const days = locale.startsWith("zh") + ? ["日", "一", "二", "三", "四", "五", "六"] + : ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + return days[new Date(d + "T00:00:00").getDay()]; + }; + + const fmtChars = (n: number) => n >= 10000 ? `${(n / 10000).toFixed(1)}万` : n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n); + + return ( +
    + {/* Stats bar */} +
    +
    + + {stats.total} + {t("timeline.entries")} +
    +
    + + {fmtChars(stats.chars)} + {t("timeline.chars")} +
    +
    + + {stats.months} + {t("timeline.months")} +
    + {loading && ( +
    + )} +
    + + {/* Tags */} + {allTags.length > 0 && ( +
    + + {tagFilter && ( + + )} + {allTags.map(([tag, count]) => ( + + ))} +
    + )} + + {/* Month groups */} + {months.length === 0 && !loading && ( +
    + +

    {t("timeline.empty")}

    +
    + )} + +
    + {months.map(group => ( +
    + {/* Month header */} + + + {/* Entries */} + {expanded.has(group.key) && ( +
    + {group.entries.map((entry, i) => ( + + ))} +
    + )} +
    + ))} +
    +
    + ); +} diff --git a/memory-viewer/src/hooks/useAgents.ts b/memory-viewer/src/hooks/useAgents.ts new file mode 100644 index 0000000..40927de --- /dev/null +++ b/memory-viewer/src/hooks/useAgents.ts @@ -0,0 +1,60 @@ +import { useState, useCallback, useEffect } from "react"; +import { fetchAgents, setCurrentAgent, type AgentInfo } from "../api"; + +const STORAGE_KEY = "memory-viewer-selected-agent"; + +export function useAgents() { + const [agents, setAgents] = useState([]); + const [selectedAgentId, setSelectedAgentId] = useState(() => { + return localStorage.getItem(STORAGE_KEY) || "default"; + }); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + const loadAgents = useCallback(async () => { + try { + setLoading(true); + const data = await fetchAgents(); + setAgents(data); + setError(null); + + // Validate selected agent still exists + const exists = data.find((a) => a.id === selectedAgentId); + if (!exists && data.length > 0) { + // Fall back to default or first agent + const defaultAgent = data.find((a) => a.id === "default") || data[0]; + setSelectedAgentId(defaultAgent.id); + setCurrentAgent(defaultAgent.id); + localStorage.setItem(STORAGE_KEY, defaultAgent.id); + } else if (exists) { + setCurrentAgent(selectedAgentId); + } + } catch (e: any) { + setError(e.message || "Failed to load agents"); + } finally { + setLoading(false); + } + }, [selectedAgentId]); + + const selectAgent = useCallback((agentId: string) => { + setSelectedAgentId(agentId); + setCurrentAgent(agentId); + localStorage.setItem(STORAGE_KEY, agentId); + }, []); + + useEffect(() => { + loadAgents(); + }, [loadAgents]); + + const selectedAgent = agents.find((a) => a.id === selectedAgentId) || agents[0]; + + return { + agents, + selectedAgent, + selectedAgentId, + selectAgent, + loading, + error, + refresh: loadAgents, + }; +} diff --git a/memory-viewer/src/hooks/useConnections.ts b/memory-viewer/src/hooks/useConnections.ts new file mode 100644 index 0000000..c08f83a --- /dev/null +++ b/memory-viewer/src/hooks/useConnections.ts @@ -0,0 +1,120 @@ +import { useState, useCallback, useEffect, useRef } from "react"; + +export interface BotConnection { + id: string; + name: string; + url: string; // "" for local + token?: string; + isLocal?: boolean; +} + +const STORAGE_KEY = "memory-viewer-connections"; +const ACTIVE_KEY = "memory-viewer-active-connection"; + +const LOCAL_CONNECTION: BotConnection = { + id: "local", + name: "Local", + url: "", + isLocal: true, +}; + +function loadConnections(): BotConnection[] { + try { + const raw = localStorage.getItem(STORAGE_KEY); + if (raw) { + const list = JSON.parse(raw) as BotConnection[]; + // Ensure local is always first + if (!list.find((c) => c.id === "local")) { + list.unshift(LOCAL_CONNECTION); + } + return list; + } + } catch { /* ignore */ } + return [LOCAL_CONNECTION]; +} + +function saveConnections(list: BotConnection[]) { + localStorage.setItem(STORAGE_KEY, JSON.stringify(list)); +} + +export function useConnections() { + const [connections, setConnections] = useState(loadConnections); + const [activeId, setActiveId] = useState(() => { + return localStorage.getItem(ACTIVE_KEY) || "local"; + }); + const [statuses, setStatuses] = useState>({}); + const intervalRef = useRef>(); + + const active = connections.find((c) => c.id === activeId) || connections[0]; + + const addConnection = useCallback((conn: Omit) => { + const id = `bot-${Date.now()}`; + setConnections((prev) => { + const next = [...prev, { ...conn, id }]; + saveConnections(next); + return next; + }); + }, []); + + const updateConnection = useCallback((id: string, updates: Partial) => { + setConnections((prev) => { + const next = prev.map((c) => (c.id === id ? { ...c, ...updates } : c)); + saveConnections(next); + return next; + }); + }, []); + + const removeConnection = useCallback((id: string) => { + if (id === "local") return; + setConnections((prev) => { + const next = prev.filter((c) => c.id !== id); + saveConnections(next); + return next; + }); + setActiveId((prev) => (prev === id ? "local" : prev)); + }, []); + + const switchTo = useCallback((id: string) => { + setActiveId(id); + localStorage.setItem(ACTIVE_KEY, id); + }, []); + + // Check connection statuses + const checkStatuses = useCallback(async () => { + const results: Record = {}; + await Promise.all( + connections.map(async (conn) => { + if (conn.isLocal) { + results[conn.id] = true; + return; + } + try { + const r = await fetch(`${conn.url.replace(/\/+$/, "")}/api/system`, { + signal: AbortSignal.timeout(5000), + }); + results[conn.id] = r.ok; + } catch { + results[conn.id] = false; + } + }) + ); + setStatuses(results); + }, [connections]); + + useEffect(() => { + checkStatuses(); + intervalRef.current = setInterval(checkStatuses, 30000); + return () => clearInterval(intervalRef.current); + }, [checkStatuses]); + + return { + connections, + active, + statuses, + addConnection, + updateConnection, + removeConnection, + switchTo, + checkStatuses, + }; +} diff --git a/memory-viewer/src/hooks/useLocale.ts b/memory-viewer/src/hooks/useLocale.ts new file mode 100644 index 0000000..90e8bf0 --- /dev/null +++ b/memory-viewer/src/hooks/useLocale.ts @@ -0,0 +1,40 @@ +import { createContext, useContext, useState, useCallback, useMemo } from "react"; +import { type Locale, translate } from "../i18n"; + +interface LocaleContextValue { + locale: Locale; + setLocale: (l: Locale) => void; + toggleLocale: () => void; + t: (key: string) => string; +} + +function getInitialLocale(): Locale { + try { + const saved = localStorage.getItem("mv-locale"); + if (saved === "zh" || saved === "en") return saved; + } catch {} + return "en"; +} + +export const LocaleContext = createContext(null!); + +export function useLocaleState() { + const [locale, setLocaleRaw] = useState(getInitialLocale); + + const setLocale = useCallback((l: Locale) => { + setLocaleRaw(l); + try { localStorage.setItem("mv-locale", l); } catch {} + }, []); + + const toggleLocale = useCallback(() => { + setLocale(locale === "en" ? "zh" : "en"); + }, [locale, setLocale]); + + const t = useCallback((key: string) => translate(key, locale), [locale]); + + return useMemo(() => ({ locale, setLocale, toggleLocale, t }), [locale, setLocale, toggleLocale, t]); +} + +export function useLocale() { + return useContext(LocaleContext); +} diff --git a/memory-viewer/src/hooks/useResizableSidebar.ts b/memory-viewer/src/hooks/useResizableSidebar.ts new file mode 100644 index 0000000..c407604 --- /dev/null +++ b/memory-viewer/src/hooks/useResizableSidebar.ts @@ -0,0 +1,75 @@ +import { useState, useEffect, useCallback, useRef } from "react"; + +const SIDEBAR_WIDTH_KEY = "memory-viewer-sidebar-width"; +const DEFAULT_WIDTH = 320; +const MIN_WIDTH = 200; +const MAX_WIDTH = 600; + +export function useResizableSidebar() { + const [width, setWidth] = useState(() => { + const saved = localStorage.getItem(SIDEBAR_WIDTH_KEY); + return saved ? Number(saved) : DEFAULT_WIDTH; + }); + const isDragging = useRef(false); + const startX = useRef(0); + const startWidth = useRef(0); + + useEffect(() => { + localStorage.setItem(SIDEBAR_WIDTH_KEY, String(width)); + }, [width]); + + const handleMove = useCallback((clientX: number) => { + if (!isDragging.current) return; + const newWidth = Math.min(MAX_WIDTH, Math.max(MIN_WIDTH, startWidth.current + clientX - startX.current)); + setWidth(newWidth); + }, []); + + const handleEnd = useCallback(() => { + isDragging.current = false; + document.body.style.cursor = ""; + document.body.style.userSelect = ""; + }, []); + + // Mouse events + const onMouseDown = useCallback((e: React.MouseEvent) => { + e.preventDefault(); + isDragging.current = true; + startX.current = e.clientX; + startWidth.current = width; + + const onMouseMove = (e: MouseEvent) => handleMove(e.clientX); + const onMouseUp = () => { + handleEnd(); + document.removeEventListener("mousemove", onMouseMove); + document.removeEventListener("mouseup", onMouseUp); + }; + + document.body.style.cursor = "col-resize"; + document.body.style.userSelect = "none"; + document.addEventListener("mousemove", onMouseMove); + document.addEventListener("mouseup", onMouseUp); + }, [width, handleMove, handleEnd]); + + // Touch events + const onTouchStart = useCallback((e: React.TouchEvent) => { + if (e.touches.length !== 1) return; + isDragging.current = true; + startX.current = e.touches[0].clientX; + startWidth.current = width; + + const onTouchMove = (e: TouchEvent) => { + if (e.touches.length !== 1) return; + handleMove(e.touches[0].clientX); + }; + const onTouchEnd = () => { + handleEnd(); + document.removeEventListener("touchmove", onTouchMove); + document.removeEventListener("touchend", onTouchEnd); + }; + + document.addEventListener("touchmove", onTouchMove, { passive: true }); + document.addEventListener("touchend", onTouchEnd); + }, [width, handleMove, handleEnd]); + + return { width, onMouseDown, onTouchStart, MIN_WIDTH, MAX_WIDTH }; +} diff --git a/memory-viewer/src/hooks/useSensitive.ts b/memory-viewer/src/hooks/useSensitive.ts new file mode 100644 index 0000000..7ada6e5 --- /dev/null +++ b/memory-viewer/src/hooks/useSensitive.ts @@ -0,0 +1,23 @@ +import { useState, useEffect, createContext, useContext } from "react"; + +const SensitiveContext = createContext({ hidden: true, toggle: () => {} }); + +export function useSensitiveState() { + const [hidden, setHidden] = useState(() => { + if (typeof window !== "undefined") { + return localStorage.getItem("sensitive-hidden") !== "false"; + } + return true; + }); + + useEffect(() => { + localStorage.setItem("sensitive-hidden", String(hidden)); + }, [hidden]); + + const toggle = () => setHidden((h) => !h); + + return { hidden, toggle }; +} + +export const SensitiveProvider = SensitiveContext.Provider; +export const useSensitive = () => useContext(SensitiveContext); diff --git a/memory-viewer/src/hooks/useTheme.ts b/memory-viewer/src/hooks/useTheme.ts new file mode 100644 index 0000000..fef3f6e --- /dev/null +++ b/memory-viewer/src/hooks/useTheme.ts @@ -0,0 +1,28 @@ +import { useState, useEffect } from "react"; + +type Theme = "dark" | "light"; + +export function useTheme() { + const [theme, setTheme] = useState(() => { + if (typeof window !== "undefined") { + return (localStorage.getItem("theme") as Theme) || "dark"; + } + return "dark"; + }); + + useEffect(() => { + const root = document.documentElement; + if (theme === "dark") { + root.classList.add("dark"); + root.classList.remove("light"); + } else { + root.classList.add("light"); + root.classList.remove("dark"); + } + localStorage.setItem("theme", theme); + }, [theme]); + + const toggle = () => setTheme((t) => (t === "dark" ? "light" : "dark")); + + return { theme, toggle }; +} diff --git a/memory-viewer/src/hooks/useWebSocket.ts b/memory-viewer/src/hooks/useWebSocket.ts new file mode 100644 index 0000000..a30a73c --- /dev/null +++ b/memory-viewer/src/hooks/useWebSocket.ts @@ -0,0 +1,44 @@ +import { useEffect, useRef, useCallback } from "react"; + +type MessageHandler = (data: { type: string; event: string; path: string }) => void; + +/** + * Auto-reconnecting WebSocket hook for live file-change notifications. + * Supports dynamic URL for remote connections. + */ +export function useWebSocket(onMessage: MessageHandler, remoteBaseUrl = "") { + const wsRef = useRef(null); + const cbRef = useRef(onMessage); + cbRef.current = onMessage; + + const connect = useCallback(() => { + let wsUrl: string; + if (remoteBaseUrl) { + // Convert http(s)://host:port to ws(s)://host:port/ws + const url = new URL(remoteBaseUrl); + const proto = url.protocol === "https:" ? "wss:" : "ws:"; + wsUrl = `${proto}//${url.host}/ws`; + } else { + const proto = location.protocol === "https:" ? "wss:" : "ws:"; + wsUrl = `${proto}//${location.host}/ws`; + } + const ws = new WebSocket(wsUrl); + + ws.onmessage = (e) => { + try { + cbRef.current(JSON.parse(e.data)); + } catch { /* ignore bad json */ } + }; + + ws.onclose = () => { + setTimeout(connect, 3000); + }; + + wsRef.current = ws; + }, [remoteBaseUrl]); + + useEffect(() => { + connect(); + return () => wsRef.current?.close(); + }, [connect]); +} diff --git a/memory-viewer/src/hooks/useZoom.ts b/memory-viewer/src/hooks/useZoom.ts new file mode 100644 index 0000000..aa2c14c --- /dev/null +++ b/memory-viewer/src/hooks/useZoom.ts @@ -0,0 +1,18 @@ +import { useState, useEffect } from "react"; + +const ZOOM_KEY = "memory-viewer-zoom"; +const ZOOM_LEVELS = [75, 80, 90, 100, 110, 125, 150]; +const DEFAULT_ZOOM = 100; + +export function useZoom() { + const [zoom, setZoom] = useState(() => { + const saved = localStorage.getItem(ZOOM_KEY); + return saved ? Number(saved) : DEFAULT_ZOOM; + }); + + useEffect(() => { + localStorage.setItem(ZOOM_KEY, String(zoom)); + }, [zoom]); + + return { zoom, setZoom, ZOOM_LEVELS }; +} diff --git a/memory-viewer/src/i18n.ts b/memory-viewer/src/i18n.ts new file mode 100644 index 0000000..12a6b6b --- /dev/null +++ b/memory-viewer/src/i18n.ts @@ -0,0 +1,244 @@ +export type Locale = "en" | "zh"; + +const dict: Record> = { + // Sidebar + "sidebar.agentConfig": { en: "Agent Config", zh: "智能体配置" }, + "sidebar.coreFiles": { en: "Core Files", zh: "核心文件" }, + "sidebar.dailyNotes": { en: "Daily Notes", zh: "每日日记" }, + "sidebar.today": { en: "Today", zh: "今日日记" }, + "sidebar.quickAccess": { en: "Quick Access", zh: "快速访问" }, + + // Skills Page + "skills.title": { en: "Skills", zh: "技能" }, + "skills.description": { en: "Agent capabilities and extensions", zh: "智能体能力与扩展" }, + "skills.empty": { en: "No skills found", zh: "未找到技能" }, + "sidebar.skills": { en: "Skills", zh: "技能" }, + "sidebar.files": { en: "Files", zh: "文件" }, + "sidebar.search": { en: "Search…", zh: "搜索…" }, + "sidebar.footer": { en: "Silicon Dawn · Memory Viewer", zh: "Silicon Dawn · 记忆查看器" }, + "sidebar.showSensitive": { en: "Show sensitive content", zh: "显示敏感内容" }, + "sidebar.hideSensitive": { en: "Hide sensitive content", zh: "隐藏敏感内容" }, + "sidebar.lightMode": { en: "Switch to light mode", zh: "切换到浅色模式" }, + "sidebar.darkMode": { en: "Switch to dark mode", zh: "切换到深色模式" }, + + // Agent Status + "agent.title": { en: "Agent Status", zh: "智能体状态" }, + "agent.gateway": { en: "Gateway", zh: "网关" }, + "agent.models": { en: "Models", zh: "模型" }, + "agent.heartbeat": { en: "Heartbeat", zh: "心跳" }, + "agent.config": { en: "Safe Config", zh: "安全配置" }, + "agent.running": { en: "Running", zh: "运行中" }, + "agent.stopped": { en: "Stopped", zh: "已停止" }, + "agent.uptime": { en: "uptime", zh: "运行时间" }, + "agent.port": { en: "Port", zh: "端口" }, + "agent.pid": { en: "PID", zh: "PID" }, + "agent.mode": { en: "Mode", zh: "模式" }, + "agent.primary": { en: "Primary Model", zh: "主模型" }, + "agent.ready": { en: "Ready to inference", zh: "就绪" }, + "agent.lastActivity": { en: "Last activity", zh: "最近活动" }, + "agent.noHeartbeat": { en: "No heartbeat data", zh: "无心跳数据" }, + "agent.channel": { en: "channel", zh: "通道" }, + "agent.loading": { en: "Loading status...", zh: "加载状态..." }, + "agent.error": { en: "Failed to load status. Ensure the server is running on the same machine as the agent.", zh: "加载失败。请确保服务器与 Agent 运行在同一台机器上。" }, + + // Dashboard + "dashboard.title": { en: "Dashboard", zh: "仪表盘" }, + "dashboard.uptime": { en: "Uptime", zh: "运行时间" }, + "dashboard.memory": { en: "Memory", zh: "内存" }, + "dashboard.load": { en: "Load", zh: "负载" }, + "dashboard.files": { en: "Files", zh: "文件" }, + "dashboard.mdTracked": { en: ".md files tracked", zh: "个 .md 文件" }, + "dashboard.todayMemory": { en: "Today's Memory", zh: "今日记忆" }, + "dashboard.viewFull": { en: "View full →", zh: "查看全部 →" }, + "dashboard.noMemoryToday": { en: "No memory entries for today yet.", zh: "今天还没有记忆条目。" }, + "dashboard.recentlyModified": { en: "Recently Modified", zh: "最近修改" }, + "dashboard.memoryByMonth": { en: "Memory by Month", zh: "月度记忆" }, + "dashboard.quickAccess": { en: "Quick Access", zh: "快速访问" }, + "dashboard.loading": { en: "Loading…", zh: "加载中…" }, + "dashboard.noFiles": { en: "No files found.", zh: "未找到文件。" }, + "dashboard.noMemoryFiles": { en: "No memory files found.", zh: "未找到记忆文件。" }, + "dashboard.characters": { en: "characters", zh: "个字符" }, + "dashboard.justNow": { en: "just now", zh: "刚刚" }, + "dashboard.minAgo": { en: "min ago", zh: "分钟前" }, + "dashboard.hAgo": { en: "h ago", zh: "小时前" }, + "dashboard.dAgo": { en: "d ago", zh: "天前" }, + + // FileViewer + "file.edit": { en: "Edit", zh: "编辑" }, + "file.save": { en: "Save", zh: "保存" }, + "file.cancel": { en: "Cancel", zh: "取消" }, + "file.saved": { en: "Saved", zh: "已保存" }, + "file.failedToLoad": { en: "Failed to load", zh: "加载失败" }, + "file.saveFailed": { en: "Save failed", zh: "保存失败" }, + "file.words": { en: "words", zh: "词" }, + "file.discardChanges": { en: "Discard unsaved changes?", zh: "放弃未保存的更改?" }, + "file.reloaded": { en: "Reloaded from server", zh: "已从服务器重新加载" }, + "changelog.title": { en: "Changelog", zh: "更新日志" }, + "changelog.back": { en: "Back", zh: "返回" }, + "sidebar.changelog": { en: "Changelog", zh: "更新日志" }, + "file.conflictTitle": { en: "File Conflict", zh: "文件冲突" }, + "file.conflictDesc": { en: "This file was modified on disk while you were editing. Your changes have not been saved.", zh: "文件在编辑期间被其他程序修改,您的更改尚未保存。" }, + "file.conflictTime": { en: "Modified at", zh: "修改时间" }, + "file.conflictOverwrite": { en: "Overwrite", zh: "覆盖" }, + "file.conflictReload": { en: "Reload", zh: "重新加载" }, + "file.loading": { en: "Loading…", zh: "加载中…" }, + "file.backToTop": { en: "Back to top", zh: "返回顶部" }, + "file.copy": { en: "Copy", zh: "复制" }, + + // Search + "search.placeholder": { en: "Search all memory files…", zh: "搜索所有记忆文件…" }, + "search.noResults": { en: "No results found for", zh: "未找到相关结果:" }, + "search.files": { en: "files", zh: "个文件" }, + "search.matches": { en: "matches", zh: "个匹配" }, + "search.results": { en: "results", zh: "个结果" }, + "settings.title": { en: "Settings", zh: "设置" }, + "settings.embedding.title": { en: "Vector Search", zh: "向量搜索" }, + "settings.embedding.description": { en: "Configure an OpenAI-compatible embedding API for semantic search. Supports OpenAI, DeepSeek, SiliconFlow, Ollama, etc.", zh: "配置 OpenAI 兼容的 Embedding API 进行语义搜索。支持 OpenAI、DeepSeek、SiliconFlow、Ollama 等。" }, + "settings.embedding.model": { en: "Model", zh: "模型" }, + "settings.testConnection": { en: "Test Connection", zh: "测试连接" }, + "settings.testing": { en: "Testing…", zh: "测试中…" }, + "settings.save": { en: "Save", zh: "保存" }, + "settings.saving": { en: "Saving…", zh: "保存中…" }, + "settings.saved": { en: "Saved", zh: "已保存" }, + "settings.saveFailed": { en: "Save failed", zh: "保存失败" }, + "search.modeText": { en: "Text", zh: "文本" }, + "search.modeSemantic": { en: "Semantic", zh: "语义" }, + "search.relevance": { en: "relevance", zh: "相关度" }, + + // Connections + "connections.title": { en: "Connections", zh: "连接管理" }, + "connections.add": { en: "Add", zh: "添加" }, + "connections.addNew": { en: "Add Connection", zh: "添加连接" }, + "connections.edit": { en: "Edit Connection", zh: "编辑连接" }, + "connections.save": { en: "Save", zh: "保存" }, + "connections.cancel": { en: "Cancel", zh: "取消" }, + "connections.refresh": { en: "Refresh", zh: "刷新" }, + "connections.active": { en: "Active", zh: "当前连接" }, + "connections.namePlaceholder": { en: "Name (e.g. Bot 01)", zh: "名称(如 Bot 01)" }, + "connections.urlPlaceholder": { en: "URL (e.g. http://host:8901)", zh: "URL(如 http://host:8901)" }, + "connections.tokenPlaceholder": { en: "Token (optional)", zh: "Token(可选)" }, + "connections.switchBot": { en: "Switch Bot", zh: "切换 Bot" }, + "connections.manage": { en: "Manage", zh: "管理" }, + "connections.modeDirect": { en: "Direct", zh: "直连" }, + "connections.modeGateway": { en: "Gateway", zh: "网关" }, + "connections.gatewayUrl": { en: "Gateway URL", zh: "网关地址" }, + "connections.gatewayUrlPlaceholder": { en: "Gateway URL (e.g. http://host:18789)", zh: "网关地址(如 http://host:18789)" }, + "connections.gatewayToken": { en: "Gateway Token", zh: "网关 Token" }, + "connections.gatewayTokenPlaceholder": { en: "Gateway API Token", zh: "网关 API Token" }, + "connections.mvPort": { en: "MV Port", zh: "MV 端口" }, + "connections.mvPortPlaceholder": { en: "Memory Viewer Port (default 8901)", zh: "Memory Viewer 端口(默认 8901)" }, + + // Bootstrap + "bootstrap.checking": { en: "Checking if Memory Viewer is running…", zh: "正在检测 Memory Viewer 是否运行…" }, + "bootstrap.alreadyRunning": { en: "Memory Viewer is already running! Connection saved.", zh: "Memory Viewer 已在运行!连接已保存。" }, + "bootstrap.notInstalled": { en: "Remote bot doesn't have Memory Viewer installed.", zh: "远程 Bot 未安装 Memory Viewer。" }, + "bootstrap.installPrompt": { en: "Would you like to install it via Gateway API? This will send commands to the remote bot.", zh: "是否通过网关 API 安装?这将向远程 Bot 发送安装指令。" }, + "bootstrap.install": { en: "Install", zh: "安装" }, + "bootstrap.installing": { en: "Installing Memory Viewer via Gateway…", zh: "正在通过网关安装 Memory Viewer…" }, + "bootstrap.botResponse": { en: "Bot Response", zh: "Bot 回复" }, + "bootstrap.verifying": { en: "Verifying installation…", zh: "正在验证安装…" }, + "bootstrap.success": { en: "Memory Viewer installed and connected successfully!", zh: "Memory Viewer 安装成功并已连接!" }, + "bootstrap.failed": { en: "Could not connect after installation. The bot may need more time.", zh: "安装后无法连接。Bot 可能需要更多时间。" }, + "bootstrap.retry": { en: "Retry Verification", zh: "重试验证" }, + "bootstrap.close": { en: "Close", zh: "关闭" }, + "bootstrap.error": { en: "Error", zh: "错误" }, + "bootstrap.done": { en: "Done", zh: "完成" }, + + // Heatmap + "heatmap.activeDays": { en: "active days", zh: "个活跃日" }, + "heatmap.total": { en: "total", zh: "总计" }, + "heatmap.perDay": { en: "/day", zh: "/天" }, + "heatmap.less": { en: "Less", zh: "少" }, + "heatmap.more": { en: "More", zh: "多" }, + "heatmap.noData": { en: "No data", zh: "无数据" }, + + // Timeline + "sidebar.timeline": { en: "Timeline", zh: "时间线" }, + "timeline.title": { en: "Memory Timeline", zh: "记忆时间线" }, + "timeline.loading": { en: "Loading memories…", zh: "正在加载记忆…" }, + "timeline.entries": { en: "entries", zh: "篇日记" }, + "timeline.words": { en: "chars", zh: "字符" }, + "timeline.tags": { en: "tags", zh: "标签" }, + "timeline.filterByTag": { en: "Filter by tag:", zh: "按标签筛选:" }, + "timeline.noResults": { en: "No entries found with this tag", zh: "未找到包含此标签的日记" }, + "timeline.empty": { en: "No memory entries found", zh: "未找到记忆日记" }, + "timeline.chars": { en: "chars", zh: "字" }, + "timeline.months": { en: "months", zh: "个月" }, + + // Tags + "sidebar.tags": { en: "Tags", zh: "标签" }, + "tags.title": { en: "Tags", zh: "标签" }, + "tags.subtitle": { en: "Browse memories by topic", zh: "按主题浏览记忆" }, + "tags.totalTags": { en: "tags", zh: "标签" }, + "tags.totalFiles": { en: "files", zh: "文件" }, + "tags.avgPerTag": { en: "avg", zh: "平均" }, + "tags.popular": { en: "Popular Tags", zh: "热门标签" }, + "tags.clear": { en: "Clear filter", zh: "清除筛选" }, + "tags.showing": { en: "Showing tag:", zh: "显示标签:" }, + "tags.files": { en: "files", zh: "个文件" }, + "tags.tags": { en: "tags", zh: "个标签" }, + "tags.noFiles": { en: "No files found with this tag", zh: "没有找到相关文件" }, + "tags.empty": { en: "No tags yet", zh: "暂无标签" }, + "tags.emptyHint": { en: "Use ## headers or #hashtags in Markdown to create tags", zh: "在 Markdown 中使用 ## 标题 或 #标签 来创建标签" }, + + // Settings + "settings.title": { en: "Settings", zh: "设置" }, + "sidebar.settings": { en: "Settings", zh: "设置" }, + "settings.embedding.title": { en: "Embedding Search", zh: "向量搜索" }, + "settings.embedding.enable": { en: "Enable Embedding Search", zh: "启用向量搜索" }, + "settings.embedding.enableDesc": { en: "Use OpenAI Embeddings API for semantic search", zh: "使用 OpenAI Embeddings API 进行语义搜索" }, + "settings.embedding.apiUrl": { en: "API URL", zh: "API 地址" }, + "settings.embedding.apiUrlDesc": { en: "OpenAI Embeddings API or compatible endpoint", zh: "OpenAI Embeddings API 或兼容的端点" }, + "settings.embedding.apiKey": { en: "API Key", zh: "API 密钥" }, + "settings.embedding.apiKeyDesc": { en: "OpenAI API key (sk-...)", zh: "OpenAI API 密钥 (sk-...)" }, + "settings.embedding.apiKeySet": { en: "API key is set", zh: "API 密钥已设置" }, + "settings.embedding.model": { en: "Model", zh: "模型" }, + "settings.embedding.modelDesc": { en: "Embedding model name, e.g. text-embedding-3-small", zh: "Embedding 模型名称,如 text-embedding-3-small" }, + "settings.embedding.test": { en: "Test Connection", zh: "测试连接" }, + "settings.embedding.testing": { en: "Testing...", zh: "测试中..." }, + "settings.save": { en: "Save Settings", zh: "保存设置" }, + "settings.saving": { en: "Saving...", zh: "保存中..." }, + + // Cron + "sidebar.cron": { en: "Cron Jobs", zh: "定时任务" }, + "cron.title": { en: "Cron Jobs", zh: "定时任务" }, + "cron.subtitle": { en: "Manage scheduled tasks", zh: "管理定时任务" }, + "cron.total": { en: "Total", zh: "总计" }, + "cron.enabled": { en: "Enabled", zh: "已启用" }, + "cron.disabled": { en: "Disabled", zh: "已禁用" }, + "cron.refresh": { en: "Refresh", zh: "刷新" }, + "cron.enable": { en: "Enable", zh: "启用" }, + "cron.disable": { en: "Disable", zh: "禁用" }, + "cron.runNow": { en: "Run Now", zh: "立即运行" }, + "cron.history": { en: "History", zh: "历史" }, + "cron.runHistory": { en: "Run History", zh: "运行历史" }, + "cron.loading": { en: "Loading…", zh: "加载中…" }, + "cron.noRuns": { en: "No run history", zh: "暂无运行记录" }, + "cron.empty": { en: "No cron jobs configured", zh: "暂无定时任务" }, + "cron.justNow": { en: "just now", zh: "刚刚" }, + "cron.soonLabel": { en: "soon", zh: "即将" }, + "cron.minAgo": { en: "m ago", zh: "分钟前" }, + "cron.minLater": { en: "m later", zh: "分钟后" }, + "cron.hAgo": { en: "h ago", zh: "小时前" }, + "cron.hLater": { en: "h later", zh: "小时后" }, + "cron.dAgo": { en: "d ago", zh: "天前" }, + "cron.dLater": { en: "d later", zh: "天后" }, + + // Months + "month.01": { en: "Jan", zh: "1月" }, + "month.02": { en: "Feb", zh: "2月" }, + "month.03": { en: "Mar", zh: "3月" }, + "month.04": { en: "Apr", zh: "4月" }, + "month.05": { en: "May", zh: "5月" }, + "month.06": { en: "Jun", zh: "6月" }, + "month.07": { en: "Jul", zh: "7月" }, + "month.08": { en: "Aug", zh: "8月" }, + "month.09": { en: "Sep", zh: "9月" }, + "month.10": { en: "Oct", zh: "10月" }, + "month.11": { en: "Nov", zh: "11月" }, + "month.12": { en: "Dec", zh: "12月" }, +}; + +export function translate(key: string, locale: Locale): string { + return dict[key]?.[locale] ?? key; +} diff --git a/memory-viewer/src/index.css b/memory-viewer/src/index.css new file mode 100644 index 0000000..947abde --- /dev/null +++ b/memory-viewer/src/index.css @@ -0,0 +1,444 @@ +@import "tailwindcss"; + +@theme { + --font-mono: 'JetBrains Mono', 'Fira Code', monospace; +} + +/* ===== Theme System ===== */ +/* Light default: Maple (warm, soft, nature-inspired) */ +:root, .theme-maple-light { + --bg-primary: #faf8f5; + --bg-secondary: #ffffff; + --bg-tertiary: #f5f0eb; + --bg-hover: rgba(139,90,43,0.04); + --bg-active: rgba(180,83,9,0.08); + --border: #e8ddd0; + --border-light: #f0e8de; + --text-primary: #1c1410; + --text-secondary: #44362a; + --text-muted: #7c6a58; + --text-faint: #a89580; + --code-bg: #f5efe8; + --code-text: #9a3412; + --pre-bg: #faf6f1; + --pre-border: #e8ddd0; + --pre-text: #44362a; + --link: #b45309; + --link-hover: #92400e; + --blockquote-border: rgba(180,83,9,0.35); + --blockquote-text: #7c6a58; + --blockquote-bg: rgba(245,240,235,0.6); + --th-bg: #f5efe8; + --tr-hover: rgba(139,90,43,0.04); + --scrollbar-thumb: rgba(139,90,43,0.2); + --scrollbar-hover: rgba(139,90,43,0.35); + --toast-bg: #292017; + --toast-text: #fff; + --editor-bg: rgba(245,240,235,0.5); + --ring: rgba(180,83,9,0.4); + /* Markdown headings */ + --md-h1: #78350f; + --md-h2: #92400e; + --md-h3: #a16207; + --md-h1-border: #d6c4a8; + --md-h2-border: #e8ddd0; + --md-strong: #1c1410; + --md-em: #92400e; + --md-hr: #d6c4a8; +} + +/* Dark default: Material (Google Material Design inspired) */ +.dark, .theme-material-dark { + --bg-primary: #0f111a; + --bg-secondary: #1a1c2b; + --bg-tertiary: #242637; + --bg-hover: rgba(130,170,255,0.04); + --bg-active: rgba(130,170,255,0.12); + --border: #2a2d3e; + --border-light: rgba(42,45,62,0.6); + --text-primary: #eeffff; + --text-secondary: #b0bec5; + --text-muted: #78909c; + --text-faint: #546e7a; + --code-bg: #1d1f31; + --code-text: #c3e88d; + --pre-bg: #0f111a; + --pre-border: #2a2d3e; + --pre-text: #b0bec5; + --link: #82aaff; + --link-hover: #a6c4ff; + --blockquote-border: rgba(130,170,255,0.4); + --blockquote-text: #78909c; + --blockquote-bg: rgba(36,38,55,0.5); + --th-bg: rgba(36,38,55,0.6); + --tr-hover: rgba(15,17,26,0.5); + --scrollbar-thumb: rgba(84,110,122,0.5); + --scrollbar-hover: rgba(84,110,122,0.7); + --toast-bg: #242637; + --toast-text: #eeffff; + --editor-bg: rgba(15,17,26,0.6); + --ring: rgba(130,170,255,0.5); + /* Markdown headings */ + --md-h1: #c792ea; + --md-h2: #82aaff; + --md-h3: #ffcb6b; + --md-h1-border: #3a3d52; + --md-h2-border: rgba(42,45,62,0.6); + --md-strong: #eeffff; + --md-em: #f78c6c; + --md-hr: #3a3d52; +} + +body { + background-color: var(--bg-primary); + color: var(--text-primary); + font-family: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; + -webkit-font-smoothing: antialiased; + font-size: 16px; +} + +/* Tesla mode — large touch-friendly UI for car displays */ +.tesla-mode { + font-size: 24px; +} +.tesla-mode .markdown-body { font-size: 24px !important; line-height: 1.9; } +.tesla-mode .markdown-body h1 { font-size: 2.4rem; } +.tesla-mode .markdown-body h2 { font-size: 2rem; } +.tesla-mode .markdown-body h3 { font-size: 1.6rem; } +.tesla-mode .markdown-body h4 { font-size: 1.3rem; } +.tesla-mode .markdown-body code { font-size: 0.85em; padding: 4px 8px; } +.tesla-mode .markdown-body pre { padding: 20px; font-size: 0.85em; } +.tesla-mode .markdown-body li { margin-bottom: 6px; } +.tesla-mode .sidebar-header { padding: 1.2rem 1.5rem; } +.tesla-mode .sidebar-header button { font-size: 1.3rem !important; } +.tesla-mode .sidebar-header svg { width: 24px !important; height: 24px !important; } +.tesla-mode .sidebar-footer { font-size: 1rem; padding: 1rem 1.5rem; } +.tesla-mode .sidebar button, +.tesla-mode .sidebar a { min-height: 56px; padding: 12px 16px !important; font-size: 1.15rem; } +.tesla-mode .btn-primary, .tesla-mode .btn-secondary { min-height: 56px; padding: 14px 24px !important; font-size: 1.15rem; } +.tesla-mode button svg { min-width: 24px; min-height: 24px; } +.tesla-mode button { min-height: 48px; min-width: 48px; } +.tesla-mode input[type="text"], .tesla-mode input[type="search"] { min-height: 56px; font-size: 1.15rem; padding: 14px 18px; } +.tesla-mode nav a, .tesla-mode nav button, .tesla-mode [role="tab"] { min-height: 56px; padding: 12px 20px !important; font-size: 1.15rem; } + +/* Buttons */ +.btn-primary { + @apply px-3.5 py-1.5 bg-blue-600 hover:bg-blue-500 text-white font-medium rounded-lg transition-colors; +} +.btn-secondary { + padding: 6px 14px; + background: var(--bg-tertiary); + border: 1px solid var(--border); + color: var(--text-secondary); + border-radius: 8px; + transition: all 0.15s; +} +.btn-secondary:hover { + background: var(--bg-hover); + border-color: var(--text-faint); +} + +/* Sidebar */ +.sidebar { + background: var(--bg-secondary); + border-color: var(--border); +} +.sidebar-header { + border-color: var(--border); +} +.sidebar-footer { + border-color: var(--border); + color: var(--text-faint); +} +.sidebar-section-title { + color: var(--text-faint); +} +.sidebar-item { + color: var(--text-muted); + transition: all 0.15s; +} +.sidebar-item:hover { + background: var(--bg-hover); + color: var(--text-secondary); +} +.sidebar-item-active { + background: var(--bg-active); + color: var(--link); +} +.search-trigger { + background: var(--bg-hover); + border: 1px solid var(--border-light); + color: var(--text-faint); +} +.search-trigger:hover { + color: var(--text-muted); + border-color: var(--text-faint); +} + +/* Markdown — optimized for readability */ +.markdown-body { + color: var(--text-secondary); + line-height: 1.85; + letter-spacing: 0.01em; + font-size: 15px; +} +.markdown-body h1 { + @apply text-2xl font-bold pb-3 mb-5 mt-10 first:mt-0; + color: var(--md-h1, var(--text-primary)); + border-bottom: 2px solid var(--md-h1-border, var(--border)); + line-height: 1.3; +} +.markdown-body h2 { + @apply text-xl font-semibold pb-2 mb-4 mt-8; + color: var(--md-h2, var(--text-primary)); + border-bottom: 1px solid var(--md-h2-border, var(--border-light)); + line-height: 1.35; +} +.markdown-body h3 { + @apply text-lg font-semibold mb-3 mt-6; + color: var(--md-h3, var(--text-primary)); + line-height: 1.4; +} +.markdown-body h4 { + @apply text-base font-semibold mb-2 mt-5; + color: var(--text-secondary); + line-height: 1.4; +} +.markdown-body p { + @apply mb-4; + line-height: 1.85; +} +.markdown-body ul { @apply list-disc pl-6 mb-4 space-y-1.5; } +.markdown-body ol { @apply list-decimal pl-6 mb-4 space-y-1.5; } +.markdown-body li { + color: var(--text-secondary); + line-height: 1.75; +} +.markdown-body li > ul, +.markdown-body li > ol { + @apply mt-1.5 mb-0; +} +.markdown-body code { + background: var(--code-bg); + color: var(--code-text); + @apply px-1.5 py-0.5 rounded text-[0.85em] font-mono; + font-weight: 500; +} +.markdown-body pre { + background: var(--pre-bg); + border: 1px solid var(--pre-border); + font-family: var(--font-mono); + @apply rounded-xl p-4 mb-5 overflow-x-auto text-sm; +} +.markdown-body pre code { background: transparent; padding: 0; color: var(--pre-text); font-weight: normal; font-family: inherit; } +.markdown-body pre code span { background: transparent !important; } +.markdown-body code[class*="language-"] { background: transparent !important; } +.markdown-body blockquote { + border-left: 4px solid var(--blockquote-border); + padding: 0.75rem 1rem; + color: var(--blockquote-text); + background: var(--blockquote-bg, var(--bg-hover)); + border-radius: 0 0.5rem 0.5rem 0; + @apply italic my-5; +} +.markdown-body blockquote p:last-child { @apply mb-0; } +.markdown-body a { + color: var(--link); + text-decoration: underline; + text-decoration-color: rgba(59,130,246,0.3); + text-underline-offset: 3px; + transition: all 0.15s; +} +.markdown-body a:hover { color: var(--link-hover); text-decoration-color: rgba(59,130,246,0.6); } +.markdown-body table { @apply w-full border-collapse mb-5 text-sm; } +.markdown-body th { + background: var(--th-bg); + border: 1px solid var(--border); + @apply px-4 py-2.5 text-left font-semibold; + color: var(--text-secondary); +} +.markdown-body td { + border: 1px solid var(--border); + @apply px-4 py-2.5; + color: var(--text-secondary); + line-height: 1.65; +} +.markdown-body tr:hover td { background: var(--tr-hover); } +.markdown-body hr { border-color: var(--md-hr, var(--border)); @apply my-8; } +.markdown-body strong { color: var(--md-strong, var(--text-primary)); @apply font-semibold; } +.markdown-body em { color: var(--md-em, var(--text-muted)); } +.markdown-body img { @apply rounded-lg max-w-full my-2; } +/* Checkbox lists */ +.markdown-body input[type="checkbox"] { + @apply mr-2 rounded; + accent-color: #3b82f6; +} + +/* Editor */ +.editor-textarea { + background: var(--editor-bg); + color: var(--text-primary); + border: 1px solid var(--border); + @apply w-full h-full font-mono text-sm p-4 rounded-lg resize-none; + tab-size: 2; +} +.editor-textarea:focus { + outline: none; + box-shadow: 0 0 0 2px var(--ring); + border-color: var(--ring); +} + +/* Toast */ +.toast { + position: fixed; + bottom: 1.5rem; + right: 1.5rem; + background: var(--toast-bg); + color: var(--toast-text); + @apply px-4 py-2.5 rounded-xl shadow-2xl z-50 text-sm; + border: 1px solid var(--border); + animation: toast-in 0.3s ease-out; +} +@keyframes toast-in { + from { transform: translateY(16px); opacity: 0; } + to { transform: translateY(0); opacity: 1; } +} + +/* Sensitive content blur (Telegram-style) */ +.sensitive-blur { + filter: blur(6px); + -webkit-filter: blur(6px); + user-select: none; + transition: filter 0.3s ease; + cursor: default; + border-radius: 4px; + padding: 0 2px; +} +.sensitive-blur:hover { + filter: blur(4px); +} +.sensitive-revealed .sensitive-blur { + filter: none !important; + -webkit-filter: none !important; + user-select: auto; + cursor: text; +} + +/* Scroll to top button */ +.scroll-top-btn { + position: fixed; + bottom: 1.5rem; + right: 1.5rem; + width: 40px; + height: 40px; + border-radius: 50%; + background: var(--bg-tertiary); + border: 1px solid var(--border); + color: var(--text-muted); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + z-index: 40; + transition: all 0.2s; + box-shadow: 0 2px 8px rgba(0,0,0,0.15); + animation: toast-in 0.2s ease-out; +} +.scroll-top-btn:hover { + background: var(--bg-active); + color: var(--link); +} + +/* Code block copy button */ +.markdown-body pre { + position: relative; +} +.code-copy-btn { + position: absolute; + top: 8px; + right: 8px; + padding: 4px 6px; + border-radius: 6px; + background: var(--bg-tertiary); + border: 1px solid var(--border); + color: var(--text-muted); + cursor: pointer; + opacity: 0; + transition: opacity 0.15s, background 0.15s; + z-index: 5; + display: flex; + align-items: center; +} +.markdown-body pre:hover .code-copy-btn { + opacity: 1; +} +.code-copy-btn:hover { + background: var(--bg-active); + color: var(--link); +} + +/* Shiki code blocks */ +.shiki-wrapper pre { + margin: 0; + border-radius: 0.75rem; + font-size: 0.85rem; + line-height: 1.7; + border: 1px solid var(--pre-border); + padding: 1rem; + overflow-x: auto; + white-space: pre; + font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; +} +.shiki-wrapper pre code { + font-family: inherit; + background: transparent; + tab-size: 2; + counter-reset: line; +} +.shiki-wrapper pre code .line { + display: inline-block; + width: 100%; +} +.shiki-wrapper pre code .line::before { + counter-increment: line; + content: counter(line); + display: inline-block; + width: 2.5em; + margin-right: 1em; + text-align: right; + color: var(--text-faint); + opacity: 0.5; + font-size: 0.8rem; + user-select: none; + -webkit-user-select: none; +} + +/* Shiki dual theme support */ +html.dark .shiki, +html.dark .shiki span { + color: var(--shiki-dark) !important; + background-color: transparent !important; +} +html:not(.dark) .shiki, +html:not(.dark) .shiki span { + color: var(--shiki-light) !important; + background-color: transparent !important; +} + +/* Scrollbar */ +::-webkit-scrollbar { width: 6px; height: 6px; } +::-webkit-scrollbar-track { background: transparent; } +::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border-radius: 9999px; } +::-webkit-scrollbar-thumb:hover { background: var(--scrollbar-hover); } + +/* Superscript and subscript - use monospace for alignment */ +.markdown-body sup, +.markdown-body sub { + font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; + font-size: 0.65em; + vertical-align: super; + line-height: 0; +} +.markdown-body sub { + vertical-align: sub; +} diff --git a/memory-viewer/src/main.tsx b/memory-viewer/src/main.tsx new file mode 100644 index 0000000..c2d5180 --- /dev/null +++ b/memory-viewer/src/main.tsx @@ -0,0 +1,18 @@ +import React, { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./index.css"; +import "./themes"; +import App from "./App"; +import { pluginRegistry } from "./plugins/registry"; + +// Expose React for external plugins +(window as any).__MV_REACT__ = React; + +// Load external plugins (non-blocking) +pluginRegistry.loadExternal(); + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/memory-viewer/src/plugins/PluginSlot.tsx b/memory-viewer/src/plugins/PluginSlot.tsx new file mode 100644 index 0000000..aaf3f3c --- /dev/null +++ b/memory-viewer/src/plugins/PluginSlot.tsx @@ -0,0 +1,25 @@ +import { useSyncExternalStore, RefObject } from "react"; +import { pluginRegistry } from "./registry"; +import { PluginSlotName } from "./types"; + +interface PluginSlotProps { + name: PluginSlotName; + filePath: string; + content: string; + renderedRef: RefObject; +} + +export function PluginSlot({ name, filePath, content, renderedRef }: PluginSlotProps) { + const version = useSyncExternalStore(pluginRegistry.subscribe, pluginRegistry.getSnapshot); + const components = pluginRegistry.getPluginsForSlot(name, filePath); + + if (components.length === 0) return null; + + return ( + <> + {components.map((Component, i) => ( + + ))} + + ); +} diff --git a/memory-viewer/src/plugins/registry.ts b/memory-viewer/src/plugins/registry.ts new file mode 100644 index 0000000..f257ed2 --- /dev/null +++ b/memory-viewer/src/plugins/registry.ts @@ -0,0 +1,116 @@ +import { ComponentType } from "react"; +import { MemoryViewerPlugin, PluginSlotName, SlotProps } from "./types"; +import { getBaseUrl } from "../api"; + +const DISABLED_KEY = "mv-plugins-disabled"; + +class PluginRegistry { + private plugins: Map = new Map(); + private disabled: Set; + private listeners: Set<() => void> = new Set(); + private version = 0; + + constructor() { + try { + const raw = localStorage.getItem(DISABLED_KEY); + this.disabled = new Set(raw ? JSON.parse(raw) : []); + } catch { + this.disabled = new Set(); + } + } + + private notify() { + this.version++; + this.listeners.forEach((fn) => fn()); + } + + private persistDisabled() { + localStorage.setItem(DISABLED_KEY, JSON.stringify([...this.disabled])); + } + + register(plugin: MemoryViewerPlugin) { + this.plugins.set(plugin.id, plugin); + if (!this.disabled.has(plugin.id)) { + plugin.onActivate?.(); + } + this.notify(); + } + + unregister(id: string) { + const plugin = this.plugins.get(id); + if (plugin) { + plugin.onDeactivate?.(); + this.plugins.delete(id); + this.notify(); + } + } + + enable(id: string) { + this.disabled.delete(id); + this.persistDisabled(); + this.plugins.get(id)?.onActivate?.(); + this.notify(); + } + + disable(id: string) { + this.disabled.add(id); + this.persistDisabled(); + this.plugins.get(id)?.onDeactivate?.(); + this.notify(); + } + + isEnabled(id: string): boolean { + return !this.disabled.has(id); + } + + getAll(): MemoryViewerPlugin[] { + return [...this.plugins.values()]; + } + + getPluginsForSlot(slotName: PluginSlotName, filePath: string): ComponentType[] { + const result: ComponentType[] = []; + for (const plugin of this.plugins.values()) { + if (this.disabled.has(plugin.id)) continue; + const component = plugin.slots?.[slotName]; + if (!component) continue; + if (plugin.fileFilter && !plugin.fileFilter(filePath)) continue; + result.push(component); + } + return result; + } + + /** Load external plugins from server */ + async loadExternal() { + try { + const res = await fetch(`${getBaseUrl()}/api/plugins`); + const list: { id: string; name: string; entry: string }[] = await res.json(); + for (const info of list) { + if (this.plugins.has(info.id)) continue; + try { + const url = `${getBaseUrl()}/api/plugins/${info.id}/${info.entry}`; + const mod = await import(/* @vite-ignore */ url); + const plugin: MemoryViewerPlugin = mod.default || mod.plugin; + if (plugin?.id) { + this.register(plugin); + } + } catch (e) { + console.warn(`Failed to load external plugin "${info.id}":`, e); + } + } + } catch { + // No external plugins available + } + } + + // useSyncExternalStore compatible + subscribe = (listener: () => void): (() => void) => { + this.listeners.add(listener); + return () => this.listeners.delete(listener); + }; + + getSnapshot = (): number => { + return this.version; + }; +} + +export const pluginRegistry = new PluginRegistry(); diff --git a/memory-viewer/src/plugins/types.ts b/memory-viewer/src/plugins/types.ts new file mode 100644 index 0000000..1d78a3f --- /dev/null +++ b/memory-viewer/src/plugins/types.ts @@ -0,0 +1,20 @@ +import { RefObject, ComponentType } from "react"; + +export interface SlotProps { + filePath: string; + content: string; + renderedRef: RefObject; +} + +export type PluginSlotName = 'fileviewer-toolbar' | 'fileviewer-footer' | 'sidebar-bottom'; + +export interface MemoryViewerPlugin { + id: string; + name: string; + version: string; + description?: string; + onActivate?: () => void; + onDeactivate?: () => void; + slots?: Partial>>; + fileFilter?: (filePath: string) => boolean; +} diff --git a/memory-viewer/src/test/setup.ts b/memory-viewer/src/test/setup.ts new file mode 100644 index 0000000..a0c9d16 --- /dev/null +++ b/memory-viewer/src/test/setup.ts @@ -0,0 +1,8 @@ +import '@testing-library/jest-dom'; +import { cleanup } from '@testing-library/react'; +import { afterEach } from 'vitest'; + +// Runs a cleanup after each test case (e.g. clearing jsdom) +afterEach(() => { + cleanup(); +}); diff --git a/memory-viewer/src/themes/apply.ts b/memory-viewer/src/themes/apply.ts new file mode 100644 index 0000000..a6040ed --- /dev/null +++ b/memory-viewer/src/themes/apply.ts @@ -0,0 +1,84 @@ +import type { MarkdownTheme, ThemeStyles } from "./types"; + +const SELECTOR_MAP: Record = { + h1: "h1", + h2: "h2", + h3: "h3", + h4: "h4", + p: "p", + a: "a", + strong: "strong", + em: "em", + blockquote: "blockquote", + code: "code", + pre: "pre", + precode: "pre code", + ul: "ul", + ol: "ol", + li: "li", + table: "table", + th: "th", + td: "td", + hr: "hr", + img: "img", +}; + +function applyInlineStyle(el: HTMLElement, styleStr: string) { + el.setAttribute("style", styleStr); +} + +export function applyThemeStyles(article: HTMLElement, theme: MarkdownTheme) { + const isDark = document.documentElement.classList.contains("dark"); + const styles: ThemeStyles | undefined = (isDark && theme.darkStyles) ? theme.darkStyles : theme.styles; + if (!styles) return; + + // Apply body style to article + if (styles.body) { + article.setAttribute("style", styles.body); + } + + // Apply styles per selector + for (const [key, selector] of Object.entries(SELECTOR_MAP)) { + const styleStr = styles[key as keyof typeof styles]; + if (!styleStr || key === "precode") continue; + + // Skip shiki-generated elements: don't touch pre/code inside .shiki-wrapper + const elements = article.querySelectorAll(selector); + for (const el of elements) { + if (key === "code" && el.closest(".shiki-wrapper")) continue; + if (key === "pre" && el.closest(".shiki-wrapper")) continue; + applyInlineStyle(el as HTMLElement, styleStr); + } + } + + // Special: precode + if (styles.precode) { + const precodes = article.querySelectorAll("pre code"); + for (const el of precodes) { + if (el.closest(".shiki-wrapper")) continue; + applyInlineStyle(el as HTMLElement, styles.precode); + } + } + + // Special: hrContent - replace hr with styled text + if (styles.hrContent) { + const hrs = article.querySelectorAll("hr"); + for (const hr of hrs) { + const p = document.createElement("p"); + p.textContent = styles.hrContent; + if (styles.hr) applyInlineStyle(p, styles.hr); + hr.replaceWith(p); + } + } +} + +export function cleanInlineStyles(article: Element | null) { + if (!article) return; + (article as HTMLElement).removeAttribute("style"); + const all = article.querySelectorAll("*"); + for (const el of all) { + // Don't remove styles from shiki-generated spans + if (el.closest(".shiki-wrapper")) continue; + (el as HTMLElement).removeAttribute("style"); + } +} diff --git a/memory-viewer/src/themes/builtin/default.ts b/memory-viewer/src/themes/builtin/default.ts new file mode 100644 index 0000000..fa817a7 --- /dev/null +++ b/memory-viewer/src/themes/builtin/default.ts @@ -0,0 +1,6 @@ +import type { MarkdownTheme } from "../types"; + +export const defaultTheme: MarkdownTheme = { + id: "default", + name: "Default", +}; diff --git a/memory-viewer/src/themes/builtin/medium.ts b/memory-viewer/src/themes/builtin/medium.ts new file mode 100644 index 0000000..9b8ac83 --- /dev/null +++ b/memory-viewer/src/themes/builtin/medium.ts @@ -0,0 +1,52 @@ +import type { MarkdownTheme } from "../types"; + +export const mediumTheme: MarkdownTheme = { + id: "medium", + name: "Medium", + styles: { + body: 'font-family:Charter,"Bitstream Charter","Nimbus Roman No9 L",Georgia,"Times New Roman",serif;font-size:15px;line-height:1.75;color:rgba(36,36,36,1);letter-spacing:-0.003em;word-break:break-word;', + h1: 'font-size:24px;font-weight:700;color:rgba(36,36,36,1);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;line-height:1.22;margin:1.8em 0 0.4em;letter-spacing:-0.016em;', + h2: 'font-size:20px;font-weight:700;color:rgba(36,36,36,1);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;line-height:1.28;margin:1.6em 0 0.3em;letter-spacing:-0.012em;', + h3: 'font-size:17px;font-weight:700;color:rgba(36,36,36,1);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;line-height:1.36;margin:1.4em 0 0.2em;', + h4: 'font-size:15px;font-weight:700;color:rgba(36,36,36,1);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;margin:1.2em 0 0.15em;', + p: 'margin:0.8em 0;line-height:1.75;font-size:15px;', + a: 'color:inherit;text-decoration:underline;text-decoration-color:rgba(36,36,36,0.4);text-underline-offset:2px;', + strong: 'font-weight:700;', + em: 'font-style:italic;', + blockquote: 'border-left:3px solid rgba(36,36,36,1);padding:0 0 0 18px;margin:1.2em 0;color:rgba(36,36,36,0.8);font-style:italic;font-size:16px;line-height:1.75;', + code: 'background:rgba(0,0,0,0.05);padding:2px 5px;border-radius:3px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:13px;color:rgba(36,36,36,0.9);', + pre: 'background:#f2f2f2;padding:16px 20px;border-radius:4px;overflow-x:auto;margin:1.2em 0;', + precode: 'font-family:Menlo,Monaco,"Courier New",monospace;font-size:13px;line-height:1.7;color:rgba(36,36,36,0.9);background:none;padding:0;', + ul: 'padding-left:26px;margin:0.8em 0;list-style-type:disc;', + ol: 'padding-left:26px;margin:0.8em 0;', + li: 'margin:0.3em 0;line-height:1.75;font-size:15px;', + table: 'border-collapse:collapse;width:100%;margin:1.5em 0;font-size:14px;', + th: 'border:1px solid #d0d7de;padding:6px 13px;font-weight:600;text-align:left;background:#f6f8fa;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;', + td: 'border:1px solid #d0d7de;padding:6px 13px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;', + hr: 'border:none;text-align:center;margin:2.5em auto;width:100%;height:1px;background:rgba(36,36,36,0.15);', + img: 'max-width:100%;height:auto;', + }, + darkStyles: { + body: 'font-family:Charter,"Bitstream Charter","Nimbus Roman No9 L",Georgia,"Times New Roman",serif;font-size:15px;line-height:1.75;color:rgba(232,230,227,1);letter-spacing:-0.003em;word-break:break-word;', + h1: 'font-size:24px;font-weight:700;color:rgba(232,230,227,1);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;line-height:1.22;margin:1.8em 0 0.4em;letter-spacing:-0.016em;', + h2: 'font-size:20px;font-weight:700;color:rgba(232,230,227,1);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;line-height:1.28;margin:1.6em 0 0.3em;letter-spacing:-0.012em;', + h3: 'font-size:17px;font-weight:700;color:rgba(232,230,227,1);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;line-height:1.36;margin:1.4em 0 0.2em;', + h4: 'font-size:15px;font-weight:700;color:rgba(232,230,227,1);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;margin:1.2em 0 0.15em;', + p: 'margin:0.8em 0;line-height:1.75;font-size:15px;color:rgba(232,230,227,0.9);', + a: 'color:rgba(232,230,227,0.9);text-decoration:underline;text-decoration-color:rgba(232,230,227,0.4);text-underline-offset:2px;', + strong: 'font-weight:700;color:rgba(232,230,227,1);', + em: 'font-style:italic;color:rgba(232,230,227,0.8);', + blockquote: 'border-left:3px solid rgba(232,230,227,0.6);padding:0 0 0 18px;margin:1.2em 0;color:rgba(232,230,227,0.7);font-style:italic;font-size:16px;line-height:1.75;', + code: 'background:rgba(255,255,255,0.08);padding:2px 5px;border-radius:3px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:13px;color:rgba(232,230,227,0.9);', + pre: 'background:rgba(255,255,255,0.05);padding:16px 20px;border-radius:4px;overflow-x:auto;margin:1.2em 0;', + precode: 'font-family:Menlo,Monaco,"Courier New",monospace;font-size:13px;line-height:1.7;color:rgba(232,230,227,0.9);background:none;padding:0;', + ul: 'padding-left:26px;margin:0.8em 0;list-style-type:disc;color:rgba(232,230,227,0.9);', + ol: 'padding-left:26px;margin:0.8em 0;color:rgba(232,230,227,0.9);', + li: 'margin:0.3em 0;line-height:1.75;font-size:15px;color:rgba(232,230,227,0.9);', + table: 'border-collapse:collapse;width:100%;margin:1.5em 0;font-size:14px;', + th: 'border:1px solid #3a3d52;padding:6px 13px;font-weight:600;text-align:left;background:rgba(255,255,255,0.05);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;color:rgba(232,230,227,1);', + td: 'border:1px solid #3a3d52;padding:6px 13px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;color:rgba(232,230,227,0.9);', + hr: 'border:none;text-align:center;margin:2.5em auto;width:100%;height:1px;background:rgba(232,230,227,0.15);', + img: 'max-width:100%;height:auto;', + }, +}; diff --git a/memory-viewer/src/themes/index.ts b/memory-viewer/src/themes/index.ts new file mode 100644 index 0000000..39a1f74 --- /dev/null +++ b/memory-viewer/src/themes/index.ts @@ -0,0 +1,9 @@ +import { themeRegistry, useMarkdownTheme } from "./registry"; +import { defaultTheme } from "./builtin/default"; +import { mediumTheme } from "./builtin/medium"; + +themeRegistry.register(defaultTheme); +themeRegistry.register(mediumTheme); + +export { themeRegistry, useMarkdownTheme }; +export type { MarkdownTheme } from "./types"; diff --git a/memory-viewer/src/themes/registry.ts b/memory-viewer/src/themes/registry.ts new file mode 100644 index 0000000..66f8a35 --- /dev/null +++ b/memory-viewer/src/themes/registry.ts @@ -0,0 +1,67 @@ +import { useSyncExternalStore, useCallback } from "react"; +import type { MarkdownTheme } from "./types"; + +const STORAGE_KEY = "mv-md-theme"; + +class ThemeRegistry { + private themes = new Map(); + private listeners = new Set<() => void>(); + private currentId: string; + private snapshot = { version: 0 }; + + constructor() { + this.currentId = localStorage.getItem(STORAGE_KEY) || "medium"; + } + + register(theme: MarkdownTheme) { + this.themes.set(theme.id, theme); + this.notify(); + } + + get(id: string): MarkdownTheme | undefined { + return this.themes.get(id); + } + + list(): MarkdownTheme[] { + return Array.from(this.themes.values()); + } + + getCurrent(): MarkdownTheme { + return this.themes.get(this.currentId) || this.themes.get("default") || { id: "default", name: "Default" }; + } + + setCurrent(id: string) { + if (this.currentId === id) return; + this.currentId = id; + localStorage.setItem(STORAGE_KEY, id); + this.notify(); + } + + private notify() { + this.snapshot = { version: this.snapshot.version + 1 }; + this.listeners.forEach((l) => l()); + } + + subscribe = (listener: () => void) => { + this.listeners.add(listener); + return () => { this.listeners.delete(listener); }; + }; + + getSnapshot = () => this.snapshot; +} + +export const themeRegistry = new ThemeRegistry(); + +export function useMarkdownTheme() { + useSyncExternalStore(themeRegistry.subscribe, themeRegistry.getSnapshot); + + const setTheme = useCallback((id: string) => { + themeRegistry.setCurrent(id); + }, []); + + return { + current: themeRegistry.getCurrent(), + setTheme, + themes: themeRegistry.list(), + }; +} diff --git a/memory-viewer/src/themes/types.ts b/memory-viewer/src/themes/types.ts new file mode 100644 index 0000000..7b554ad --- /dev/null +++ b/memory-viewer/src/themes/types.ts @@ -0,0 +1,33 @@ +export interface ThemeStyles { + body?: string; + h1?: string; + h2?: string; + h3?: string; + h4?: string; + p?: string; + a?: string; + strong?: string; + em?: string; + blockquote?: string; + code?: string; + pre?: string; + precode?: string; + ul?: string; + ol?: string; + li?: string; + table?: string; + th?: string; + td?: string; + hr?: string; + hrContent?: string; + img?: string; +} + +export interface MarkdownTheme { + id: string; + name: string; + /** Light mode styles (also used as default/only styles) */ + styles?: ThemeStyles; + /** Dark mode styles — if absent, falls back to styles */ + darkStyles?: ThemeStyles; +} diff --git a/memory-viewer/take-screenshots.mjs b/memory-viewer/take-screenshots.mjs new file mode 100644 index 0000000..eae4cc8 --- /dev/null +++ b/memory-viewer/take-screenshots.mjs @@ -0,0 +1,77 @@ +import { chromium } from 'playwright'; +import { join } from 'path'; + +const BASE = 'http://localhost:8901'; +const DOCS = join(import.meta.dirname, 'docs'); +const VP = { width: 1280, height: 800 }; + +async function screenshot(page, name) { + await page.waitForTimeout(500); + await page.screenshot({ path: join(DOCS, name), fullPage: false }); + console.log(`✅ ${name}`); +} + +const browser = await chromium.launch(); + +// --- DARK THEME --- +let ctx = await browser.newContext({ viewport: VP, colorScheme: 'dark' }); +let page = await ctx.newPage(); + +// Dashboard (dark) +await page.goto(BASE); +await page.waitForLoadState('networkidle'); +await screenshot(page, 'screenshot-dashboard-dark.png'); + +// Viewer - open MEMORY.md (dark) +// Click on MEMORY.md in file tree +await page.click('text=MEMORY.md'); +await page.waitForTimeout(800); +await screenshot(page, 'screenshot-viewer-dark.png'); + +// Editor mode (dark) - click edit button +const editBtn = page.locator('button:has-text("Edit"), button[title*="edit"], button[title*="Edit"], [aria-label*="edit"], [aria-label*="Edit"]').first(); +if (await editBtn.count() > 0) { + await editBtn.click(); + await page.waitForTimeout(500); + await screenshot(page, 'screenshot-editor-dark.png'); +} + +// Search panel (dark) - Ctrl+K +await page.keyboard.press('Control+k'); +await page.waitForTimeout(500); +// Type something to show results +await page.keyboard.type('memory'); +await page.waitForTimeout(800); +await screenshot(page, 'screenshot-search-dark.png'); +await page.keyboard.press('Escape'); + +await ctx.close(); + +// --- LIGHT THEME --- +ctx = await browser.newContext({ viewport: VP, colorScheme: 'light' }); +page = await ctx.newPage(); + +// Set light theme via localStorage before navigating +await page.addInitScript(() => { + localStorage.setItem('theme', 'light'); +}); +await page.goto(BASE); +await page.waitForLoadState('networkidle'); +// Also try setting it after load +await page.evaluate(() => { + localStorage.setItem('theme', 'light'); + document.documentElement.classList.remove('dark'); + document.documentElement.classList.add('light'); +}); +await page.reload(); +await page.waitForLoadState('networkidle'); +await screenshot(page, 'screenshot-dashboard-light.png'); + +// Viewer light +await page.click('text=MEMORY.md'); +await page.waitForTimeout(800); +await screenshot(page, 'screenshot-viewer-light.png'); + +await ctx.close(); +await browser.close(); +console.log('🎉 All screenshots done!'); diff --git a/memory-viewer/tsconfig.app.json b/memory-viewer/tsconfig.app.json new file mode 100644 index 0000000..a9b5a59 --- /dev/null +++ b/memory-viewer/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/memory-viewer/tsconfig.json b/memory-viewer/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/memory-viewer/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/memory-viewer/tsconfig.node.json b/memory-viewer/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/memory-viewer/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/memory-viewer/tsconfig.server.json b/memory-viewer/tsconfig.server.json new file mode 100644 index 0000000..e38ee44 --- /dev/null +++ b/memory-viewer/tsconfig.server.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2023", + "lib": ["ES2023"], + "module": "NodeNext", + "moduleResolution": "NodeNext", + "esModuleInterop": true, + "skipLibCheck": true, + "strict": true, + "noEmitOnError": false, + "outDir": "./server-dist", + "rootDir": "./server", + "declaration": false, + "sourceMap": false, + "resolveJsonModule": true + }, + "include": ["server/**/*"], + "exclude": ["node_modules", "dist", "server-dist"] +} diff --git a/memory-viewer/vite.config.ts b/memory-viewer/vite.config.ts new file mode 100644 index 0000000..db021c0 --- /dev/null +++ b/memory-viewer/vite.config.ts @@ -0,0 +1,37 @@ +/// +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import tailwindcss from '@tailwindcss/vite'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], + test: { + globals: true, + environment: 'jsdom', + setupFiles: './src/test/setup.ts', + css: false, + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + exclude: [ + 'node_modules/**', + 'dist/**', + '**/*.d.ts', + '**/*.config.*', + ], + }, + }, + server: { + proxy: { + '/api': { + target: 'http://localhost:3001', + changeOrigin: true, + }, + '/ws': { + target: 'ws://localhost:3001', + ws: true, + }, + } + } +});