From 5f4c1a16acd272338ce620bc034acba2d81ed665 Mon Sep 17 00:00:00 2001 From: Guy Tonye Date: Thu, 11 Jun 2026 01:47:25 -0400 Subject: [PATCH] feat: add Maine DOC Insight desktop analytics tool Initial implementation of a Tauri + React dashboard for Maine DOC education program data, including six data views, an AI chat panel with multi-provider support, and automated data quality assessment. Co-Authored-By: Claude Sonnet 4.6 --- .gitignore | 5 + README.md | 215 +- eslint.config.js | 36 + index.html | 12 + package-lock.json | 5280 ++++++++++++++++++++++++ package.json | 35 + src-tauri/Cargo.lock | 4228 +++++++++++++++++++ src-tauri/Cargo.toml | 21 + src-tauri/build.rs | 3 + src-tauri/icons/128x128.png | Bin 0 -> 9465 bytes src-tauri/icons/128x128@2x.png | Bin 0 -> 18302 bytes src-tauri/icons/32x32.png | Bin 0 -> 1955 bytes src-tauri/icons/Square107x107Logo.png | Bin 0 -> 7943 bytes src-tauri/icons/Square142x142Logo.png | Bin 0 -> 10585 bytes src-tauri/icons/Square150x150Logo.png | Bin 0 -> 11099 bytes src-tauri/icons/Square284x284Logo.png | Bin 0 -> 21309 bytes src-tauri/icons/Square30x30Logo.png | Bin 0 -> 1844 bytes src-tauri/icons/Square310x310Logo.png | Bin 0 -> 23013 bytes src-tauri/icons/Square44x44Logo.png | Bin 0 -> 2918 bytes src-tauri/icons/Square71x71Logo.png | Bin 0 -> 5330 bytes src-tauri/icons/Square89x89Logo.png | Bin 0 -> 6666 bytes src-tauri/icons/StoreLogo.png | Bin 0 -> 3507 bytes src-tauri/icons/app-icon.png | Bin 0 -> 11600 bytes src-tauri/icons/icon.icns | Bin 0 -> 135932 bytes src-tauri/icons/icon.ico | Bin 0 -> 32896 bytes src-tauri/icons/icon.png | Bin 0 -> 32585 bytes src-tauri/src/main.rs | 8 + src-tauri/tauri.conf.json | 47 + src/App.tsx | 282 ++ src/app.css | 410 ++ src/chat/actionItems.ts | 117 + src/chat/aggregator.ts | 153 + src/chat/contextPacket.ts | 81 + src/chat/fetchWithRetry.ts | 27 + src/chat/flatTables.ts | 89 + src/chat/prompts.ts | 360 ++ src/chat/providers.ts | 47 + src/chat/refusal.ts | 29 + src/chat/router.ts | 280 ++ src/chat/writer.ts | 209 + src/components/ChartFootnote.tsx | 31 + src/components/DataQualityBanner.tsx | 53 + src/components/DataUnavailableCard.tsx | 59 + src/components/FileLoader.tsx | 632 +++ src/components/OmsCards.tsx | 620 +++ src/components/SmartActionItem.tsx | 73 + src/components/chat/ChatDrawer.tsx | 578 +++ src/config/analytics.json | 41 + src/config/chat.json | 5 + src/config/data_quality.json | 30 + src/config/facilities.json | 12 + src/config/llm.json | 30 + src/config/models.json | 22 + src/config/thresholds.json | 60 + src/contexts/DataQualityContext.tsx | 11 + src/data/demoResponses.ts | 219 + src/data/mockData.ts | 697 ++++ src/data/schemaRegistry.ts | 309 ++ src/lib/analytics.ts | 1881 +++++++++ src/lib/dataQuality.ts | 342 ++ src/lib/demoExport.ts | 187 + src/lib/ingest.ts | 754 ++++ src/main.tsx | 9 + src/types.ts | 945 +++++ src/views/ComparisonView.tsx | 300 ++ src/views/Dashboard.tsx | 442 ++ src/views/DataQualityView.tsx | 799 ++++ src/views/FacilitiesView.tsx | 320 ++ src/views/HomeView.tsx | 1244 ++++++ src/views/InsightsView.tsx | 1385 +++++++ src/views/ProgramsView.tsx | 548 +++ src/views/ResidentsView.tsx | 534 +++ tsconfig.json | 21 + tsconfig.node.json | 10 + vite.config.ts | 19 + 75 files changed, 25195 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src-tauri/Cargo.lock create mode 100644 src-tauri/Cargo.toml create mode 100644 src-tauri/build.rs create mode 100644 src-tauri/icons/128x128.png create mode 100644 src-tauri/icons/128x128@2x.png create mode 100644 src-tauri/icons/32x32.png create mode 100644 src-tauri/icons/Square107x107Logo.png create mode 100644 src-tauri/icons/Square142x142Logo.png create mode 100644 src-tauri/icons/Square150x150Logo.png create mode 100644 src-tauri/icons/Square284x284Logo.png create mode 100644 src-tauri/icons/Square30x30Logo.png create mode 100644 src-tauri/icons/Square310x310Logo.png create mode 100644 src-tauri/icons/Square44x44Logo.png create mode 100644 src-tauri/icons/Square71x71Logo.png create mode 100644 src-tauri/icons/Square89x89Logo.png create mode 100644 src-tauri/icons/StoreLogo.png create mode 100644 src-tauri/icons/app-icon.png create mode 100644 src-tauri/icons/icon.icns create mode 100644 src-tauri/icons/icon.ico create mode 100644 src-tauri/icons/icon.png create mode 100644 src-tauri/src/main.rs create mode 100644 src-tauri/tauri.conf.json create mode 100644 src/App.tsx create mode 100644 src/app.css create mode 100644 src/chat/actionItems.ts create mode 100644 src/chat/aggregator.ts create mode 100644 src/chat/contextPacket.ts create mode 100644 src/chat/fetchWithRetry.ts create mode 100644 src/chat/flatTables.ts create mode 100644 src/chat/prompts.ts create mode 100644 src/chat/providers.ts create mode 100644 src/chat/refusal.ts create mode 100644 src/chat/router.ts create mode 100644 src/chat/writer.ts create mode 100644 src/components/ChartFootnote.tsx create mode 100644 src/components/DataQualityBanner.tsx create mode 100644 src/components/DataUnavailableCard.tsx create mode 100644 src/components/FileLoader.tsx create mode 100644 src/components/OmsCards.tsx create mode 100644 src/components/SmartActionItem.tsx create mode 100644 src/components/chat/ChatDrawer.tsx create mode 100644 src/config/analytics.json create mode 100644 src/config/chat.json create mode 100644 src/config/data_quality.json create mode 100644 src/config/facilities.json create mode 100644 src/config/llm.json create mode 100644 src/config/models.json create mode 100644 src/config/thresholds.json create mode 100644 src/contexts/DataQualityContext.tsx create mode 100644 src/data/demoResponses.ts create mode 100644 src/data/mockData.ts create mode 100644 src/data/schemaRegistry.ts create mode 100644 src/lib/analytics.ts create mode 100644 src/lib/dataQuality.ts create mode 100644 src/lib/demoExport.ts create mode 100644 src/lib/ingest.ts create mode 100644 src/main.tsx create mode 100644 src/types.ts create mode 100644 src/views/ComparisonView.tsx create mode 100644 src/views/Dashboard.tsx create mode 100644 src/views/DataQualityView.tsx create mode 100644 src/views/FacilitiesView.tsx create mode 100644 src/views/HomeView.tsx create mode 100644 src/views/InsightsView.tsx create mode 100644 src/views/ProgramsView.tsx create mode 100644 src/views/ResidentsView.tsx create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b6ab90 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +src-tauri/target/ +.DS_Store +*.local diff --git a/README.md b/README.md index 224b3bf..6a3cc10 100644 --- a/README.md +++ b/README.md @@ -1 +1,214 @@ -# InsightsTool +# Maine DOC Insight + +A desktop analytics tool for Maine DOC education program data. +Built with [Tauri](https://tauri.app/) (Rust backend) + React + Chart.js. + +## What it does + +**Dashboard views** — six data views for exploring program and resident outcomes: + +| View | What it covers | +|------|----------------| +| Home | System-wide KPIs, top programs by completion, near-release engagement snapshot | +| Programs | Completion rates, waitlists vs. throughput, second-enrollment rates, breakdown by LSI/custody/education level | +| Residents | Never-engaged roster, near-release residents by engagement status, no-diploma residents not in education | +| Facilities | Facility completion rates (raw and mix-adjusted), operational focus areas | +| Comparison | Side-by-side facility comparisons | +| Data Quality | Field-level missing data report, metric quality status, integrity checks | + +**AI chat panel** — ask natural-language questions about the loaded data. The planner routes your question to the right metrics; the writer synthesizes a cited response. Supports multiple AI providers (see below). No resident names or DOC numbers are sent to any external API — only aggregated metrics. + +**Data quality assessment** — automatic checks on every loaded dataset. Missing files, low coverage, and suspicious values surface as per-view badges and a dedicated Data Quality view with field-level detail. + +**Demo mode** — explore sample AI responses without loading real data or entering an API key. Toggle the switch in the chat panel header. + +## Prerequisites + +- [Node.js](https://nodejs.org/) ≥ 18 +- [Rust](https://www.rust-lang.org/tools/install) + Cargo (for Tauri) +- [Tauri prerequisites](https://tauri.app/v1/guides/getting-started/prerequisites) for your OS + +## Quick start + +```bash +npm install + +# Run in dev mode (opens a hot-reload window) +npm run tauri dev + +# Or run just the web frontend (no Rust required) +npm run dev +# then open http://localhost:5173 +``` + +## Build for distribution + +```bash +npm run tauri build +# Output: src-tauri/target/release/bundle/ +``` + +## AI providers + +Open the chat panel (✦ Chat tab on the right) and select a provider. + +| Provider | Setup | Privacy | +|----------|-------|---------| +| Google Gemini | API key from [aistudio.google.com](https://aistudio.google.com) | Aggregated metrics sent to Google | +| OpenAI | API key from [platform.openai.com](https://platform.openai.com/api-keys) | Aggregated metrics sent to OpenAI | +| Anthropic Claude | API key from [console.anthropic.com](https://console.anthropic.com) | Aggregated metrics sent to Anthropic | +| Ollama (local) | See below — no key required | Nothing leaves your machine | + +### Local AI with Ollama + +No API key required. Runs entirely on your machine. + +**1. Install Ollama** + +Download from [ollama.ai](https://ollama.ai) and follow the installer for your OS. + +**2. Start the server** + +```bash +ollama serve +``` + +Ollama must be running before you use the chat panel. If you see a connection error, run this command first. + +**3. Pull a model** + +```bash +# Recommended — works on most laptops (~4.7 GB) +ollama pull qwen2.5:7b + +# Better output quality if you have a GPU or more RAM (~9 GB) +ollama pull qwen2.5:14b +``` + +**4. Enable in the app** + +Open the chat panel, select **Ollama (local)**, and click **Enable local AI**. + +**Notes:** +- The first response after pulling a model may be slow (~30s) while it loads into memory. Subsequent responses are faster. +- Structured query planning requires solid instruction-following ability. `qwen2.5:7b` is the minimum recommended size; `qwen2.5:14b` is more reliable for complex questions. +- If the model returns malformed output, the app retries once with a corrected prompt before surfacing an error suggesting a larger model. +- If Ollama is running on a non-default port or host, edit `src/config/llm.json` and change the `endpoints.ollama` value. + +## File schema + +All files are optional — insights are generated from whatever is loaded. Files are organized into three sections in the loader. + +### DOC data + +Exported from the Maine DOC / OMS system. Accepts CSV or Excel (`.xlsx`). + +**Core:** + +| Dataset | Key columns | +|---------|-------------| +| Resident Roster | `ID`, `STATUS_DESC`, `LOCATION_TO`, `LOC_TYPE_TO`, `ODARA_SCORE`, `STATIC99R_SCORE`, `LSI_RATING`, `HIGHEST_ED_LVL`, `CUSTODY_LVL`, `Earliest Release Date`, `SENTENCE_OFFENSE`, `Offense Date`, `COUNTY`, `LAST_PROGRAM_COMPLETED`, `JOB_ASSIGN` | +| Program Participation | `ID`, `GENDER`, `Facility`, `CUSTODY LEVEL`, `Housing Unit`, `Housing Pod`, `Room`, `Bed`, `Program`, `Program Status`, `Program Termination Or Completion Date`, `Earliest Release Date` | + +**Advanced** (toggle "Advanced data" in the loader to reveal): + +> **Note:** Advanced dataset column schemas are based on expected data structure and have not been cross-referenced against actual Maine DOC exports. Column names may differ from real exports. + +| Dataset | Key columns | +|---------|-------------| +| Incident Records | `ID`, `Incident Date`, `Incident Type`, `Severity`, `Sanction`, `Facility` | +| Work Assignments | `ID`, `Assignment Type`, `Role Title`, `Start Date`, `End Date`, `Transferable Skills Flag`, `Facility` | +| Case Plans | `ID`, `State ID Obtained`, `State ID Date`, `Job Lined Up`, `Housing Plan`, `Trust Account Balance`, `Savings Goal Met` | +| Credentials | `ID`, `Credential Type`, `Credential Name`, `Date Earned`, `Issuing Body`, `Verified` | +| Housing History | `ID`, `Move Date`, `Housing Unit`, `Pod`, `Room`, `Bed`, `Custody Level`, `Move Reason`, `Facility` | + +### UnlockEd platform data + +> **Note:** This is a subset of the data available from the UnlockEd platform, converted to CSV files for local use. + +CSV exports from the UnlockEd database. Drop multiple files at once onto the UnlockEd section. + +`users.csv`, `facilities.csv`, `programs.csv`, `program_classes.csv`, `program_class_enrollments.csv`, `program_completions.csv`, `program_class_events.csv`, `program_class_event_attendance.csv`, `user_session_tracking.csv`, `program_credit_types.csv` + +### Mapping & reference + +Optional. Shown when "Advanced data" is enabled. + +| File | Purpose | +|------|---------| +| `program_crosswalk.csv` | Maps DOC program names to UnlockEd program IDs; enables fuzzy-match fallback | +| `field_mapping.csv` | Maps OMS/DOC column names to internal tool fields; handles future export schema changes | + +## Project structure + +``` +maine-doc-insight/ +├── src/ +│ ├── chat/ +│ │ ├── providers.ts # Provider registry (Gemini, OpenAI, Claude, Ollama) +│ │ ├── router.ts # Planner — routes questions to metric queries +│ │ ├── writer.ts # Writer — synthesizes cited responses +│ │ ├── prompts.ts # System instructions and user turn builders +│ │ ├── aggregator.ts # Executes DataPlan against loaded data +│ │ ├── contextPacket.ts # Assembles metric context for the writer +│ │ ├── flatTables.ts # Flat table projections for the aggregator +│ │ ├── actionItems.ts # Action item extraction +│ │ ├── refusal.ts # Refusal message builder +│ │ └── fetchWithRetry.ts # Fetch wrapper with retry + network error handling +│ ├── lib/ +│ │ ├── ingest.ts # CSV/Excel parsing, buildCoreFromDOC, buildCoreFromUL +│ │ ├── analytics.ts # All metric computations +│ │ ├── dataQuality.ts # Data quality checks and grading +│ │ └── demoExport.ts # Exports synthetic demo data as downloadable CSVs +│ ├── data/ +│ │ ├── mockData.ts # Synthetic demo data generator +│ │ ├── schemaRegistry.ts # Metric registry (IDs, labels, table mappings) +│ │ └── demoResponses.ts # Canned AI responses for demo mode +│ ├── config/ +│ │ ├── chat.json # Chat panel UI settings (confidence threshold, drawer width) +│ │ ├── llm.json # Provider endpoints and generation parameters +│ │ ├── models.json # Default model lists per provider +│ │ ├── data_quality.json # Missing-data warn/crit thresholds and LSI clustering parameters +│ │ ├── analytics.json # Algorithm parameters: top-N, mix-adjustment, cohort windows, statistical constants +│ │ ├── thresholds.json # Display thresholds: attention flag scoring, QoL green/yellow bands, color cutoffs +│ │ └── facilities.json # Facility code → display name pairs (10 Maine DOC facilities) +│ ├── components/ +│ │ ├── chat/ +│ │ │ └── ChatDrawer.tsx # AI chat panel with provider selection +│ │ ├── FileLoader.tsx # Drag-and-drop CSV ingestion UI +│ │ ├── OmsCards.tsx # OMS metric cards +│ │ ├── ChartFootnote.tsx # Per-chart data quality footnotes +│ │ ├── DataUnavailableCard.tsx # Placeholder when required data is missing +│ │ ├── DataQualityBanner.tsx +│ │ └── SmartActionItem.tsx +│ ├── contexts/ +│ │ └── DataQualityContext.tsx +│ ├── views/ +│ │ ├── HomeView.tsx # Dashboard — KPIs, top programs, near-release +│ │ ├── ProgramsView.tsx # Completion rates, waitlists, second-enrollment, breakdowns +│ │ ├── ResidentsView.tsx # Near-release, never-engaged, no-diploma roster +│ │ ├── FacilitiesView.tsx # Facility completion rates (raw + mix-adjusted) +│ │ ├── ComparisonView.tsx # Side-by-side facility comparisons +│ │ └── DataQualityView.tsx # Field-level data quality report +│ ├── types.ts # All TypeScript types +│ ├── App.tsx # Shell + navigation + quality indicators +│ └── app.css # Dark analytics theme +├── src-tauri/ # Rust/Tauri backend (minimal) +├── index.html +├── vite.config.ts +└── package.json +``` + +## Notes on mix-adjustment + +The mix-adjusted completion rate applies a correction for LSI risk composition. +If a facility has a higher share of High/Maximum LSI residents than the system average, +its raw rate is adjusted upward proportionally — surfacing true operational performance +independent of resident population composition. + +Adjustment formula: +``` +mixAdjustedRate = rawRate + (facilityHighRiskShare - systemHighRiskShare) × 15pp +``` +This is a simplified first-order adjustment. A regression-based approach would be more +rigorous for formal reporting. diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..1e9409f --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,36 @@ +import tsPlugin from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; +import reactPlugin from "eslint-plugin-react"; +import reactHooksPlugin from "eslint-plugin-react-hooks"; + +export default [ + { + ignores: ["dist/**", "src-tauri/**", "node_modules/**"], + }, + { + files: ["**/*.{ts,tsx}"], + languageOptions: { + parser: tsParser, + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + ecmaFeatures: { jsx: true }, + }, + }, + plugins: { + "@typescript-eslint": tsPlugin, + react: reactPlugin, + "react-hooks": reactHooksPlugin, + }, + rules: { + ...tsPlugin.configs.recommended.rules, + ...reactHooksPlugin.configs.recommended.rules, + "@typescript-eslint/no-unused-vars": ["error", { varsIgnorePattern: "^_", argsIgnorePattern: "^_", destructuredArrayIgnorePattern: "^_" }], + "react/jsx-uses-react": "off", + "react/react-in-jsx-scope": "off", + }, + settings: { + react: { version: "detect" }, + }, + }, +]; diff --git a/index.html b/index.html new file mode 100644 index 0000000..cc9b551 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + Maine DOC Insight + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..077da07 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5280 @@ +{ + "name": "maine-doc-insight", + "version": "0.6.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "maine-doc-insight", + "version": "0.6.1", + "dependencies": { + "@tauri-apps/api": "^1.5.0", + "chart.js": "^4.4.1", + "papaparse": "^5.4.1", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-dom": "^18.2.0", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@tauri-apps/cli": "^1.5.0", + "@types/papaparse": "^5.3.14", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "@typescript-eslint/eslint-plugin": "^8.60.1", + "@typescript-eslint/parser": "^8.60.1", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^9.39.4", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.1.1", + "typescript": "^5.0.0", + "vite": "^4.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "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.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@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-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "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/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.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "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/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@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/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tauri-apps/api": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.6.0.tgz", + "integrity": "sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg==", + "license": "Apache-2.0 OR MIT", + "engines": { + "node": ">= 14.6.0", + "npm": ">= 6.6.0", + "yarn": ">= 1.19.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.6.3.tgz", + "integrity": "sha512-q46umd6QLRKDd4Gg6WyZBGa2fWvk0pbeUA5vFomm4uOs1/17LIciHv2iQ4UD+2Yv5H7AO8YiE1t50V0POiEGEw==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "dependencies": { + "semver": ">=7.5.2" + }, + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "1.6.3", + "@tauri-apps/cli-darwin-x64": "1.6.3", + "@tauri-apps/cli-linux-arm-gnueabihf": "1.6.3", + "@tauri-apps/cli-linux-arm64-gnu": "1.6.3", + "@tauri-apps/cli-linux-arm64-musl": "1.6.3", + "@tauri-apps/cli-linux-x64-gnu": "1.6.3", + "@tauri-apps/cli-linux-x64-musl": "1.6.3", + "@tauri-apps/cli-win32-arm64-msvc": "1.6.3", + "@tauri-apps/cli-win32-ia32-msvc": "1.6.3", + "@tauri-apps/cli-win32-x64-msvc": "1.6.3" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.6.3.tgz", + "integrity": "sha512-fQN6IYSL8bG4NvkdKE4sAGF4dF/QqqQq4hOAU+t8ksOzHJr0hUlJYfncFeJYutr/MMkdF7hYKadSb0j5EE9r0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.6.3.tgz", + "integrity": "sha512-1yTXZzLajKAYINJOJhZfmMhCzweHSgKQ3bEgJSn6t+1vFkOgY8Yx4oFgWcybrrWI5J1ZLZAl47+LPOY81dLcyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.6.3.tgz", + "integrity": "sha512-CjTEr9r9xgjcvos09AQw8QMRPuH152B1jvlZt4PfAsyJNPFigzuwed5/SF7XAd8bFikA7zArP4UT12RdBxrx7w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.6.3.tgz", + "integrity": "sha512-G9EUUS4M8M/Jz1UKZqvJmQQCKOzgTb8/0jZKvfBuGfh5AjFBu8LHvlFpwkKVm1l4951Xg4ulUp6P9Q7WRJ9XSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.3.tgz", + "integrity": "sha512-MuBTHJyNpZRbPVG8IZBN8+Zs7aKqwD22tkWVBcL1yOGL4zNNTJlkfL+zs5qxRnHlUsn6YAlbW/5HKocfpxVwBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.6.3.tgz", + "integrity": "sha512-Uvi7M+NK3tAjCZEY1WGel+dFlzJmqcvu3KND+nqa22762NFmOuBIZ4KJR/IQHfpEYqKFNUhJfCGnpUDfiC3Oxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.3.tgz", + "integrity": "sha512-rc6B342C0ra8VezB/OJom9j/N+9oW4VRA4qMxS2f4bHY2B/z3J9NPOe6GOILeg4v/CV62ojkLsC3/K/CeF3fqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.6.3.tgz", + "integrity": "sha512-cSH2qOBYuYC4UVIFtrc1YsGfc5tfYrotoHrpTvRjUGu0VywvmyNk82+ZsHEnWZ2UHmu3l3lXIGRqSWveLln0xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.6.3.tgz", + "integrity": "sha512-T8V6SJQqE4PSWmYBl0ChQVmS6AR2hXFHURH2DwAhgSGSQ6uBXgwlYFcfIeQpBQA727K2Eq8X2hGfvmoySyHMRw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.6.3.tgz", + "integrity": "sha512-HUkWZ+lYHI/Gjkh2QjHD/OBDpqLVmvjZGpLK9losur1Eg974Jip6k+vsoTUxQBCBDfj30eDBct9E1FvXOspWeg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "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/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.8.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.8.0.tgz", + "integrity": "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/papaparse": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.5.2.tgz", + "integrity": "sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.1.tgz", + "integrity": "sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/type-utils": "8.60.1", + "@typescript-eslint/utils": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.60.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.1.tgz", + "integrity": "sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.1.tgz", + "integrity": "sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.1", + "@typescript-eslint/types": "^8.60.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.1.tgz", + "integrity": "sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.1.tgz", + "integrity": "sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.1.tgz", + "integrity": "sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/utils": "8.60.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.1.tgz", + "integrity": "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.1.tgz", + "integrity": "sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.60.1", + "@typescript-eslint/tsconfig-utils": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.1.tgz", + "integrity": "sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.1.tgz", + "integrity": "sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", + "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/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "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/chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.355", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.355.tgz", + "integrity": "sha512-LUPZhKzZPYSPme1jEYohpkA+ybYCJztr1quAdBd7E7h3+VOBVcKkwwtBJu41nrjawrRzfb8mtMfzWozoaK0ZIQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/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/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/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-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/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/node-releases": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/papaparse": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", + "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/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.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "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/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-chartjs-2": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.1.tgz", + "integrity": "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.30.0.tgz", + "integrity": "sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz", + "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.21.tgz", + "integrity": "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..effa8c3 --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "maine-doc-insight", + "private": true, + "version": "0.6.1", + "type": "module", + "scripts": { + "dev": "vite --open", + "build": "tsc && vite build", + "preview": "vite preview", + "tauri": "tauri" + }, + "dependencies": { + "@tauri-apps/api": "^1.5.0", + "chart.js": "^4.4.1", + "papaparse": "^5.4.1", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-dom": "^18.2.0", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@tauri-apps/cli": "^1.5.0", + "@types/papaparse": "^5.3.14", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "@typescript-eslint/eslint-plugin": "^8.60.1", + "@typescript-eslint/parser": "^8.60.1", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^9.39.4", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.1.1", + "typescript": "^5.0.0", + "vite": "^4.4.0" + } +} diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 0000000..01f2df8 --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,4228 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "cairo-rs" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "cargo_toml" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +dependencies = [ + "serde", + "toml 0.7.8", +] + +[[package]] +name = "cc" +version = "1.2.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d506610004cfc74a6f5ee7e8c632b355de5eca1f03ee5e5e0ec11b77d4eb3d61" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.8.23", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" +dependencies = [ + "cfg-if", + "libc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fluent-uri" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +dependencies = [ + "bitflags 1.3.2", + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gdk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps 6.2.2", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps 6.2.2", +] + +[[package]] +name = "gdkx11-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps 6.2.2", + "x11", +] + +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + +[[package]] +name = "gio" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", + "winapi", +] + +[[package]] +name = "glib" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.15.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "glib-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +dependencies = [ + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "globset" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "gobject-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gtk" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +dependencies = [ + "atk", + "bitflags 1.3.2", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps 6.2.2", +] + +[[package]] +name = "gtk3-macros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +dependencies = [ + "anyhow", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.18", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ignore" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-traits", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" +dependencies = [ + "cfb", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "js-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "jsonptr" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" +dependencies = [ + "fluent-uri", + "serde", + "serde_json", +] + +[[package]] +name = "kuchikiki" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +dependencies = [ + "cssparser", + "html5ever", + "indexmap 1.9.3", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libredox" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "maine-doc-insight" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-build", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +dependencies = [ + "log", + "phf 0.10.1", + "phf_codegen 0.10.0", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags 1.3.2", + "jni-sys 0.3.1", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-conv" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +dependencies = [ + "bitflags 1.3.2", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.6", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.6", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.3", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plist" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092791278e026273c1b65bbdcfbba3a300f2994c896bd01ab01da613c29c46f1" +dependencies = [ + "base64 0.22.1", + "indexmap 2.14.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.39.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "rfd" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" +dependencies = [ + "block", + "dispatch", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "lazy_static", + "log", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.37.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "indexmap 2.14.0", + "itoa 1.0.18", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_with" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e72c1c2cb7b223fafb600a619537a871c2818583d619401b785e7c0b746ccde2" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b90c488738ecb4fb0262f41f43bc40efc5868d9fb744319ddf5f5317f417bfac" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "soup2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +dependencies = [ + "bitflags 1.3.2", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags 1.3.2", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", + "pkg-config", + "toml 0.5.11", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr 0.15.8", + "heck 0.5.0", + "pkg-config", + "toml 0.8.23", + "version-compare 0.2.1", +] + +[[package]] +name = "tao" +version = "0.16.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf915e6c7112402f7b88a064cfbd264f851052df07fdc3a2abd3038b0cc434a" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "cc", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gdkwayland-sys", + "gdkx11-sys", + "gio", + "glib", + "glib-sys", + "gtk", + "image", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "png", + "raw-window-handle", + "scopeguard", + "serde", + "tao-macros", + "unicode-segmentation", + "uuid", + "windows 0.39.0", + "windows-implement 0.39.0", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tar" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae1f57c291a6ab8e1d2e6b8ad0a35ff769c9925deb8a89de85425ff08762d0c" +dependencies = [ + "anyhow", + "cocoa", + "dirs-next", + "dunce", + "embed_plist", + "encoding_rs", + "flate2", + "futures-util", + "getrandom 0.2.17", + "glib", + "glob", + "gtk", + "heck 0.5.0", + "http", + "ignore", + "log", + "objc", + "once_cell", + "percent-encoding", + "plist", + "rand 0.8.6", + "raw-window-handle", + "rfd", + "semver", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-build" +version = "1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2db08694eec06f53625cfc6fff3a363e084e5e9a238166d2989996413c346453" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs-next", + "heck 0.5.0", + "json-patch", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53438d78c4a037ffe5eafa19e447eea599bedfb10844cb08ec53c2471ac3ac3f" +dependencies = [ + "base64 0.21.7", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "tauri-utils", + "thiserror", + "time", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233988ac08c1ed3fe794cd65528d48d8f7ed4ab3895ca64cdaa6ad4d00c45c0b" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 1.0.109", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8066855882f00172935e3fa7d945126580c34dcbabab43f5d4f0c2398a67d47b" +dependencies = [ + "gtk", + "http", + "http-range", + "rand 0.8.6", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "url", + "uuid", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.14.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce361fec1e186705371f1c64ae9dd2a3a6768bc530d0a2d5e75a634bb416ad4d" +dependencies = [ + "cocoa", + "gtk", + "percent-encoding", + "rand 0.8.6", + "raw-window-handle", + "tauri-runtime", + "tauri-utils", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c357952645e679de02cd35007190fcbce869b93ffc61b029f33fe02648453774" +dependencies = [ + "brotli", + "ctor", + "dunce", + "glob", + "heck 0.5.0", + "html5ever", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "walkdir", + "windows-version", +] + +[[package]] +name = "tauri-winres" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" +dependencies = [ + "embed-resource", + "toml 0.7.8", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa 1.0.18", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "pin-project-lite", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "typenum" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.121" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.1", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup2", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup2-sys", + "system-deps 6.2.2", +] + +[[package]] +name = "webview2-com" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.39.0", + "windows-implement 0.39.0", +] + +[[package]] +name = "webview2-com-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "webview2-com-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +dependencies = [ + "regex", + "serde", + "serde_json", + "thiserror", + "windows 0.39.0", + "windows-bindgen", + "windows-metadata", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +dependencies = [ + "windows_aarch64_msvc 0.37.0", + "windows_i686_gnu 0.37.0", + "windows_i686_msvc 0.37.0", + "windows_x86_64_gnu 0.37.0", + "windows_x86_64_msvc 0.37.0", +] + +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement 0.39.0", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-bindgen" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +dependencies = [ + "windows-metadata", + "windows-tokens", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +dependencies = [ + "syn 1.0.109", + "windows-tokens", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-metadata" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-tokens" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.14.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.1", + "indexmap 2.14.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.14.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wry" +version = "0.24.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a2a144c3ab5e83e04724bc8e67cea552ffae413185fda459fafdae173fd985d" +dependencies = [ + "base64 0.13.1", + "block", + "cocoa", + "core-graphics", + "crossbeam-channel", + "dunce", + "gdk", + "gio", + "glib", + "gtk", + "html5ever", + "http", + "kuchikiki", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "sha2", + "soup2", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.39.0", + "windows-implement 0.39.0", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..4f1101b --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "maine-doc-insight" +version = "0.1.0" +description = "Maine DOC Education Program Analytics" +authors = [] +license = "" +repository = "" +edition = "2021" +rust-version = "1.70" + +[build-dependencies] +tauri-build = { version = "1.5", features = [] } + +[dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +tauri = { version = "1.5", features = ["dialog-open", "fs-read-file"] } + +[features] +default = ["custom-protocol"] +custom-protocol = ["tauri/custom-protocol"] diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..faace951988bae718f4baf10cbd1846b89db8f26 GIT binary patch literal 9465 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 LNkvXXu0mjfy;Cm$ literal 0 HcmV?d00001 diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..db4a3559b52fe1a0a90f8a9aa65e6adbba97f36b GIT binary patch literal 18302 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e6ec4021302933a78bf1c5e1fa5c642fb44897 GIT binary patch literal 7943 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f03a5631697da9cf46bfc89b33fe6fc20eebafa5 GIT binary patch literal 11099 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7eb1680292bf04f72816d2cb9d1056226dd292 GIT binary patch literal 21309 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 Ef&?kv;Q#;t literal 0 HcmV?d00001 diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ba350b2ff8d84ca7364cf4d14dad947abf0a6832 GIT binary patch literal 1844 zcmV-42g~@0P)3$w6g}^~*_XDqg%(*_3fK}!AQ6M00Ss{qLJ0|oi9(_z@zPb0i=iYP9H?GpM z$_z%i48!Csyo|si; z(l(O)T?k9Ear586L(><*Q&b=U6@VcZW7`QJ(bbFY`k&Bp@(V;7&dBD%iq1&Y8^fVC zOiLj(U0zID{0_>WS_@Z@^+PrS#O~aXsv6~eCsWF^68K6g;U7B{?jY|73eu6*(>u|0 z_&sS+R9nD8@+Q`#0v=nDOQz_{$%b!2#NTuS3(p zEr_;V)4}1(Fs!?H>mb=We0=%FOhLtq@5%;h!DX?wHeC9AiOzxL4Gt!^0->TU3M8l1 za$)+qeF#mQB0+%WLm#7I-$og(7+irOn5Nt5YPPXDI2j#8wuV*N1Kqgu+diZd2^3CS z0CzzU1y%FWety3)K!V&&Oo&s_E>tdiA7f`fuaz=s^N|nX36Fs(Q)&(tc>k1ImL&if zItPT_^aRoM*D<71DHK&NfUmez?meWfV!ydzD;O@`Vki0$s+f%_D?fuFbKZWwPAg?n zE=nZgh(scq)a`Z;CNyRDyvJv;SPao+zCqgf_9-q9tkg5+426B}s_2ZG{2o)RifuMQF+k^Uu<2~<{8VEM8a zP+ne+_KpsCJRU(IfvT#>_;%M0eDcv|ta@n$R;{eXv}sfInUo_jd`i8xbGsFx!kVYy z6WXN{QJCaxfrtdffjng&RQA&8oR}DhOCVm^N@V(N8$O>8+rR!2OBX+b<3FFq!9#Vh zrTv6k1&G_07^d4VF%Kfymxi}6AcOWqRwp>kltC&I#eqC!Vn=Nlz|2v{%uQrk0{Z=a zl$DiX*LV9-Te}>WFJFdbI0~5?z)V_W5y5EdRY3p(m$3;8#eq_nU*zvj z_1haa;pow0h{|Avg29}^50geRW}ru78#OiAT$V?Q5vn+XPZ@NYpYLKtE|*Iu`EcD4 zgu@}YU2cItJ<4}%r25)*%a%W^^mOH`W)#!Xsb=rPp^(1+FAKac0NsgdLU{Fq2tJ|D zXJx}L_SzT)oqOF*W6OIx7C~BanuL}*%3O3AOZ#i%|GKEn^k!e_WX%!pyd}z*pn#Za z;`CEm8(oIn=6wekM;0>c=HBm%tsiL=~gxZ8)pqWRhn*uJGi*kn~ep z8`Xt7qc%4;H{;k3CvoAzpZfXU;x#?E;~*LGh$ zA$-0jM&XAsro1YnCNb$T%-B$;Leh5j0Iuv<19ylfVXFj2qY}jHQN}|ue)nCaeW`z_2@#SUcy>Uk8$O;4tw>awJDJU07n^P< zkq>*ZK6pziQ1kjOge$AF+!H^gwb5nR60UK$&cw=7p$w;&gXAkM(Zc$gZ=inrYB_gZ z&+5ZShrOXE&3-+YO>fE#Y?e*- z4msrIP3$Chq_lAAlX`NXiPKMMZLB79kMa@~iUWB{%Cwx^hMub@wMx#;@T7SY=P=A3 zc?qk?Dxsu_(@$w_bQz|l_EH9^NE8S1lpD7kYt6#~l literal 0 HcmV?d00001 diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebc74a4bab30c9e8afba49055f7270631a39640 GIT binary patch literal 23013 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
+ {/* ── Top bar ─────────────────────────────────────────────────────── */} +
+
+ Maine DOC · Insight +
+ {isDemo && ( + + DEMO DATA + + )} +
+ + {data && ( + <> + + {data.residents.length} residents · {data.facilities.length} facilities · {data.enrollments.length} enrollments + + + + )} +
+
+ + {/* ── Sidebar ─────────────────────────────────────────────────────── */} + + + {/* ── Main content ────────────────────────────────────────────────── */} +
+ {loading && ( +
+
+ Processing data… + +
+ )} + + {!loading && error && ( +
+ {error} +
+ )} + + {!loading && view === "load" && ( + loadDemo(scenario)} /> + )} + + {!loading && data && ( + + {view === "dashboard" && } + {view === "quality" && } + {view === "programs" && } + {view === "residents" && } + {view === "facilities" && } + {view === "comparison" && } + + )} +
+ + setPendingPrompt(null)} + onOpenChange={setChatOpen} + chatDemoMode={chatDemoMode} + onChatDemoModeChange={setChatDemoMode} + /> + + {/* ── Footer ──────────────────────────────────────────────────────── */} + {snapshot && ( +
+ snapshot:{snapshot.id.slice(0, 8)} + as-of:{snapshot.as_of_date} + schema:{snapshot.schema_version} + {isDemo && DEMO} +
+ )} +
+ ); +} diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..912fc1d --- /dev/null +++ b/src/app.css @@ -0,0 +1,410 @@ +@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@300;400;500;600&display=swap'); + +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + +:root { + --bg: #0d0f12; + --bg2: #141720; + --bg3: #1c2030; + --bg4: #232840; + --border: rgba(255,255,255,0.08); + --border2: rgba(255,255,255,0.14); + --text: #e8eaf0; + --text2: #9ca3b0; + --text3: #606878; + --accent: #4a9eff; + --accent2: #2d7de0; + --green: #3db87a; + --amber: #f59e0b; + --red: #e05252; + --purple: #8b5cf6; + --teal: #14b8a6; + --font-sans: 'IBM Plex Sans', system-ui, sans-serif; + --font-mono: 'IBM Plex Mono', monospace; + --radius-sm: 4px; + --radius-md: 8px; + --radius-lg: 12px; + --row-sep: rgba(255,255,255,0.04); +} + +[data-theme="light"] { + --bg: #f5f6f8; + --bg2: #ffffff; + --bg3: #eef0f4; + --bg4: #e2e5eb; + --border: rgba(0,0,0,0.08); + --border2: rgba(0,0,0,0.16); + --text: #111318; + --text2: #3d4455; + --text3: #7a8394; + --accent: #2563eb; + --accent2: #1d4ed8; + --row-sep: rgba(0,0,0,0.05); +} + +html, body, #root { height: 100%; } +body { + background: var(--bg); + color: var(--text); + font-family: var(--font-sans); + font-size: 14px; + line-height: 1.6; + -webkit-font-smoothing: antialiased; +} + +/* ── Layout ──────────────────────────────────────────────────────────────── */ +.app-shell { + display: grid; + grid-template-columns: 220px 1fr; + grid-template-rows: 48px 1fr 28px; + height: 100vh; + overflow: hidden; +} + +.app-topbar { + grid-column: 1 / -1; + display: flex; + align-items: center; + gap: 12px; + padding: 0 20px; + background: var(--bg2); + border-bottom: 1px solid var(--border); + flex-shrink: 0; +} + +.app-topbar .logo { + font-family: var(--font-mono); + font-size: 13px; + font-weight: 500; + color: var(--accent); + letter-spacing: 0.06em; + text-transform: uppercase; +} +.app-topbar .logo span { color: var(--text3); } + +.app-topbar .topbar-right { + margin-left: auto; + display: flex; + align-items: center; + gap: 8px; +} + +.app-sidebar { + grid-row: 2 / 4; + background: var(--bg2); + border-right: 1px solid var(--border); + display: flex; + flex-direction: column; + padding: 16px 0; + overflow-y: auto; +} + +.app-footer { + grid-column: 2 / 3; + grid-row: 3; + display: flex; + align-items: center; + padding: 0 20px; + background: var(--bg2); + border-top: 1px solid var(--border); + font-family: var(--font-mono); + font-size: 10px; + color: var(--text3); + letter-spacing: 0.04em; + gap: 16px; +} + +.sidebar-section-label { + padding: 8px 16px 4px; + font-size: 10px; + font-weight: 500; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--text3); +} + +.sidebar-item { + display: flex; + align-items: center; + gap: 8px; + padding: 7px 16px; + font-size: 13px; + color: var(--text2); + cursor: pointer; + border-left: 2px solid transparent; + transition: all 0.12s; + user-select: none; +} +.sidebar-item:hover { background: var(--bg3); color: var(--text); } +.sidebar-item.active { background: var(--bg3); color: var(--accent); border-left-color: var(--accent); } +.sidebar-item .icon { width: 16px; text-align: center; opacity: 0.8; } + +.app-content { + overflow-y: auto; + padding: 24px; + background: var(--bg); +} + +/* ── Metric cards ─────────────────────────────────────────────────────────── */ +.metric-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); + gap: 12px; + margin-bottom: 24px; +} +.metric-card { + background: var(--bg2); + border: 1px solid var(--border); + border-radius: var(--radius-md); + padding: 14px 16px; +} +.metric-card .label { + font-size: 10px; + font-weight: 500; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--text3); + margin-bottom: 6px; +} +.metric-card .value { + font-size: 26px; + font-weight: 500; + font-family: var(--font-mono); + color: var(--text); + line-height: 1; +} +.metric-card .value.accent { color: var(--accent); } +.metric-card .value.green { color: var(--green); } +.metric-card .value.amber { color: var(--amber); } +.metric-card .value.red { color: var(--red); } +.metric-card .sub { + font-size: 11px; + color: var(--text3); + margin-top: 4px; +} + +/* ── Section headings ────────────────────────────────────────────────────── */ +.section-header { + display: flex; + align-items: baseline; + gap: 10px; + margin-bottom: 16px; +} +.section-header h2 { + font-size: 16px; + font-weight: 500; + color: var(--text); +} +.section-header .tag { + font-size: 10px; + font-family: var(--font-mono); + color: var(--text3); + border: 1px solid var(--border); + border-radius: 3px; + padding: 1px 6px; +} + +.view-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); + gap: 20px; +} + +.view-grid > * { + min-width: 0; + overflow: hidden; +} + +.chart-card { + background: var(--bg2); + border: 1px solid var(--border); + border-radius: var(--radius-lg); + padding: 20px; + min-width: 0; + overflow: hidden; +} +.chart-card h3 { + font-size: 13px; + font-weight: 500; + color: var(--text2); + margin-bottom: 4px; +} +.chart-card .finding { + font-size: 12px; + color: var(--text3); + margin-bottom: 16px; + line-height: 1.5; +} +.chart-card .finding strong { color: var(--amber); font-weight: 500; } + +/* ── Buttons ─────────────────────────────────────────────────────────────── */ +.btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + font-family: var(--font-sans); + font-size: 13px; + font-weight: 500; + border-radius: var(--radius-sm); + border: 1px solid var(--border2); + background: var(--bg3); + color: var(--text2); + cursor: pointer; + transition: all 0.12s; +} +.btn:hover { background: var(--bg4); color: var(--text); border-color: var(--border2); } +.btn.primary { background: var(--accent2); color: #fff; border-color: var(--accent2); } +.btn.primary:hover { background: var(--accent); } +.btn.sm { padding: 4px 8px; font-size: 12px; } + +/* ── File loader ─────────────────────────────────────────────────────────── */ +.loader-section { + border: 1px solid var(--border); + border-radius: var(--radius-lg); + margin-bottom: 14px; + overflow: hidden; + transition: border-color 0.15s; +} +.loader-section.drag-over { border-color: var(--accent); } +.loader-section-header { + padding: 14px 18px 12px; + background: var(--bg2); + border-bottom: 1px solid var(--border); +} +.loader-section-header h3 { font-size: 13px; font-weight: 600; color: var(--text); margin: 0 0 4px; } +.loader-section-header p { font-size: 12px; color: var(--text3); margin: 0; line-height: 1.5; } +.loader-section-body { padding: 14px 16px; } + +.drop-zone-compact { + border: 1px dashed var(--border2); + border-radius: var(--radius-md); + padding: 10px 16px; + text-align: center; + color: var(--text3); + font-size: 13px; + cursor: pointer; + transition: all 0.15s; +} +.drop-zone-compact:hover, .drop-zone-compact.drag-over { + border-color: var(--accent); + background: rgba(74, 158, 255, 0.04); + color: var(--text2); +} + +.file-slot { + display: flex; + align-items: center; + gap: 10px; + padding: 9px 14px; + border: 1px solid var(--border); + border-radius: var(--radius-md); + cursor: pointer; + transition: all 0.12s; + margin-bottom: 7px; +} +.file-slot:last-child { margin-bottom: 0; } +.file-slot:hover { border-color: var(--border2); background: var(--bg2); } +.file-slot.loaded { border-color: rgba(61, 184, 122, 0.3); background: rgba(61, 184, 122, 0.03); } +.file-slot-status { width: 28px; text-align: center; font-size: 16px; flex-shrink: 0; } +.file-slot .filename { font-family: var(--font-mono); font-size: 12px; color: var(--text2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.file-slot .badge { font-size: 10px; padding: 2px 6px; border-radius: 3px; font-weight: 500; flex-shrink: 0; } +.file-slot .badge.ok { background: rgba(61, 184, 122, 0.15); color: var(--green); } +.file-slot .badge.opt { background: rgba(96, 104, 120, 0.2); color: var(--text3); } + +.file-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); + gap: 10px; +} +.file-row { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 14px; + background: var(--bg2); + border: 1px solid var(--border); + border-radius: var(--radius-md); +} +.file-row.loaded { border-color: rgba(61, 184, 122, 0.3); } +.file-row .filename { font-family: var(--font-mono); font-size: 12px; color: var(--text2); flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.file-row .badge { font-size: 10px; padding: 2px 6px; border-radius: 3px; font-weight: 500; } +.file-row .badge.ok { background: rgba(61, 184, 122, 0.15); color: var(--green); } +.file-row .badge.opt { background: rgba(96, 104, 120, 0.2); color: var(--text3); } + +/* ── Table ───────────────────────────────────────────────────────────────── */ +.data-table { width: 100%; border-collapse: collapse; font-size: 13px; } +.data-table th { + text-align: left; + padding: 8px 12px; + font-size: 10px; + font-weight: 500; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--text3); + border-bottom: 1px solid var(--border); +} +.data-table td { + padding: 9px 12px; + border-bottom: 1px solid var(--row-sep); + color: var(--text); +} +.data-table tr:hover td { background: var(--bg3); } +.data-table .mono { font-family: var(--font-mono); font-size: 12px; } +.data-table .pill { + display: inline-block; + padding: 2px 8px; + border-radius: 10px; + font-size: 11px; + font-weight: 500; +} +.pill-blue { background: rgba(74, 158, 255, 0.15); color: var(--accent); } +.pill-green { background: rgba(61, 184, 122, 0.15); color: var(--green); } +.pill-amber { background: rgba(245, 158, 11, 0.15); color: var(--amber); } +.pill-red { background: rgba(224, 82, 82, 0.15); color: var(--red); } +.pill-gray { background: rgba(96, 104, 120, 0.2); color: var(--text3); } + +/* ── Filter bar ─────────────────────────────────────────────────────────── */ +.filter-bar { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; + margin-bottom: 16px; +} +.filter-bar select, .filter-bar input { + padding: 5px 10px; + background: var(--bg2); + border: 1px solid var(--border2); + border-radius: var(--radius-sm); + color: var(--text); + font-size: 13px; + font-family: var(--font-sans); + outline: none; +} +.filter-bar select:focus, .filter-bar input:focus { border-color: var(--accent); } +.filter-bar label { font-size: 12px; color: var(--text3); } + +/* ── Progress bar ───────────────────────────────────────────────────────── */ +.pbar-bg { background: var(--bg3); border-radius: 2px; height: 6px; width: 100%; } +.pbar-fill { height: 6px; border-radius: 2px; transition: width 0.3s; } + +/* ── Status badge ───────────────────────────────────────────────────────── */ +.status-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; margin-right: 5px; } +.dot-green { background: var(--green); } +.dot-amber { background: var(--amber); } +.dot-red { background: var(--red); } +.dot-gray { background: var(--text3); } + +/* ── Scrollbar ───────────────────────────────────────────────────────────── */ +::-webkit-scrollbar { width: 6px; height: 6px; } +::-webkit-scrollbar-track { background: transparent; } +::-webkit-scrollbar-thumb { background: var(--bg4); border-radius: 3px; } + +/* ── Utility ─────────────────────────────────────────────────────────────── */ +.mt-16 { margin-top: 16px; } +.mt-24 { margin-top: 24px; } +.mb-16 { margin-bottom: 16px; } +.text-muted { color: var(--text3); } +.text-mono { font-family: var(--font-mono); } +.full-width-card { grid-column: 1 / -1; } diff --git a/src/chat/actionItems.ts b/src/chat/actionItems.ts new file mode 100644 index 0000000..e1942ce --- /dev/null +++ b/src/chat/actionItems.ts @@ -0,0 +1,117 @@ +import type { LLMConfig } from "./providers"; +import { resolveModel } from "./providers"; +import { fetchWithRetry } from "./fetchWithRetry"; +import LLM_CONFIG from "../config/llm.json"; + +const SYSTEM = + "You are an analyst for Maine DOC corrections education programs. " + + "Given a section label and key metrics, write exactly 1-2 concise, specific, data-driven sentences " + + "as an action recommendation for program managers. Be concrete and actionable. " + + "Output ONLY the recommendation text — no labels, no preamble, no markdown."; + +function buildPrompt(sectionLabel: string, metrics: Record): string { + return `Section: ${sectionLabel}\nMetrics:\n${JSON.stringify(metrics, null, 2)}\n\nWrite the action recommendation.`; +} + +async function callGemini(sectionLabel: string, metrics: Record, apiKey: string, model: string): Promise { + const response = await fetchWithRetry( + `${LLM_CONFIG.endpoints.geminiBase}/${model}:generateContent?key=${apiKey}`, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + systemInstruction: { parts: [{ text: SYSTEM }] }, + contents: [{ role: "user", parts: [{ text: buildPrompt(sectionLabel, metrics) }] }], + generationConfig: { temperature: LLM_CONFIG.params.actionItems.temperature, maxOutputTokens: LLM_CONFIG.params.actionItems.maxTokens }, + }), + } + ); + if (!response.ok) throw new Error(`Gemini ${response.status}`); + const body = await response.json(); + return (body.candidates?.[0]?.content?.parts?.[0]?.text ?? "").trim(); +} + +async function callOpenAI(sectionLabel: string, metrics: Record, apiKey: string, model: string): Promise { + const response = await fetchWithRetry( + LLM_CONFIG.endpoints.openai, + { + method: "POST", + headers: { "Content-Type": "application/json", "Authorization": `Bearer ${apiKey}` }, + body: JSON.stringify({ + model, + messages: [ + { role: "system", content: SYSTEM }, + { role: "user", content: buildPrompt(sectionLabel, metrics) }, + ], + temperature: LLM_CONFIG.params.actionItems.temperature, + max_tokens: LLM_CONFIG.params.actionItems.maxTokens, + }), + } + ); + if (!response.ok) throw new Error(`OpenAI ${response.status}`); + const body = await response.json(); + return (body.choices?.[0]?.message?.content ?? "").trim(); +} + +async function callClaude(sectionLabel: string, metrics: Record, apiKey: string, model: string): Promise { + const response = await fetchWithRetry( + LLM_CONFIG.endpoints.claude, + { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-api-key": apiKey, + "anthropic-version": LLM_CONFIG.anthropicVersion, + }, + body: JSON.stringify({ + model, + system: SYSTEM, + messages: [{ role: "user", content: buildPrompt(sectionLabel, metrics) }], + max_tokens: LLM_CONFIG.params.actionItems.maxTokens, + temperature: LLM_CONFIG.params.actionItems.temperature, + }), + } + ); + if (!response.ok) throw new Error(`Claude ${response.status}`); + const body = await response.json(); + return (body.content?.[0]?.text ?? "").trim(); +} + +async function callOllama(sectionLabel: string, metrics: Record, model: string): Promise { + const response = await fetchWithRetry( + LLM_CONFIG.endpoints.ollama, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + model, + messages: [ + { role: "system", content: SYSTEM }, + { role: "user", content: buildPrompt(sectionLabel, metrics) }, + ], + temperature: LLM_CONFIG.params.actionItems.temperature, + stream: false, + }), + } + ); + if (!response.ok) { + if (response.status === 404) throw new Error(`Ollama model not found. Run: ollama pull ${model}`); + throw new Error(`Ollama ${response.status}`); + } + const body = await response.json(); + return (body.choices?.[0]?.message?.content ?? "").trim(); +} + +export async function generateActionItem( + sectionLabel: string, + metrics: Record, + config: LLMConfig, +): Promise { + const model = resolveModel(config); + switch (config.provider) { + case "gemini": return callGemini(sectionLabel, metrics, config.apiKey, model); + case "openai": return callOpenAI(sectionLabel, metrics, config.apiKey, model); + case "claude": return callClaude(sectionLabel, metrics, config.apiKey, model); + case "ollama": return callOllama(sectionLabel, metrics, model); + } +} diff --git a/src/chat/aggregator.ts b/src/chat/aggregator.ts new file mode 100644 index 0000000..1559e37 --- /dev/null +++ b/src/chat/aggregator.ts @@ -0,0 +1,153 @@ +import type { + ParsedData, DataPlan, DataRequest, FilterSpec, ComputeSpec, + FlatEnrollment, FlatResident, FlatSession, +} from "../types"; +import { buildFlatEnrollments, buildFlatResidents, buildFlatSessions } from "./flatTables"; + +type FlatRow = Record; + +interface FlatTables { + flat_enrollments: FlatRow[]; + flat_residents: FlatRow[]; + flat_sessions: FlatRow[]; +} + +// Known boolean and numeric fields for value coercion. +const BOOL_FIELDS = new Set(["anyEnrollment", "anyCompletion"]); +const NUM_FIELDS = new Set(["monthsToRelease", "durationMinutes", "activePrograms"]); + +function coerce(value: string | undefined, field: string): unknown { + if (value === undefined || value === null) return undefined; + if (BOOL_FIELDS.has(field)) return value === "true"; + if (NUM_FIELDS.has(field)) return parseFloat(value); + return value; +} + +function matchesFilter(row: FlatRow, f: FilterSpec): boolean { + const val = row[f.field]; + const cv = coerce(f.value, f.field); + + switch (f.op) { + case "eq": return val === cv; + case "neq": return val !== cv; + case "in": { + let arr: string[]; + try { arr = JSON.parse(f.value ?? "[]"); } catch { arr = []; } + return arr.includes(String(val)); + } + case "notNull": return val != null; + case "isNull": return val == null; + case "gt": return typeof val === "number" && typeof cv === "number" && val > cv; + case "lt": return typeof val === "number" && typeof cv === "number" && val < cv; + case "gte": return typeof val === "number" && typeof cv === "number" && val >= cv; + case "lte": return typeof val === "number" && typeof cv === "number" && val <= cv; + default: return true; + } +} + +function applyFilters(rows: FlatRow[], filters: FilterSpec[]): FlatRow[] { + return rows.filter(row => filters.every(f => matchesFilter(row, f))); +} + +function computeOne(rows: FlatRow[], spec: ComputeSpec): number | null { + if (rows.length === 0) return null; + + switch (spec.fn) { + case "count": return rows.length; + + case "rate": { + if (!spec.rateField) return null; + const cv = coerce(spec.rateValue, spec.rateField); + const n = rows.filter(r => r[spec.rateField!] === cv).length; + return rows.length > 0 ? Math.round((n / rows.length) * 1000) / 1000 : null; + } + + case "mean": { + if (!spec.field) return null; + const nums = rows.map(r => Number(r[spec.field!])).filter(n => !isNaN(n)); + return nums.length ? nums.reduce((a, b) => a + b, 0) / nums.length : null; + } + + case "sum": { + if (!spec.field) return null; + return rows.map(r => Number(r[spec.field!])).filter(n => !isNaN(n)).reduce((a, b) => a + b, 0); + } + + case "distinctCount": { + if (!spec.field) return null; + return new Set(rows.map(r => String(r[spec.field!]))).size; + } + + case "median": { + if (!spec.field) return null; + const sorted = rows.map(r => Number(r[spec.field!])).filter(n => !isNaN(n)).sort((a, b) => a - b); + if (!sorted.length) return null; + const mid = Math.floor(sorted.length / 2); + return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid]; + } + + default: return null; + } +} + +function executeRequest( + req: DataRequest, + tables: FlatTables, +): { id: string; label: string; data: unknown } { + const allRows = tables[req.table] ?? []; + const filtered = req.filters?.length ? applyFilters(allRows, req.filters) : allRows; + + if (!req.groupBy?.length) { + const result: Record = {}; + for (const spec of req.compute) result[spec.alias] = computeOne(filtered, spec); + return { id: req.id, label: req.label, data: result }; + } + + // Group rows by composite key + const groupMap = new Map(); + for (const row of filtered) { + const key = req.groupBy!.map(f => String(row[f] ?? "null")).join("\x00"); + const bucket = groupMap.get(key); + if (bucket) bucket.push(row); + else groupMap.set(key, [row]); + } + + let groups: Record[] = [...groupMap.entries()].map(([key, rows]) => { + const dims = Object.fromEntries(req.groupBy!.map((f, i) => [f, key.split("\x00")[i]])); + const metrics: Record = {}; + for (const spec of req.compute) metrics[spec.alias] = computeOne(rows, spec); + return { ...dims, ...metrics, _count: rows.length }; + }); + + if (req.sortBy) { + const sortField = req.sortBy; + const dir = req.sortDir === "asc" ? 1 : -1; + groups.sort((a, b) => dir * ((Number(a[sortField]) || 0) - (Number(b[sortField]) || 0))); + } + + if (req.limit) groups = groups.slice(0, req.limit); + return { id: req.id, label: req.label, data: groups }; +} + +export function executeDataPlan( + plan: DataPlan, + data: ParsedData, +): { id: string; label: string; data: unknown }[] { + const tables: FlatTables = { + flat_enrollments: buildFlatEnrollments(data) as unknown as FlatRow[], + flat_residents: buildFlatResidents(data) as unknown as FlatRow[], + flat_sessions: buildFlatSessions(data) as unknown as FlatRow[], + }; + + return plan.data_requests.map(req => { + try { + return executeRequest(req, tables); + } catch { + return { id: req.id, label: req.label, data: { error: "Computation failed — check field names and filter values." } }; + } + }); +} + +// Expose flat table builders for downstream use (e.g. size checks). +export { buildFlatEnrollments, buildFlatResidents, buildFlatSessions }; +export type { FlatEnrollment, FlatResident, FlatSession }; diff --git a/src/chat/contextPacket.ts b/src/chat/contextPacket.ts new file mode 100644 index 0000000..1a01799 --- /dev/null +++ b/src/chat/contextPacket.ts @@ -0,0 +1,81 @@ +import type { ParsedData, MetricSnapshot, ContextPacket, ContextPacketMetric, DataPlan } from "../types"; +import { executeDataPlan } from "./aggregator"; + +const GLOSSARY: Record = { + completion_rate: "Completed enrollments ÷ total enrollments (consistent denominator per request).", + never_engaged: "A resident with no DOC program enrollment, no UL enrollment, and no UL platform session.", + near_release: "A resident with fewer than 24 months to projected release date.", + lsiBand: "Level of Service Inventory risk band: Low | Moderate | High | Maximum.", +}; + +export function buildContextPacket( + plan: DataPlan, + data: ParsedData, + snapshot: MetricSnapshot | null, + question: string, +): ContextPacket { + const results = executeDataPlan(plan, data); + + function isEmptyResult(d: unknown): boolean { + if (d === null || d === undefined) return true; + if (Array.isArray(d)) return d.length === 0; + if (typeof d === "object") { + return Object.values(d as Record).every(v => v === null || v === undefined); + } + return false; + } + + const metrics: ContextPacketMetric[] = []; + const emptyMetricLabels: string[] = []; + for (const r of results) { + if (isEmptyResult(r.data)) { + emptyMetricLabels.push(r.label); + } else { + metrics.push({ metric_id: r.id, label: r.label, data: r.data }); + } + } + + const dataGaps: string[] = []; + if (emptyMetricLabels.length > 0) { + dataGaps.push( + `No data returned for: ${emptyMetricLabels.join("; ")}. ` + + `Filters may be too specific or the source data has no matching records.`, + ); + } + const needsEnrollments = plan.data_requests.some(r => r.table === "flat_enrollments"); + const needsResidents = plan.data_requests.some(r => r.table === "flat_residents"); + const needsSessions = plan.data_requests.some(r => r.table === "flat_sessions"); + + if (needsEnrollments && data.enrollments.length === 0 && data.ulEnrollments.length === 0) { + dataGaps.push("No enrollment data — doc_programs and UnlockEd enrollments are both empty."); + } + if (needsResidents && data.residents.length === 0) { + dataGaps.push("No resident roster — doc_residents is not loaded."); + } + if (needsSessions && data.sessions.length === 0) { + dataGaps.push("No session data — user_session_tracking is not loaded."); + } + + // Warn about UL demographic gaps when the plan groups/filters on demographics + const demographicFields = new Set(["lsiBand", "custodyLevel", "educationLevel", "offenseCategory", "gender"]); + const usesDemographics = plan.data_requests.some(r => + r.groupBy?.some(f => demographicFields.has(f)) || + r.filters?.some(f => demographicFields.has(f.field)) + ); + if (usesDemographics && data.ulEnrollments.length > 0) { + dataGaps.push( + "UL (UnlockEd) enrollments have no resident demographics; LSI/custody/education breakdowns cover DOC program enrollments only.", + ); + } + + return { + snapshot_id: snapshot?.id ?? "unknown", + as_of_date: snapshot?.as_of_date ?? new Date().toISOString().slice(0, 10), + question, + filters: plan.filters, + metrics, + data_gaps: dataGaps, + definitions: GLOSSARY, + router_confidence: plan.confidence, + }; +} diff --git a/src/chat/fetchWithRetry.ts b/src/chat/fetchWithRetry.ts new file mode 100644 index 0000000..b7af509 --- /dev/null +++ b/src/chat/fetchWithRetry.ts @@ -0,0 +1,27 @@ +import LLM_CONFIG from "../config/llm.json"; + +const RETRYABLE_CODES = LLM_CONFIG.retry.retryableCodes; + +export async function fetchWithRetry( + url: string, + init: RequestInit, + maxAttempts = LLM_CONFIG.retry.maxAttempts, +): Promise { + if (maxAttempts < 1) throw new Error("fetchWithRetry: maxAttempts must be ≥ 1"); + let res!: Response; + for (let attempt = 0; attempt < maxAttempts; attempt++) { + if (attempt > 0) { + await new Promise(r => setTimeout(r, LLM_CONFIG.retry.baseDelayMs * 2 ** (attempt - 1))); + } + try { + res = await fetch(url, init); + } catch { + if (url.startsWith("http://localhost") || url.startsWith("http://127.0.0.1")) { + throw new Error("Could not connect to Ollama. Make sure Ollama is running (`ollama serve`)."); + } + throw new Error("Network error: could not reach the AI provider. Check your internet connection."); + } + if (!RETRYABLE_CODES.includes(res.status)) return res; + } + return res; +} diff --git a/src/chat/flatTables.ts b/src/chat/flatTables.ts new file mode 100644 index 0000000..5767ca5 --- /dev/null +++ b/src/chat/flatTables.ts @@ -0,0 +1,89 @@ +import type { ParsedData, FlatEnrollment, FlatResident, FlatSession } from "../types"; + +function toYYYYMM(date: Date | null | undefined): string | null { + if (!date) return null; + if (isNaN(date.getTime())) return null; + return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}`; +} + +export function buildFlatEnrollments(data: ParsedData): FlatEnrollment[] { + // Resident lookup by DOC ID, used to join demographics onto DOC-source enrollments. + const residentById = new Map(data.residents.map(r => [r.id, r])); + const results: FlatEnrollment[] = []; + + for (const e of data.enrollments) { + const res = residentById.get(e.userId); + results.push({ + enrollmentId: e.enrollmentId, + facilityCode: e.facilityCode, + programName: e.programName, + programType: e.programType, + status: e.status, + source: "doc", + lsiBand: res?.lsiBand ?? null, + custodyLevel: res?.custodyLevel ?? null, + educationLevel: res?.educationLevel ?? null, + offenseCategory: res?.offenseCategory ?? null, + gender: res?.gender ?? null, + enrolledMonth: toYYYYMM(e.enrolledDate), + completionMonth: toYYYYMM(e.completionDate), + }); + } + + // UL enrollments cannot be joined to residents (no shared key in ParsedData). + for (const e of data.ulEnrollments) { + results.push({ + enrollmentId: e.enrollmentId, + facilityCode: e.facilityCode, + programName: e.programName, + programType: e.programType, + status: e.status, + source: "ul", + lsiBand: null, + custodyLevel: null, + educationLevel: null, + offenseCategory: null, + gender: null, + enrolledMonth: toYYYYMM(e.enrolledDate), + completionMonth: toYYYYMM(e.completionDate), + }); + } + + return results; +} + +export function buildFlatResidents(data: ParsedData): FlatResident[] { + const enrolledIds = new Set(data.enrollments.map(e => e.userId)); + const completedIds = new Set( + data.enrollments.filter(e => e.status === "Completed").map(e => e.userId), + ); + const activeCountById = new Map(); + for (const e of data.enrollments) { + if (e.status === "Active") { + activeCountById.set(e.userId, (activeCountById.get(e.userId) ?? 0) + 1); + } + } + + return data.residents.map(r => ({ + id: r.id, + facilityCode: r.facilityCode, + lsiBand: r.lsiBand, + custodyLevel: r.custodyLevel, + educationLevel: r.educationLevel, + offenseCategory: r.offenseCategory, + gender: r.gender, + monthsToRelease: r.monthsToRelease, + anyEnrollment: enrolledIds.has(r.id), + anyCompletion: completedIds.has(r.id), + activePrograms: activeCountById.get(r.id) ?? 0, + })); +} + +export function buildFlatSessions(data: ParsedData): FlatSession[] { + return data.sessions + .map(s => ({ + sessionMonth: s.session_date?.slice(0, 7) ?? "", + durationMinutes: parseFloat(s.duration_minutes) || 0, + })) + .filter(s => s.sessionMonth.length === 7); +} diff --git a/src/chat/prompts.ts b/src/chat/prompts.ts new file mode 100644 index 0000000..70aa706 --- /dev/null +++ b/src/chat/prompts.ts @@ -0,0 +1,360 @@ +import type { ContextPacket } from "../types"; + +// ─── Planner ───────────────────────────────────────────────────────────────── + +export const PLANNER_SYSTEM_INSTRUCTION = `You are a data planner for the MAINE DOC · INSIGHT analytics dashboard. +Your job is to translate a user question into a DataPlan — a set of structured data requests that, when executed against the dashboard's raw data, will produce the information needed to answer the question. + +DATA SCHEMA: + +flat_enrollments — one row per program enrollment + Grouping / filter fields: + facilityCode string e.g. SMWRC, MVCF, MCF, MMF, PCCF, MCCI, CCCF, PCCC + programName string exact program name (e.g. "Adult Basic Education") + programType string Education | Vocational | Behavioral | Reentry | Other + status string Active | Waitlisted | Completed | Dropped + source string doc (DOC programs) | ul (UnlockEd platform) + lsiBand string Low | Moderate | High | Maximum (null for UL-only enrollments) + custodyLevel string resident custody level (null for UL-only) + educationLevel string resident's highest education level (null for UL-only) + offenseCategory string offense category (null for UL-only) + gender string (null for UL-only) + enrolledMonth string YYYY-MM (null if unknown) + completionMonth string YYYY-MM (null if unknown) + +flat_residents — one row per resident + Fields: + facilityCode string + lsiBand string Low | Moderate | High | Maximum + custodyLevel string + educationLevel string + offenseCategory string + gender string + monthsToRelease number months until projected release (null if unknown) + anyEnrollment boolean true if resident has any DOC program enrollment + anyCompletion boolean true if resident has completed at least one program + activePrograms number count of currently active enrollments + +flat_sessions — one row per platform session (UnlockEd; no facility breakdown available) + Fields: + sessionMonth string YYYY-MM + durationMinutes number session length in minutes + +COMPUTE FUNCTIONS: + count no field required — counts rows in group + rate requires rateField + rateValue — proportion where rateField == rateValue + mean requires field — arithmetic mean of a numeric field + sum requires field — total of a numeric field + distinctCount requires field — number of distinct values + median requires field — median of a numeric field + +FILTER OPS: + eq / neq equals / not equals; value: string + in value is JSON-stringified array, e.g. '["Active","Completed"]' + notNull field is not null; no value needed + isNull field is null; no value needed + gt lt gte lte numeric comparison; value: number as string (e.g. "24") + +OUTPUT FORMAT (valid JSON only, no prose, no markdown): +{ + "data_requests": [ + { + "id": string, // short camelCase name, e.g. "completionByFacility" + "label": string, // human-readable description shown to the writer + "table": string, // flat_enrollments | flat_residents | flat_sessions + "filters": [{ "field": string, "op": string, "value": string }], + "groupBy": [string], // omit for statewide / ungrouped aggregates + "compute": [ + { + "alias": string, + "fn": string, + "field": string, // for mean/sum/distinctCount/median + "rateField": string, // for rate + "rateValue": string // for rate + } + ], + "limit": number, // optional + "sortBy": string, // optional result column to sort by + "sortDir": "asc" | "desc" + } + ], + "filters": { "facility": string|null, "program": string|null }, + "confidence": number, + "refusal_reason": string|null, + "nearest_hints": string[] +} + +HARD REFUSALS — return data_requests: [], confidence: 0: + - Questions about individual residents by name or DOC number + - Questions asking for post-release outcomes (employment, housing, recidivism) + - Questions asking to predict or forecast outcomes not in the data + +CONFIDENCE: + 0.9–1.0 data directly and fully answers the question + 0.6–0.89 data partially answers it (e.g. wrong time window, demographic data missing for UL enrollments) + < 0.6 cannot answer; set refusal_reason and populate nearest_hints with 2–3 things the data CAN show + +GRANULARITY RULES: + - Include only the groupBy dimensions the question explicitly asks for + - "Overall" / "statewide" questions → no groupBy + - Cap group-by-programName results at limit: 20 (many programs produce long lists) + - Cross-tabulations (e.g. facilityCode × lsiBand) are fine when the question asks for them + - Note: lsiBand / custodyLevel / educationLevel are only available for doc-source enrollments; + include a filter source: eq "doc" when those fields are part of the analysis + +DATA AVAILABILITY NOTE: + - flat_enrollments joins DOC program participation with resident demographics; UL enrollments have null demographics + - flat_sessions has no facilityCode — statewide session counts only + - "Engagement" means program enrollment and participation (anyEnrollment, activePrograms, status in + flat_residents / flat_enrollments). Use flat_sessions only when a question explicitly asks about + UnlockEd platform usage or time-on-platform. flat_sessions is often not loaded — prefer flat_residents + and flat_enrollments for engagement questions. + - Facility names in questions may not match facility codes exactly (e.g. "Maine State Prison" may refer + to MCF, MMF, or another code). When a facility name is ambiguous, run a statewide query with + facilityCode as a groupBy dimension rather than filtering by an unrecognised code. + +EXAMPLES: + +Q: "What are the completion rates by facility?" +→ { + "data_requests": [{ + "id": "completionByFacility", + "label": "Completion rate by facility", + "table": "flat_enrollments", + "filters": [], + "groupBy": ["facilityCode"], + "compute": [ + {"alias": "total", "fn": "count"}, + {"alias": "completionRate", "fn": "rate", "rateField": "status", "rateValue": "Completed"} + ], + "sortBy": "completionRate", "sortDir": "desc" + }], + "filters": {"facility": null, "program": null}, + "confidence": 0.95, "refusal_reason": null, "nearest_hints": [] + } + +Q: "How many High/Maximum LSI residents at MVCF aren't in any program?" +→ { + "data_requests": [{ + "id": "unenrolledHighLsi", + "label": "High and Maximum LSI residents at MVCF with no enrollment", + "table": "flat_residents", + "filters": [ + {"field": "facilityCode", "op": "eq", "value": "MVCF"}, + {"field": "lsiBand", "op": "in", "value": "[\"High\",\"Maximum\"]"}, + {"field": "anyEnrollment", "op": "eq", "value": "false"} + ], + "groupBy": ["lsiBand"], + "compute": [{"alias": "count", "fn": "count"}] + }], + "filters": {"facility": "MVCF", "program": null}, + "confidence": 0.9, "refusal_reason": null, "nearest_hints": [] + } + +Q: "Completion rate by LSI band for education programs (DOC data only)" +→ { + "data_requests": [{ + "id": "completionByLsi", + "label": "Completion rate by LSI band (education programs, DOC source)", + "table": "flat_enrollments", + "filters": [ + {"field": "programType", "op": "eq", "value": "Education"}, + {"field": "source", "op": "eq", "value": "doc"} + ], + "groupBy": ["lsiBand"], + "compute": [ + {"alias": "total", "fn": "count"}, + {"alias": "completionRate", "fn": "rate", "rateField": "status", "rateValue": "Completed"} + ], + "sortBy": "lsiBand", "sortDir": "asc" + }], + "filters": {"facility": null, "program": null}, + "confidence": 0.95, "refusal_reason": null, "nearest_hints": [] + } + +Q: "How can we improve Maine state prison engagement?" +→ { + "data_requests": [ + { + "id": "engagementByFacility", + "label": "Resident engagement rates by facility", + "table": "flat_residents", + "filters": [], + "groupBy": ["facilityCode"], + "compute": [ + {"alias": "total", "fn": "count"}, + {"alias": "anyEnrollmentRate", "fn": "rate", "rateField": "anyEnrollment", "rateValue": "true"}, + {"alias": "anyCompletionRate", "fn": "rate", "rateField": "anyCompletion", "rateValue": "true"} + ], + "sortBy": "anyEnrollmentRate", "sortDir": "asc" + }, + { + "id": "neverEngagedByFacility", + "label": "Never-engaged count by facility", + "table": "flat_residents", + "filters": [ + {"field": "anyEnrollment", "op": "eq", "value": "false"} + ], + "groupBy": ["facilityCode"], + "compute": [{"alias": "count", "fn": "count"}], + "sortBy": "count", "sortDir": "desc" + }, + { + "id": "enrollmentStatusBreakdown", + "label": "Enrollment status breakdown statewide", + "table": "flat_enrollments", + "filters": [], + "groupBy": ["status"], + "compute": [{"alias": "count", "fn": "count"}] + } + ], + "filters": {"facility": null, "program": null}, + "confidence": 0.85, "refusal_reason": null, "nearest_hints": [] + } + +Q: "Show me John Smith's progress" +→ { + "data_requests": [], + "filters": {}, + "confidence": 0, + "refusal_reason": "Individual resident lookups are not supported — only aggregate metrics are available.", + "nearest_hints": ["Completion rates by facility", "Resident engagement tiers statewide", "Never-enrolled counts by LSI band"] + }`; + +export function buildPlannerUserTurn( + question: string, + hintLabels: string[] = [], + dataEnums?: Record, +): string { + const hintsText = hintLabels.length > 0 + ? `CONTEXT HINTS (user was viewing a section about these topics — prefer data that covers them when relevant):\n${hintLabels.join(", ")}\n\n` + : ""; + + let vocabText = ""; + if (dataEnums && Object.keys(dataEnums).length > 0) { + const lines = Object.entries(dataEnums) + .filter(([, vals]) => vals.length > 0) + .map(([key, vals]) => ` ${key}: ${vals.join(", ")}`); + if (lines.length > 0) { + vocabText = `LIVE VOCABULARY (use these exact values in filters — do not use values not on these lists):\n${lines.join("\n")}\n\n`; + } + } + + return `${vocabText}${hintsText}USER QUESTION: "${question}"`; +} + +// ─── Writer ────────────────────────────────────────────────────────────────── + +export const WRITER_SYSTEM_INSTRUCTION = `You are an analyst writing an insight narrative for Maine DOC education program managers. + +RULES: + +1. SOURCE OF TRUTH: + - Answer only from the metric data provided. Do not introduce facts, baselines, + or comparisons not present in the data. + - Domain vocabulary from the business definitions is fine; outside benchmarks + are not. + +2. CITATIONS: + - Cite every number in square brackets: [metric_id: value]. + - For nested values, use dot notation: [program_completion_rate.ABE: 13.6%]. + - For counts, include the unit: [engagement_tiers.high: 14 users]. + - For trends, cite both endpoints: [monthly_active.jun_2025: 30 users] to + [monthly_active.feb_2026: 5 users]. + +3. PREMISE CHECK: + - If the question assumes a direction the data contradicts (e.g., "why is + engagement up?" when data shows decline), state the correct direction + in the first sentence before answering. + +4. SMALL SAMPLES: + - If a metric value is based on N < 5 users or N < 10 events, describe it + as "limited sample" or "based on N=X" rather than presenting it as a + stable rate. Do not extrapolate from small samples. + +5. CAVEATS: + - If a metric carries a caveat (e.g., unit unconfirmed, batch-timestamp + artifact, process-related zero), surface it in the narrative when it + materially affects interpretation. + +6. UNCERTAINTY: + - If ROUTER CONFIDENCE < 0.7, hedge the framing ("the closest available + metric suggests…") and note what would answer the question more directly. + - If AS OF is more than 60 days before today and the question asks about + "now" / "currently" / "this month," note the staleness. + +7. PRIVACY: + - Never name individual residents. Never use DOC numbers. Aggregates only. + - If any reported count is < 5, say "fewer than 5" rather than the exact + number. + +8. LENGTH AND TONE: + - 2–4 sentences. Plain language for a program manager, not a statistician. + - Lead with the most important finding. + - End with one actionable implication only when the data supports a clear + next step. Skip the implication for single-number lookups or when the + finding is purely descriptive. + +9. EMPTY-METRICS BRANCH (rules 8 and the implication requirement are waived): + - If metrics[] is empty, do not compose a narrative. + - List the data gaps and explain which source files would need to be + loaded to answer the question. + - One short paragraph, no citations needed. + +CITATION FORMAT EXAMPLES: + +Single value: +"Completion rates vary sharply by program type [completion_by_program_type.mental_health: 76.5%] versus [completion_by_program_type.vocational: 0%]." + +Trend: +"Active users peaked at [monthly_active.jun_2025: 30] and fell to [monthly_active.feb_2026: 5] over eight months." + +Small sample: +"Anger Management shows the highest rate [completion.anger_management: 76.5%], though based on a limited sample of 14 enrollees." + +With caveat: +"Financial Literacy attendance is logged but shows [attendance.financial_literacy.present_rate: 0%], which the data team has flagged as a process issue rather than actual non-attendance." + +Premise correction: +"Engagement has actually declined, not grown — active users dropped from [monthly_active.jun_2025: 30] to [monthly_active.feb_2026: 5]. The most recent uptick is concentrated in a single January cohort." + +Empty metrics: +"The available metrics do not cover post-release employment. Answering this would require loading post-release outcome data (employment status, wage records) which is not currently in the platform export."`; + +export function buildWriterUserTurn(packet: ContextPacket): string { + const metricsText = packet.metrics + .map(m => { + const caveatsText = m.caveats && m.caveats.length > 0 + ? `\nCAVEATS: ${m.caveats.join("; ")}` + : ""; + return `### ${m.label} (${m.metric_id})\n${JSON.stringify(m.data, null, 2)}${caveatsText}`; + }) + .join("\n\n"); + + const definitionsText = Object.entries(packet.definitions) + .map(([k, v]) => `- **${k}:** ${v}`) + .join("\n"); + + const gapsText = packet.data_gaps.length > 0 + ? `\n\nDATA GAPS (acknowledge these; do not invent values for them):\n${packet.data_gaps.join("\n")}` + : ""; + + const filterText = Object.keys(packet.filters).length > 0 + ? `\nFOCUS: The user is asking specifically about: ${JSON.stringify(packet.filters)}. Prioritise that slice.\n` + : ""; + + const confidenceText = packet.router_confidence !== undefined + ? `ROUTER CONFIDENCE: ${packet.router_confidence}\n` + : ""; + + return `SNAPSHOT: ${packet.snapshot_id} | AS OF: ${packet.as_of_date} +${confidenceText}${filterText} +QUESTION: "${packet.question}" + +AVAILABLE METRICS: +${metricsText} +${gapsText} + +BUSINESS DEFINITIONS: +${definitionsText}`; +} \ No newline at end of file diff --git a/src/chat/providers.ts b/src/chat/providers.ts new file mode 100644 index 0000000..7099a70 --- /dev/null +++ b/src/chat/providers.ts @@ -0,0 +1,47 @@ +import PROVIDER_MODELS from "../config/models.json"; + +export type LLMProvider = "gemini" | "openai" | "claude" | "ollama"; + +export interface LLMConfig { + provider: LLMProvider; + apiKey: string; + model?: string; +} + +export interface ProviderInfo { + label: string; + models: string[]; + keyPlaceholder: string; + keyHint: string; +} + +export const PROVIDER_INFO: Record = { + gemini: { + label: "Google Gemini", + models: PROVIDER_MODELS.gemini, + keyPlaceholder: "AIza…", + keyHint: "aistudio.google.com", + }, + openai: { + label: "OpenAI", + models: PROVIDER_MODELS.openai, + keyPlaceholder: "sk-…", + keyHint: "platform.openai.com/api-keys", + }, + claude: { + label: "Anthropic Claude", + models: PROVIDER_MODELS.claude, + keyPlaceholder: "sk-ant-…", + keyHint: "console.anthropic.com", + }, + ollama: { + label: "Ollama (local)", + models: PROVIDER_MODELS.ollama, + keyPlaceholder: "", + keyHint: "ollama.ai", + }, +}; + +export function resolveModel(config: LLMConfig): string { + return config.model ?? PROVIDER_INFO[config.provider].models[0]; +} diff --git a/src/chat/refusal.ts b/src/chat/refusal.ts new file mode 100644 index 0000000..7c9bb69 --- /dev/null +++ b/src/chat/refusal.ts @@ -0,0 +1,29 @@ +import type { DataPlan, ChatMessage } from "../types"; + +export function buildRefusalMessage( + plan: DataPlan, + snapshotId: string, +): ChatMessage { + const lines: string[] = []; + + if (plan.refusal_reason) { + lines.push(`I can't answer that from the available data: **${plan.refusal_reason}**`); + } else { + lines.push("I don't have a way to compute what you're asking with the available data."); + } + + if (plan.nearest_hints && plan.nearest_hints.length > 0) { + lines.push("\nYou might try asking about:"); + plan.nearest_hints.forEach(h => lines.push(`- ${h}`)); + } + + return { + id: crypto.randomUUID(), + role: "assistant", + content: lines.join("\n"), + snapshot_id: snapshotId, + is_refusal: true, + nearest_metrics: [], + timestamp: new Date().toISOString(), + }; +} diff --git a/src/chat/router.ts b/src/chat/router.ts new file mode 100644 index 0000000..09664a1 --- /dev/null +++ b/src/chat/router.ts @@ -0,0 +1,280 @@ +import type { DataPlan, ConversationTurn } from "../types"; +import type { LLMConfig } from "./providers"; +import { resolveModel } from "./providers"; +import { fetchWithRetry } from "./fetchWithRetry"; +import { PLANNER_SYSTEM_INSTRUCTION, buildPlannerUserTurn } from "./prompts"; +import LLM_CONFIG from "../config/llm.json"; + +// Gemini structured output schema for DataPlan. +// Gemini doesn't support additionalProperties or union types in responseSchema, +// so filter values are always strings; the aggregator coerces them as needed. +const PLANNER_RESPONSE_SCHEMA = { + type: "object", + properties: { + data_requests: { + type: "array", + items: { + type: "object", + properties: { + id: { type: "string" }, + label: { type: "string" }, + table: { type: "string" }, + filters: { + type: "array", + items: { + type: "object", + properties: { + field: { type: "string" }, + op: { type: "string" }, + value: { type: "string" }, + }, + required: ["field", "op"], + }, + }, + groupBy: { type: "array", items: { type: "string" } }, + compute: { + type: "array", + items: { + type: "object", + properties: { + alias: { type: "string" }, + fn: { type: "string" }, + field: { type: "string" }, + rateField: { type: "string" }, + rateValue: { type: "string" }, + }, + required: ["alias", "fn"], + }, + }, + limit: { type: "number" }, + sortBy: { type: "string" }, + sortDir: { type: "string" }, + }, + required: ["id", "label", "table", "compute"], + }, + }, + filters: { + type: "object", + properties: { + facility: { type: "string" }, + program: { type: "string" }, + }, + }, + confidence: { type: "number" }, + refusal_reason: { type: "string" }, + nearest_hints: { type: "array", items: { type: "string" } }, + }, + required: ["data_requests", "filters", "confidence"], +}; + +function normalizePlan(raw: Partial): DataPlan { + return { + data_requests: raw.data_requests ?? [], + filters: raw.filters ?? {}, + confidence: raw.confidence ?? 0, + refusal_reason: raw.refusal_reason, + nearest_hints: raw.nearest_hints, + }; +} + +async function callPlannerGemini( + question: string, + config: LLMConfig, + hintLabels: string[], + history: ConversationTurn[], + dataEnums?: Record, +): Promise { + const model = resolveModel(config); + const historyContents = history.map(h => ({ + role: h.role === "assistant" ? "model" : "user", + parts: [{ text: h.content }], + })); + const response = await fetchWithRetry( + `${LLM_CONFIG.endpoints.geminiBase}/${model}:generateContent?key=${config.apiKey}`, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + systemInstruction: { parts: [{ text: PLANNER_SYSTEM_INSTRUCTION }] }, + contents: [ + ...historyContents, + { role: "user", parts: [{ text: buildPlannerUserTurn(question, hintLabels, dataEnums) }] }, + ], + generationConfig: { + responseMimeType: "application/json", + responseSchema: PLANNER_RESPONSE_SCHEMA, + temperature: LLM_CONFIG.params.planner.temperature, + }, + }), + } + ); + + if (!response.ok) { + if (response.status === 503) throw new Error("The AI model is currently overloaded. Please wait a moment and try again."); + throw new Error(`Planner ${response.status}: ${await response.text()}`); + } + const body = await response.json(); + const text: string = body.candidates?.[0]?.content?.parts?.[0]?.text; + if (!text) throw new Error("Planner returned empty response"); + return normalizePlan(JSON.parse(text)); +} + +async function callPlannerOpenAI( + question: string, + config: LLMConfig, + hintLabels: string[], + history: ConversationTurn[], + dataEnums?: Record, +): Promise { + const sysInstruction = PLANNER_SYSTEM_INSTRUCTION + + "\n\nRespond ONLY with a valid JSON object. No explanation, markdown, or other text."; + + const response = await fetchWithRetry( + LLM_CONFIG.endpoints.openai, + { + method: "POST", + headers: { "Content-Type": "application/json", "Authorization": `Bearer ${config.apiKey}` }, + body: JSON.stringify({ + model: resolveModel(config), + messages: [ + { role: "system", content: sysInstruction }, + ...history.map(h => ({ role: h.role, content: h.content })), + { role: "user", content: buildPlannerUserTurn(question, hintLabels, dataEnums) }, + ], + response_format: { type: "json_object" }, + temperature: LLM_CONFIG.params.planner.temperature, + }), + } + ); + + if (!response.ok) { + if (response.status === 503) throw new Error("The AI model is currently overloaded. Please wait a moment and try again."); + throw new Error(`Planner ${response.status}: ${await response.text()}`); + } + const body = await response.json(); + const text: string = body.choices?.[0]?.message?.content; + if (!text) throw new Error("Planner returned empty response"); + return normalizePlan(JSON.parse(text)); +} + +async function callPlannerClaude( + question: string, + config: LLMConfig, + hintLabels: string[], + history: ConversationTurn[], + dataEnums?: Record, +): Promise { + const sysInstruction = PLANNER_SYSTEM_INSTRUCTION + + "\n\nOutput ONLY a valid JSON object. No explanation, markdown, or other text."; + + const response = await fetchWithRetry( + LLM_CONFIG.endpoints.claude, + { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-api-key": config.apiKey, + "anthropic-version": LLM_CONFIG.anthropicVersion, + }, + body: JSON.stringify({ + model: resolveModel(config), + system: sysInstruction, + messages: [ + ...history.map(h => ({ role: h.role, content: h.content })), + { role: "user", content: buildPlannerUserTurn(question, hintLabels, dataEnums) }, + ], + max_tokens: LLM_CONFIG.params.planner.maxTokens, + temperature: LLM_CONFIG.params.planner.temperature, + }), + } + ); + + if (!response.ok) { + if (response.status === 503) throw new Error("The AI model is currently overloaded. Please wait a moment and try again."); + throw new Error(`Planner ${response.status}: ${await response.text()}`); + } + const body = await response.json(); + const text: string = body.content?.[0]?.text ?? ""; + if (!text) throw new Error("Planner returned empty response"); + + // Extract JSON object even if wrapped in code fences + const jsonMatch = text.match(/```json\s*([\s\S]*?)```/) ?? text.match(/(\{[\s\S]*\})/); + if (!jsonMatch) throw new Error("Planner response contained no valid JSON"); + return normalizePlan(JSON.parse(jsonMatch[1])); +} + +async function callPlannerOllama( + question: string, + config: LLMConfig, + hintLabels: string[], + history: ConversationTurn[], + dataEnums?: Record, +): Promise { + const sysInstruction = PLANNER_SYSTEM_INSTRUCTION + + "\n\nRespond ONLY with a valid JSON object. No explanation, markdown, or other text."; + + for (let attempt = 0; attempt < 2; attempt++) { + const suffix = attempt > 0 + ? "\n\nIMPORTANT: Your previous response was not valid JSON. Respond ONLY with the JSON object, no other text." + : ""; + const userTurn = buildPlannerUserTurn(question, hintLabels, dataEnums) + suffix; + + const response = await fetchWithRetry( + LLM_CONFIG.endpoints.ollama, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + model: resolveModel(config), + messages: [ + { role: "system", content: sysInstruction }, + ...history.map(h => ({ role: h.role, content: h.content })), + { role: "user", content: userTurn }, + ], + format: "json", + temperature: LLM_CONFIG.params.planner.temperature, + stream: false, + }), + } + ); + + if (!response.ok) { + if (response.status === 404) { + throw new Error(`Ollama model not found. Run: ollama pull ${resolveModel(config)}`); + } + throw new Error(`Planner ${response.status}: ${await response.text()}`); + } + + const body = await response.json(); + const text: string = body.choices?.[0]?.message?.content ?? ""; + if (!text) throw new Error("Planner returned empty response"); + + try { + const jsonMatch = text.match(/```json\s*([\s\S]*?)```/) ?? text.match(/(\{[\s\S]*\})/); + const jsonText = jsonMatch ? jsonMatch[1] : text; + return normalizePlan(JSON.parse(jsonText)); + } catch { + // fall through to retry + } + } + + throw new Error( + `The local model returned malformed output twice. Try a larger model (e.g. \`ollama pull qwen2.5:14b\`) or rephrase your question.` + ); +} + + +export async function callRouter( + question: string, + config: LLMConfig, + hintLabels: string[] = [], + history: ConversationTurn[] = [], + dataEnums?: Record, +): Promise { + switch (config.provider) { + case "gemini": return callPlannerGemini(question, config, hintLabels, history, dataEnums); + case "openai": return callPlannerOpenAI(question, config, hintLabels, history, dataEnums); + case "claude": return callPlannerClaude(question, config, hintLabels, history, dataEnums); + case "ollama": return callPlannerOllama(question, config, hintLabels, history, dataEnums); + } +} diff --git a/src/chat/writer.ts b/src/chat/writer.ts new file mode 100644 index 0000000..6294399 --- /dev/null +++ b/src/chat/writer.ts @@ -0,0 +1,209 @@ +import type { ContextPacket, ConversationTurn } from "../types"; +import type { LLMConfig } from "./providers"; +import { resolveModel } from "./providers"; +import { fetchWithRetry } from "./fetchWithRetry"; +import { WRITER_SYSTEM_INSTRUCTION, buildWriterUserTurn } from "./prompts"; +import LLM_CONFIG from "../config/llm.json"; + +function extractNumbers(text: string): string[] { + return (text.match(/\b\d+(?:\.\d+)?/g) ?? []).filter(n => parseFloat(n) > 0); +} + +function validateCitations( + response: string, + packet: ContextPacket, +): { citationWarning?: string } { + const responseNums = extractNumbers(response); + const contextText = JSON.stringify(packet.metrics); + const contextNums = new Set(extractNumbers(contextText)); + + // Expand context numbers to include percentage-scaled equivalents of decimals (e.g. 0.821 → "82.1") + // to avoid false positives when the LLM renders a stored rate as a percentage. + const expandedContextNums = new Set(contextNums); + for (const n of contextNums) { + const v = parseFloat(n); + if (v > 0 && v < 1) expandedContextNums.add(String(Math.round(v * 1000) / 10)); + } + + // Heuristic: allow small whole numbers ≤ 10 without validation (counts, dates, etc.) + const suspect = responseNums.filter(n => parseFloat(n) > 10 && !expandedContextNums.has(n)); + + if (suspect.length === 0) return {}; + return { + citationWarning: + `Note: some numbers in this response (${suspect.slice(0, 3).join(", ")}…) were not found in the metric data. Treat with caution.`, + }; +} + +async function callWriterGemini( + packet: ContextPacket, + apiKey: string, + model: string, + history: ConversationTurn[], +): Promise<{ content: string; citationWarning?: string }> { + const historyContents = history.map(h => ({ + role: h.role === "assistant" ? "model" : "user", + parts: [{ text: h.content }], + })); + const response = await fetchWithRetry( + `${LLM_CONFIG.endpoints.geminiBase}/${model}:generateContent?key=${apiKey}`, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + systemInstruction: { parts: [{ text: WRITER_SYSTEM_INSTRUCTION }] }, + contents: [ + ...historyContents, + { role: "user", parts: [{ text: buildWriterUserTurn(packet) }] }, + ], + generationConfig: { temperature: LLM_CONFIG.params.writer.temperature, maxOutputTokens: LLM_CONFIG.params.writer.maxOutputTokens }, + }), + } + ); + + if (!response.ok) { + if (response.status === 503) throw new Error("The AI model is currently overloaded. Please wait a moment and try again."); + throw new Error(`Writer ${response.status}: ${await response.text()}`); + } + + const body = await response.json(); + const content: string = body.candidates?.[0]?.content?.parts?.[0]?.text ?? ""; + if (!content) throw new Error("Writer returned empty response"); + + const { citationWarning } = validateCitations(content, packet); + return { content, citationWarning }; +} + +async function callWriterOpenAI( + packet: ContextPacket, + apiKey: string, + model: string, + history: ConversationTurn[], +): Promise<{ content: string; citationWarning?: string }> { + const response = await fetchWithRetry( + LLM_CONFIG.endpoints.openai, + { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${apiKey}`, + }, + body: JSON.stringify({ + model, + messages: [ + { role: "system", content: WRITER_SYSTEM_INSTRUCTION }, + ...history.map(h => ({ role: h.role, content: h.content })), + { role: "user", content: buildWriterUserTurn(packet) }, + ], + temperature: LLM_CONFIG.params.writer.temperature, + max_tokens: LLM_CONFIG.params.writer.maxTokens, + }), + } + ); + + if (!response.ok) { + if (response.status === 503) throw new Error("The AI model is currently overloaded. Please wait a moment and try again."); + throw new Error(`Writer ${response.status}: ${await response.text()}`); + } + + const body = await response.json(); + const content: string = body.choices?.[0]?.message?.content ?? ""; + if (!content) throw new Error("Writer returned empty response"); + + const { citationWarning } = validateCitations(content, packet); + return { content, citationWarning }; +} + +async function callWriterClaude( + packet: ContextPacket, + apiKey: string, + model: string, + history: ConversationTurn[], +): Promise<{ content: string; citationWarning?: string }> { + const response = await fetchWithRetry( + LLM_CONFIG.endpoints.claude, + { + method: "POST", + headers: { + "Content-Type": "application/json", + "x-api-key": apiKey, + "anthropic-version": LLM_CONFIG.anthropicVersion, + }, + body: JSON.stringify({ + model, + system: WRITER_SYSTEM_INSTRUCTION, + messages: [ + ...history.map(h => ({ role: h.role, content: h.content })), + { role: "user", content: buildWriterUserTurn(packet) }, + ], + temperature: LLM_CONFIG.params.writer.temperature, + max_tokens: LLM_CONFIG.params.writer.maxTokens, + }), + } + ); + + if (!response.ok) { + if (response.status === 503) throw new Error("The AI model is currently overloaded. Please wait a moment and try again."); + throw new Error(`Writer ${response.status}: ${await response.text()}`); + } + + const body = await response.json(); + const content: string = body.content?.[0]?.text ?? ""; + if (!content) throw new Error("Writer returned empty response"); + + const { citationWarning } = validateCitations(content, packet); + return { content, citationWarning }; +} + +async function callWriterOllama( + packet: ContextPacket, + model: string, + history: ConversationTurn[], +): Promise<{ content: string; citationWarning?: string }> { + const response = await fetchWithRetry( + LLM_CONFIG.endpoints.ollama, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + model, + messages: [ + { role: "system", content: WRITER_SYSTEM_INSTRUCTION }, + ...history.map(h => ({ role: h.role, content: h.content })), + { role: "user", content: buildWriterUserTurn(packet) }, + ], + temperature: LLM_CONFIG.params.writer.temperature, + stream: false, + }), + } + ); + + if (!response.ok) { + if (response.status === 404) { + throw new Error(`Ollama model not found. Run: ollama pull ${model}`); + } + throw new Error(`Writer ${response.status}: ${await response.text()}`); + } + + const body = await response.json(); + const content: string = body.choices?.[0]?.message?.content ?? ""; + if (!content) throw new Error("Writer returned empty response"); + + const { citationWarning } = validateCitations(content, packet); + return { content, citationWarning }; +} + + +export async function callWriter( + packet: ContextPacket, + config: LLMConfig, + history: ConversationTurn[] = [], +): Promise<{ content: string; citationWarning?: string }> { + const model = resolveModel(config); + switch (config.provider) { + case "gemini": return callWriterGemini(packet, config.apiKey, model, history); + case "openai": return callWriterOpenAI(packet, config.apiKey, model, history); + case "claude": return callWriterClaude(packet, config.apiKey, model, history); + case "ollama": return callWriterOllama(packet, model, history); + } +} diff --git a/src/components/ChartFootnote.tsx b/src/components/ChartFootnote.tsx new file mode 100644 index 0000000..c50def4 --- /dev/null +++ b/src/components/ChartFootnote.tsx @@ -0,0 +1,31 @@ +import { COLUMN_LABELS } from "../lib/dataQuality"; +import type { MetricQualityEntry } from "../types"; + +interface Props { + entry: MetricQualityEntry; +} + +export function ChartFootnote({ entry }: Props) { + const { effectiveN, totalN, blockingColumn } = entry; + + // Only render when we have a meaningful denominator and a gap exists + if (effectiveN == null || totalN == null || totalN === 0) return null; + if (effectiveN === totalN) return null; + + const label = blockingColumn ? COLUMN_LABELS[blockingColumn] : "complete data"; + const fieldPhrase = blockingColumn ? `known ${label}` : label; + + return ( +
+ Based on {effectiveN.toLocaleString()} of {totalN.toLocaleString()} residents with {fieldPhrase}. +
+ ); +} diff --git a/src/components/DataQualityBanner.tsx b/src/components/DataQualityBanner.tsx new file mode 100644 index 0000000..a66b7a9 --- /dev/null +++ b/src/components/DataQualityBanner.tsx @@ -0,0 +1,53 @@ +import { COLUMN_LABELS } from "../lib/dataQuality"; +import type { MetricQualityEntry } from "../types"; + +interface Props { + entry: MetricQualityEntry; +} + +function buildMessage(entry: MetricQualityEntry): string { + const { blockingColumn, missingPct, effectiveN, totalN } = entry; + if (!blockingColumn) return "Results may be incomplete due to missing data."; + + const label = COLUMN_LABELS[blockingColumn]; + const pct = Math.round((missingPct ?? 0) * 100); + + // Use exact counts when available; fall back to percentage-derived approximation + const missingCount = (totalN != null && effectiveN != null) + ? totalN - effectiveN + : null; + const countPhrase = missingCount != null + ? `${missingCount} of ${totalN} residents` + : `~${pct}% of residents`; + + if (pct >= 20) { + return `Treat as a directional estimate — ${label} is missing for ${countPhrase} (${pct}%). This is a notable gap that may skew results.`; + } + if (pct >= 10) { + return `Results may be incomplete — ${label} is missing for ${countPhrase} (${pct}%). Use with caution.`; + } + return `Results cover most residents — ${label} is missing for ${countPhrase} (${pct}%). The ${100 - pct}% with data are shown.`; +} + +export function DataQualityBanner({ entry }: Props) { + return ( +
+ + {buildMessage(entry)} +
+ ); +} diff --git a/src/components/DataUnavailableCard.tsx b/src/components/DataUnavailableCard.tsx new file mode 100644 index 0000000..99e9098 --- /dev/null +++ b/src/components/DataUnavailableCard.tsx @@ -0,0 +1,59 @@ +import { COLUMN_LABELS } from "../lib/dataQuality"; +import type { MetricQualityEntry } from "../types"; + +interface Props { + title: string; + entry: MetricQualityEntry; + suggestion?: string; +} + +function buildBody(entry: MetricQualityEntry): string { + const { blockingColumn, missingPct, thresholdPct } = entry; + if (!blockingColumn) return "Insufficient data to display this chart."; + + const label = COLUMN_LABELS[blockingColumn]; + + // Boolean columns (sessions / attendance) have no threshold + if (thresholdPct === undefined) { + return `This chart requires ${label} data, which has not been loaded.`; + } + + const requiredPct = Math.round((1 - thresholdPct) * 100); + const presentPct = Math.round((1 - (missingPct ?? 0)) * 100); + const presentCount = Math.round(presentPct / 10); // "X out of 10" + + return ( + `This chart requires ${label} data for at least ${requiredPct}% of residents. ` + + `Currently ${presentCount} out of 10 residents have this information (${presentPct}%).` + ); +} + +export function DataUnavailableCard({ title, entry, suggestion }: Props) { + return ( +
+
+ + {title} +
+

+ {buildBody(entry)} +

+ {suggestion && ( +

+ {suggestion} +

+ )} +
+ ); +} diff --git a/src/components/FileLoader.tsx b/src/components/FileLoader.tsx new file mode 100644 index 0000000..9bf414b --- /dev/null +++ b/src/components/FileLoader.tsx @@ -0,0 +1,632 @@ +import React, { useState, useCallback, useRef } from "react"; +import Papa from "papaparse"; +import type { CsvFileKey } from "../types"; +import { CSV_FILE_DESCRIPTORS } from "../types"; +import type { DemoScenario } from "../data/mockData"; +import { generateDemoCSVFiles, downloadCSV } from "../lib/demoExport"; + +interface Props { + onLoad: (files: Record) => void; + onDemo: (scenario: DemoScenario) => void; +} + +const CORE_DOC_KEYS: CsvFileKey[] = ["doc_residents", "doc_programs"]; + +const ADVANCED_DOC_KEYS: CsvFileKey[] = [ + "incidents", + "work_assignments", + "case_plan", + "credentials", + "housing_history", +]; + +const DOC_KEYS: CsvFileKey[] = [...CORE_DOC_KEYS, ...ADVANCED_DOC_KEYS]; + +const UL_KEYS: CsvFileKey[] = [ + "users", + "facilities", + "programs", + "program_classes", + "program_class_enrollments", + "program_completions", + "program_class_events", + "program_class_event_attendance", + "user_session_tracking", + "program_credit_types", +]; + +const REF_KEYS: CsvFileKey[] = ["program_crosswalk", "field_mapping"]; + +// Expected columns per dataset (derived from Raw type interfaces) +const EXPECTED_COLUMNS: Partial> = { + doc_residents: ["ID", "STATUS_DESC", "LOCATION_TO", "LOC_TYPE_TO", "ODARA_SCORE", "STATIC99R_SCORE", "LSI_RATING", "HIGHEST_ED_LVL", "CUSTODY_LVL", "Earliest Release Date", "SENTENCE_OFFENSE", "Offense Date", "COUNTY", "LAST_PROGRAM_COMPLETED", "JOB_ASSIGN"], + doc_programs: ["ID", "GENDER", "Facility", "CUSTODY LEVEL", "Housing Unit", "Housing Pod", "Room", "Bed", "Program", "Program Status", "Program Termination Or Completion Date", "Earliest Release Date"], + incidents: ["ID", "Incident Date", "Incident Type", "Severity", "Sanction", "Facility"], + work_assignments: ["ID", "Assignment Type", "Role Title", "Start Date", "End Date", "Transferable Skills Flag", "Facility"], + case_plan: ["ID", "State ID Obtained", "State ID Date", "Job Lined Up", "Housing Plan", "Trust Account Balance", "Savings Goal Met"], + credentials: ["ID", "Credential Type", "Credential Name", "Date Earned", "Issuing Body", "Verified"], + housing_history: ["ID", "Move Date", "Housing Unit", "Pod", "Room", "Bed", "Custody Level", "Move Reason", "Facility"], +}; + + +const FILE_NAME_TO_KEY: Record = { + "doc_residents.csv": "doc_residents", + "doc_residents.xlsx": "doc_residents", + "doc_programs.csv": "doc_programs", + "doc_programs.xlsx": "doc_programs", + "doc_incidents.csv": "incidents", + "doc_incidents.xlsx": "incidents", + "doc_work_assignments.csv": "work_assignments", + "doc_work_assignments.xlsx": "work_assignments", + "doc_case_plan.csv": "case_plan", + "doc_case_plan.xlsx": "case_plan", + "doc_credentials.csv": "credentials", + "doc_credentials.xlsx": "credentials", + "doc_housing_history.csv": "housing_history", + "doc_housing_history.xlsx": "housing_history", + "users.csv": "users", + "facilities.csv": "facilities", + "programs.csv": "programs", + "program_classes.csv": "program_classes", + "program_class_enrollments.csv": "program_class_enrollments", + "program_completions.csv": "program_completions", + "program_class_events.csv": "program_class_events", + "program_class_event_attendance.csv": "program_class_event_attendance", + "user_session_tracking.csv": "user_session_tracking", + "program_credit_types.csv": "program_credit_types", + "program_crosswalk.csv": "program_crosswalk", + "field_mapping.csv": "field_mapping", +}; + +type SectionId = "doc" | "ul" | "ref"; + +function SectionHeader({ + id, title, subtitle, loaded, open, onToggle, +}: { + id: SectionId; title: string; subtitle: string; + loaded: Record; + open: Record; + onToggle: (id: SectionId) => void; +}) { + const keys = id === "doc" ? DOC_KEYS : id === "ul" ? UL_KEYS : REF_KEYS; + const loadedInSection = keys.filter(k => !!loaded[k]).length; + return ( +
onToggle(id)} + role="button" + tabIndex={0} + onKeyDown={e => (e.key === "Enter" || e.key === " ") && onToggle(id)} + > +
+ +

{title}

+ {loadedInSection > 0 && ( + + {loadedInSection} loaded + + )} +
+

{subtitle}

+
+ ); +} + +interface SlotListProps { + keys: CsvFileKey[]; + accept: string; + loaded: Record; + columnWarnings: Partial>; + previews: Partial>; + columnInfoOpen: CsvFileKey | null; + previewOpen: CsvFileKey | null; + slotRefs: React.MutableRefObject>>; + onSlotChange: (key: CsvFileKey) => (e: React.ChangeEvent) => void; + onRemove: (key: CsvFileKey) => void; + onSetPreviewOpen: (key: CsvFileKey | null) => void; + onSetColumnInfoOpen: (key: CsvFileKey | null) => void; +} + +function SlotList({ + keys, accept, loaded, columnWarnings, previews, + columnInfoOpen, previewOpen, slotRefs, + onSlotChange, onRemove, onSetPreviewOpen, onSetColumnInfoOpen, +}: SlotListProps) { + return ( + <> + {keys.map(key => { + const desc = CSV_FILE_DESCRIPTORS[key]; + const file = loaded[key]; + const warnings = columnWarnings[key]; + const preview = previews[key]; + const isInfoOpen = columnInfoOpen === key; + const isPreviewOpen = previewOpen === key; + const expectedCols = EXPECTED_COLUMNS[key]; + + return ( +
+ {/* Main slot row */} +
slotRefs.current[key]?.click()} + title={file ? file.name : undefined} + > + { slotRefs.current[key] = el ?? undefined; }} + type="file" + accept={accept} + style={{ display: "none" }} + onChange={onSlotChange(key)} + /> +
+ {file + ? + : + } +
+
+
+ {desc.displayName ?? desc.label} +
+
+ {desc.description} +
+
+ + {/* Info icon (always shown for datasets with expected columns) */} + {expectedCols && ( + + )} + + {file ? ( + <> + {/* Preview toggle */} + + loaded + + + ) : ( + optional + )} +
+ + {/* Column validation warning */} + {warnings && warnings.length > 0 && ( +
+ ⚠ Missing expected columns: {warnings.join(", ")}. Are you sure this is the right file? +
+ )} + + {/* Expected columns info panel */} + {isInfoOpen && expectedCols && ( +
+
Expected columns
+
+ {expectedCols.map(col => ( + + {col} + + ))} +
+
+ )} + + {/* Preview table */} + {isPreviewOpen && preview && preview.rows.length > 0 && ( +
+ + + + {preview.headers.map(h => ( + + ))} + + + + {preview.rows.map((row, i) => ( + + {preview.headers.map(h => ( + + ))} + + ))} + +
+ {h} +
+ {row[h] ?? ""} +
+
+ Showing first {preview.rows.length} row{preview.rows.length !== 1 ? "s" : ""} +
+
+ )} +
+ ); + })} + + ); +} + +function Chevron({ open }: { open: boolean }) { + return ( + + + + ); +} + +interface PreviewData { + headers: string[]; + rows: Record[]; +} + +export function FileLoader({ onLoad, onDemo }: Props) { + const [loaded, setLoaded] = useState>({}); + const [dragOver, setDragOver] = useState(null); + const [unknownFiles, setUnknownFiles] = useState([]); + const [open, setOpen] = useState>({ doc: false, ul: false, ref: false }); + const [showAdvanced, setShowAdvanced] = useState(false); + const [demoMode, setDemoMode] = useState(false); + const [downloadingScenario, setDownloadingScenario] = useState(null); + const [columnInfoOpen, setColumnInfoOpen] = useState(null); + const [columnWarnings, setColumnWarnings] = useState>>({}); + const [previewOpen, setPreviewOpen] = useState(null); + const [previews, setPreviews] = useState>>({}); + const slotRefs = useRef>>({}); + const ulInputRef = useRef(null); + + async function validateAndPreview(key: CsvFileKey, file: File): Promise<{ warnings: string[]; preview: PreviewData }> { + return new Promise((resolve) => { + Papa.parse(file, { + header: true, + preview: 6, + skipEmptyLines: true, + complete: (results) => { + const headers = results.meta.fields ?? []; + const expected = EXPECTED_COLUMNS[key] ?? []; + const missing = expected.filter(col => !headers.includes(col)); + const rows = (results.data as Record[]).slice(0, 5); + resolve({ warnings: missing, preview: { headers, rows } }); + }, + error: () => resolve({ warnings: [], preview: { headers: [], rows: [] } }), + }); + }); + } + + const processFileList = useCallback((files: FileList | File[]) => { + const updates: Partial> = {}; + const unknown: string[] = []; + for (const f of Array.from(files)) { + const key = FILE_NAME_TO_KEY[f.name]; + if (key) updates[key] = f; + else unknown.push(f.name); + } + setLoaded(prev => ({ ...prev, ...updates })); + if (unknown.length > 0) setUnknownFiles(unknown); + }, []); + + const handleSlotChange = (key: CsvFileKey) => async (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + e.target.value = ""; + setLoaded(prev => ({ ...prev, [key]: file })); + const { warnings, preview } = await validateAndPreview(key, file); + if (warnings.length > 0) { + setColumnWarnings(prev => ({ ...prev, [key]: warnings })); + } else { + setColumnWarnings(prev => { const n = { ...prev }; delete n[key]; return n; }); + } + setPreviews(prev => ({ ...prev, [key]: preview })); + }; + + const dragHandlers = (section: SectionId) => ({ + onDragOver: (e: React.DragEvent) => { e.preventDefault(); setDragOver(section); }, + onDragLeave: (e: React.DragEvent) => { + if (!e.currentTarget.contains(e.relatedTarget as Node)) setDragOver(null); + }, + onDrop: (e: React.DragEvent) => { + e.preventDefault(); + setDragOver(null); + processFileList(e.dataTransfer.files); + }, + }); + + const removeFile = (key: CsvFileKey) => { + setLoaded(prev => { const n = { ...prev }; delete n[key]; return n; }); + setColumnWarnings(prev => { const n = { ...prev }; delete n[key]; return n; }); + setPreviews(prev => { const n = { ...prev }; delete n[key]; return n; }); + if (previewOpen === key) setPreviewOpen(null); + if (columnInfoOpen === key) setColumnInfoOpen(null); + }; + + const toggleSection = (id: SectionId) => { + setOpen(prev => ({ ...prev, [id]: !prev[id] })); + }; + + const handleDownloadScenario = (scenario: DemoScenario) => { + setDownloadingScenario(scenario); + setTimeout(() => { + const files = generateDemoCSVFiles(scenario); + for (const f of files) downloadCSV(f.filename, f.content); + setDownloadingScenario(null); + }, 10); + }; + + const loadedCount = Object.keys(loaded).length; + const canLoad = loadedCount > 0; + const visibleDocKeys = showAdvanced ? DOC_KEYS : CORE_DOC_KEYS; + + const DEMO_OPTIONS: { scenario: DemoScenario; label: string; description: string }[] = [ + { scenario: "clean", label: "Clean data", description: "Fully populated, no quality issues" }, + { scenario: "messy", label: "Messy data", description: "~33% LSI missing, gaps in education & dates" }, + { scenario: "advanced-missing", label: "Core data only", description: "Messy core data, no incidents or enrichment files" }, + ]; + + return ( +
+ {/* Header row */} +
+
+

Load data files

+ {!demoMode && ( +

+ All files are optional — insights are generated for whatever data is loaded. +

+ )} +
+ {/* Right-side controls */} +
+ {/* Demo mode toggle */} +
+ + {demoMode ? ( + /* Demo mode: three scenario cards */ +
+ {DEMO_OPTIONS.map(({ scenario, label, description }) => ( +
+
+
{label}
+
{description}
+
+
+ + +
+
+ ))} +
+ ) : null} + + {canLoad && !demoMode && ( +
+ +
+ )} + + {!demoMode && ( + <> + {unknownFiles.length > 0 && ( +

+ Unrecognised files (not loaded): {unknownFiles.join(", ")} +

+ )} + + {/* Section 1: DOC data */} +
+ + {open.doc && ( +
+ + {!showAdvanced && ( +
+ Incidents, work assignments, case plans, credentials, and housing history are hidden.{" "} + +
+ )} +
+ )} +
+ + {/* Section 2: UnlockEd platform data */} +
+ + {open.ul && ( +
+
ulInputRef.current?.click()} + > + { if (e.target.files) processFileList(e.target.files); e.target.value = ""; }} + /> + Drop UnlockEd CSV files here or click to browse +
+
+ {UL_KEYS.map(key => { + const desc = CSV_FILE_DESCRIPTORS[key]; + const file = loaded[key]; + return ( +
+
+ {file + ? + : + } +
+
+
{desc.label}
+
{desc.description}
+
+ + {file ? "loaded" : "optional"} + +
+ ); + })} +
+
+ )} +
+ + {/* Section 3: Mapping & reference (hidden unless showAdvanced) */} + {showAdvanced && ( +
+ + {open.ref && ( +
+ +
+ )} +
+ )} + + )} +
+ ); +} diff --git a/src/components/OmsCards.tsx b/src/components/OmsCards.tsx new file mode 100644 index 0000000..44228d6 --- /dev/null +++ b/src/components/OmsCards.tsx @@ -0,0 +1,620 @@ +import { useMemo, type ReactNode } from "react"; +import { Bar, Doughnut } from "react-chartjs-2"; +import { + Chart as ChartJS, + CategoryScale, + LinearScale, + BarElement, + ArcElement, + Tooltip, + Legend, +} from "chart.js"; +import type { ParsedData } from "../types"; +import { + computeIncidentStats, + computeCredentialStats, + computeWorkAssignmentStats, + computeCasePlanStats, + computeHousingStats, +} from "../lib/analytics"; + +ChartJS.register(CategoryScale, LinearScale, BarElement, ArcElement, Tooltip, Legend); + +const TRAILING_12MO_CUTOFF = new Date(Date.now() - 365 * 24 * 60 * 60 * 1000); + +const C = { + accent: "#4a9eff", + green: "#3db87a", + amber: "#f59e0b", + red: "#e05252", + purple: "#8b5cf6", + teal: "#14b8a6", + gray: "#606878", + text: "#9ca3b0", + border: "rgba(255,255,255,0.08)", +}; + +const CHART_COLORS = [C.accent, C.green, C.amber, C.purple, C.teal, C.red, C.gray]; + +const BASE = { + responsive: true, + maintainAspectRatio: false, + plugins: { + legend: { display: false }, + tooltip: { + backgroundColor: "#141720", + borderColor: "rgba(255,255,255,0.12)", + borderWidth: 1, + titleColor: "#e8eaf0", + bodyColor: "#9ca3b0", + }, + }, + scales: { + x: { grid: { color: C.border }, ticks: { color: C.text, font: { size: 11 } } }, + y: { grid: { color: C.border }, ticks: { color: C.text, font: { size: 11 } } }, + }, +}; + +function KpiChip({ label, value, color }: { label: string; value: string; color?: string }) { + return ( +
+ + {label} + + + {value} + +
+ ); +} + +function ChartBox({ height, children }: { height: number; children: ReactNode }) { + return
{children}
; +} + +function MissingFilePlaceholder({ dataName }: { dataName: string }) { + return ( +
+ Upload {dataName} data to see this insight. +
+ ); +} + +const DisabledAskAI = () => ( + +); + +// ── OmsReentrySnapshot ──────────────────────────────────────────────────────── + +export function OmsReentrySnapshot({ data }: { data: ParsedData }) { + const trailing12mo = useMemo(() => { + if (data.incidents.length === 0) return null; + return data.incidents.filter(i => i.incidentDate && i.incidentDate >= TRAILING_12MO_CUTOFF).length; + }, [data.incidents]); + + const credentialCount = data.credentials.length; + + const stateIdRate = useMemo(() => { + if (data.casePlans.length === 0) return null; + const pct = Math.round((data.casePlans.filter(c => c.stateIdObtained).length / data.casePlans.length) * 100); + return `${pct}%`; + }, [data.casePlans]); + + const jobLinedUpRate = useMemo(() => { + if (data.casePlans.length === 0) return null; + const pct = Math.round((data.casePlans.filter(c => c.jobLinedUp).length / data.casePlans.length) * 100); + return `${pct}%`; + }, [data.casePlans]); + + const savingsGoalRate = useMemo(() => { + if (data.casePlans.length === 0) return null; + const pct = Math.round((data.casePlans.filter(c => c.savingsGoalMet).length / data.casePlans.length) * 100); + return `${pct}%`; + }, [data.casePlans]); + + const earnedHousingRate = useMemo(() => { + if (data.housingMoves.length === 0) return null; + // Most recent move per resident + const latestByResident = new Map(); + for (const move of data.housingMoves) { + const existing = latestByResident.get(move.residentId); + if (!existing || (move.moveDate && existing.moveDate && move.moveDate > existing.moveDate)) { + latestByResident.set(move.residentId, move); + } + } + const latestMoves = Array.from(latestByResident.values()); + const earned = latestMoves.filter(m => m.moveReason.toLowerCase() === "earned").length; + const pct = Math.round((earned / latestMoves.length) * 100); + return `${pct}%`; + }, [data]); + + return ( +
+
+ Reentry readiness +
+
+ + + + 0 ? String(credentialCount) : "—"} color={credentialCount > 0 ? C.teal : C.gray} /> + + +
+
+ ); +} + +// ── OmsIncidentSection ──────────────────────────────────────────────────────── + +export function OmsIncidentSection({ data }: { data: ParsedData }) { + const stats = useMemo(() => computeIncidentStats(data), [data]); + const hasData = data.incidents.length > 0; + + return ( +
+
Incident activity
+
+ {hasData + ? `${stats.total} total · ${stats.trailing12mo} in trailing 12 months` + : "No incident data loaded"} +
+ {!hasData ? ( + + ) : ( + <> +
+ + + + + + +
+ +
+
+
+ Severity split +
+ + + +
+
+
+ Per-resident count distribution +
+ + + +
+
+ + {stats.byType.length > 0 && ( + <> +
+ Incident type breakdown +
+ + t.type), + datasets: [{ + label: "Count", + data: stats.byType.map(t => t.count), + backgroundColor: C.accent, + borderRadius: 3, + }], + }} + options={{ ...BASE, indexAxis: "y" as const }} + /> + + + )} + + {stats.byFacility.length > 0 && ( +
+
+ Incidents by facility +
+ + f.facilityCode), + datasets: [ + { + label: "Major", + data: stats.byFacility.map(f => f.major), + backgroundColor: C.red, + borderRadius: 3, + stack: "s", + }, + { + label: "Minor", + data: stats.byFacility.map(f => f.count - f.major), + backgroundColor: C.amber, + borderRadius: 3, + stack: "s", + }, + ], + }} + options={{ + ...BASE, + indexAxis: "y" as const, + plugins: { ...BASE.plugins, legend: { display: true, labels: { color: C.text, font: { size: 11 } } } }, + }} + /> + +
+ )} + +
+ +
+ + )} +
+ ); +} + +// ── OmsCredentialSection ────────────────────────────────────────────────────── + +export function OmsCredentialSection({ data }: { data: ParsedData }) { + const stats = useMemo(() => computeCredentialStats(data), [data]); + const hasData = data.credentials.length > 0; + + return ( +
+
Credentials
+
+ {hasData + ? `${stats.total} credentials across ${stats.residentCount} residents — ${stats.hasHiSetOrGedCount} have GED or HiSET` + : "No credential data loaded"} +
+ {!hasData ? ( + + ) : ( + <> +
+ + + + + +
+ +
+
+
+ By credential type +
+ + t.type), + datasets: [{ + label: "Count", + data: stats.byType.map(t => t.count), + backgroundColor: CHART_COLORS, + borderRadius: 3, + }], + }} + options={{ ...BASE }} + /> + +
+
+
+ Verification status +
+ + + +
+
+ + {stats.byIssuingBody.length > 0 && ( +
+
+ By issuing body +
+
+ {stats.byIssuingBody.map(b => ( + + {b.body} {b.count} + + ))} +
+
+ )} + +
+ +
+ + )} +
+ ); +} + +// ── OmsWorkSection ──────────────────────────────────────────────────────────── + +export function OmsWorkSection({ data }: { data: ParsedData }) { + const stats = useMemo(() => computeWorkAssignmentStats(data), [data]); + const hasData = data.workAssignments.length > 0; + + return ( +
+
Work assignments
+
+ {hasData + ? `${stats.activeTotal} active assignments — ${stats.transferableActiveRate}% of facility roles have transferable skills` + : "No work assignment data loaded"} +
+ {!hasData ? ( + + ) : ( + <> +
+ + + + + +
+ + {stats.byRole.length > 0 && ( + <> +
+ Active assignments by role +
+ + r.role), + datasets: [{ + label: "Active count", + data: stats.byRole.map(r => r.count), + backgroundColor: C.accent, + borderRadius: 3, + }], + }} + options={{ ...BASE, indexAxis: "y" as const }} + /> + + + )} + +
+ +
+ + )} +
+ ); +} + +// ── OmsCasePlanSection ──────────────────────────────────────────────────────── + +export function OmsCasePlanSection({ data }: { data: ParsedData }) { + const stats = useMemo(() => computeCasePlanStats(data), [data]); + const hasData = data.casePlans.length > 0; + + return ( +
+
Case plan readiness
+
+ {hasData + ? `${stats.total} case plans — ${stats.stateIdRate}% have state ID, ${stats.savingsGoalMetRate}% met savings goal` + : "No case plan data loaded"} +
+ {!hasData ? ( + + ) : ( + <> +
+ + + + + +
+ +
+
+
+ Readiness score distribution (0–4 indicators met) +
+ + `Score ${d.score}`), + datasets: [{ + label: "Residents", + data: stats.readinessDistribution.map(d => d.count), + backgroundColor: [C.red, C.amber, C.amber, C.green, C.green], + borderRadius: 3, + }], + }} + options={{ ...BASE }} + /> + +
+
+
+ Trust account balance distribution +
+ + b.label), + datasets: [{ + label: "Residents", + data: stats.balanceBands.map(b => b.count), + backgroundColor: [C.red, C.amber, C.accent, C.green], + borderRadius: 3, + }], + }} + options={{ ...BASE }} + /> + +
+
+ +
+ +
+ + )} +
+ ); +} + +// ── OmsHousingSection ───────────────────────────────────────────────────────── + +export function OmsHousingSection({ data }: { data: ParsedData }) { + const stats = useMemo(() => computeHousingStats(data), [data]); + const hasData = data.housingMoves.length > 0; + + return ( +
+
Housing & custody transitions
+
+ {hasData + ? `${stats.earnedHousingRate}% of residents earned their most recent housing move — ${stats.communityCustodyCount} in community custody` + : "No housing history data loaded"} +
+ {!hasData ? ( + + ) : ( + <> +
+ + + +
+ +
+
+
+ Current custody level distribution +
+ + d.level), + datasets: [{ + data: stats.custodyDistribution.map(d => d.count), + backgroundColor: CHART_COLORS, + borderWidth: 0, + }], + }} + options={{ + responsive: true, + maintainAspectRatio: false, + plugins: { + legend: { display: true, position: "right" as const, labels: { color: C.text, font: { size: 10 }, boxWidth: 10 } }, + tooltip: BASE.plugins.tooltip, + }, + }} + /> + +
+
+
+ Earned housing rate by facility +
+ + f.facilityCode), + datasets: [{ + label: "Earned %", + data: stats.earnedByFacility.map(f => f.rate), + backgroundColor: C.green, + borderRadius: 3, + }], + }} + options={{ + ...BASE, + scales: { + ...BASE.scales, + y: { ...BASE.scales.y, max: 100, ticks: { ...BASE.scales.y.ticks, callback: (v: number | string) => `${v}%` } }, + }, + }} + /> + +
+
+ +
+ +
+ + )} +
+ ); +} diff --git a/src/components/SmartActionItem.tsx b/src/components/SmartActionItem.tsx new file mode 100644 index 0000000..6571848 --- /dev/null +++ b/src/components/SmartActionItem.tsx @@ -0,0 +1,73 @@ +import { useState, useEffect, useRef } from "react"; +import type { LLMConfig } from "../chat/providers"; +import { generateActionItem } from "../chat/actionItems"; + +const SESSION_KEY = "llm_config"; + +function loadConfig(): LLMConfig | null { + try { + const raw = sessionStorage.getItem(SESSION_KEY); + return raw ? (JSON.parse(raw) as LLMConfig) : null; + } catch { + return null; + } +} + +interface Props { + sectionLabel: string; + metrics: Record; + fallback: string; + marginTop?: number; +} + +export function SmartActionItem({ sectionLabel, metrics, fallback, marginTop = 20 }: Props) { + const [aiText, setAiText] = useState(null); + const metricsRef = useRef(metrics); + const labelRef = useRef(sectionLabel); + + useEffect(() => { + const config = loadConfig(); + if (!config) return; + generateActionItem(labelRef.current, metricsRef.current, config) + .then((text) => { if (text) setAiText(text); }) + .catch(() => {}); + }, []); + + const text = aiText ?? fallback; + + return ( +
+ Action item: + {text} + {aiText !== null && ( + + ✦ AI + + )} +
+ ); +} diff --git a/src/components/chat/ChatDrawer.tsx b/src/components/chat/ChatDrawer.tsx new file mode 100644 index 0000000..37424bf --- /dev/null +++ b/src/components/chat/ChatDrawer.tsx @@ -0,0 +1,578 @@ +import { useState, useRef, useEffect } from "react"; +import type { ParsedData, MetricSnapshot, ChatMessage, PendingPrompt } from "../../types"; +import type { LLMConfig, LLMProvider } from "../../chat/providers"; +import { PROVIDER_INFO } from "../../chat/providers"; +import { METRIC_REGISTRY } from "../../data/schemaRegistry"; +import { buildContextPacket } from "../../chat/contextPacket"; +import { callRouter } from "../../chat/router"; +import { callWriter } from "../../chat/writer"; +import { buildRefusalMessage } from "../../chat/refusal"; +import { DEMO_RESPONSES } from "../../data/demoResponses"; +import type { DemoEntry } from "../../data/demoResponses"; +import CHAT_CONFIG from "../../config/chat.json"; + +const CONFIDENCE_THRESHOLD = CHAT_CONFIG.confidenceThreshold; +const SESSION_KEY = CHAT_CONFIG.sessionKey; + +export const CHAT_DRAWER_WIDTH = CHAT_CONFIG.drawerWidth; + +interface Props { + data: ParsedData | null; + snapshot: MetricSnapshot | null; + pendingPrompt: PendingPrompt | null; + onPromptConsumed: () => void; + onOpenChange?: (open: boolean) => void; + chatDemoMode?: boolean; + onChatDemoModeChange?: (v: boolean) => void; +} + +const PROVIDERS: LLMProvider[] = ["gemini", "openai", "claude", "ollama"]; + +const inputStyle = { + background: "var(--bg3)", border: "1px solid var(--border2)", + borderRadius: "var(--radius-sm)", padding: "8px 10px", + color: "var(--text)", fontSize: 12, outline: "none", + fontFamily: "var(--font-mono)", width: "100%", boxSizing: "border-box" as const, +}; + +function ApiKeySetup({ onSave }: { onSave: (config: LLMConfig) => void }) { + const [provider, setProvider] = useState("gemini"); + const [value, setValue] = useState(""); + const [model, setModel] = useState(PROVIDER_INFO["gemini"].models[0]); + const info = PROVIDER_INFO[provider]; + const isLocal = provider === "ollama"; + + const handleProviderChange = (p: LLMProvider) => { + setProvider(p); + setValue(""); + setModel(PROVIDER_INFO[p].models[0]); + }; + + return ( +
+

Select AI provider:

+
+ {PROVIDERS.map(p => ( + + ))} +
+ {isLocal ? ( + <> +

+ Runs entirely on your machine — no API key or internet connection required. +

+
+

Model

+ setModel(e.target.value)} + /> +

+ Run ollama list to see installed models. +

+
+ +

+ Requires Ollama running locally. See README for setup instructions. +

+ + ) : ( + <> +

+ Enter a {info.label} API key to enable AI chat. The key is stored in this browser session only and sent only to {info.label} with aggregated metrics — no resident data. +

+ setValue(e.target.value)} + onKeyDown={e => e.key === "Enter" && value.trim() && onSave({ provider, apiKey: value.trim(), model })} + style={inputStyle} + /> +
+

Model

+ +
+ +

+ Get a key at {info.keyHint}. +

+ + )} +
+ ); +} + +// Splits assistant content into plain text and cited values. +// "[b1_education_journey_loss.dropoff.0.withdrawalRate: 81.3%]" → bold "81.3%" +function renderWithCitations(text: string): React.ReactNode { + // Strip any unclosed bracket at the end (truncated response mid-citation) + const cleaned = text.replace(/\[[^\]]*$/, "").trimEnd(); + const parts = cleaned.split(/\[([^\]:]+):\s*([^\]]+)\]/g); + const nodes: React.ReactNode[] = []; + for (let i = 0; i < parts.length; i++) { + if (i % 3 === 0) { + nodes.push(parts[i]); + } else if (i % 3 === 2) { + nodes.push({parts[i]}); + } + // i % 3 === 1 is the metric path — discard it + } + return nodes; +} + +function MessageBubble({ msg }: { msg: ChatMessage }) { + const isUser = msg.role === "user"; + return ( +
+
+
+          {isUser ? msg.content : renderWithCitations(msg.content)}
+        
+ + {msg.is_refusal && msg.nearest_metrics && msg.nearest_metrics.length > 0 && ( +
+ Related metrics: + {msg.nearest_metrics.map(m => ( + + {m.label} + + ))} +
+ )} +
+ + {!isUser && msg.snapshot_id && ( + + snapshot:{msg.snapshot_id.slice(0, 8)} + + )} +
+ ); +} + +function loadStoredConfig(): LLMConfig | null { + // Try current format + const stored = sessionStorage.getItem(SESSION_KEY); + if (stored) { + try { return JSON.parse(stored) as LLMConfig; } catch { /* ignore */ } + } + // Migrate legacy gemini_api_key entry + const legacyKey = sessionStorage.getItem("gemini_api_key"); + if (legacyKey) { + const config: LLMConfig = { provider: "gemini", apiKey: legacyKey }; + sessionStorage.setItem(SESSION_KEY, JSON.stringify(config)); + sessionStorage.removeItem("gemini_api_key"); + return config; + } + return null; +} + +export function ChatDrawer({ data, snapshot, pendingPrompt, onPromptConsumed, onOpenChange, chatDemoMode = false, onChatDemoModeChange }: Props) { + const [isOpen, setIsOpen] = useState(false); + + useEffect(() => { onOpenChange?.(isOpen); }, [isOpen, onOpenChange]); + const [llmConfig, setLlmConfig] = useState(loadStoredConfig); + const [messages, setMessages] = useState([]); + const [inputValue, setInputValue] = useState(""); + const [contextLabel, setContextLabel] = useState(null); + const [pendingHints, setPendingHints] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const bottomRef = useRef(null); + // Demo mode state + const [demoEntries, setDemoEntries] = useState(null); + const [activeDemoEntry, setActiveDemoEntry] = useState(null); + + useEffect(() => { + if (!pendingPrompt) return; + // eslint-disable-next-line react-hooks/set-state-in-effect + setIsOpen(true); + if (chatDemoMode) { + const entries = DEMO_RESPONSES[pendingPrompt.context_label] ?? null; + setDemoEntries(entries); + setActiveDemoEntry(null); + setMessages([]); + } else { + setInputValue(pendingPrompt.text); + setContextLabel(pendingPrompt.context_label); + setPendingHints(pendingPrompt.metric_hint_ids ?? []); + } + onPromptConsumed(); + }, [pendingPrompt, onPromptConsumed, chatDemoMode]); + + useEffect(() => { + bottomRef.current?.scrollIntoView({ behavior: "smooth" }); + }, [messages]); + + const saveConfig = (config: LLMConfig) => { + sessionStorage.setItem(SESSION_KEY, JSON.stringify(config)); + setLlmConfig(config); + }; + const clearConfig = () => { sessionStorage.removeItem(SESSION_KEY); setLlmConfig(null); }; + + const sendMessage = async (override?: string) => { + const text = (override ?? inputValue).trim(); + if (!text || !data || !llmConfig || isLoading) return; + + const hints = pendingHints; + setInputValue(""); + setContextLabel(null); + setPendingHints([]); + + const userMsg: ChatMessage = { + id: crypto.randomUUID(), + role: "user", + content: text, + timestamp: new Date().toISOString(), + }; + setMessages(prev => [...prev, userMsg]); + setIsLoading(true); + + try { + // Convert metric hint IDs to human-readable labels for the planner's context + const hintLabels = hints.map(id => METRIC_REGISTRY.find(m => m.id === id)?.label ?? id); + const history = messages.slice(-4).map(m => ({ role: m.role, content: m.content })); + const plan = await callRouter(text, llmConfig, hintLabels, history, data?.dataEnums); + const snapshotId = snapshot?.id ?? "unknown"; + + if (plan.confidence < CONFIDENCE_THRESHOLD || plan.data_requests.length === 0) { + const refusal = buildRefusalMessage(plan, snapshotId); + setMessages(prev => [...prev, refusal]); + return; + } + + // Infer required source files from which flat tables the plan needs + const missingFiles: string[] = []; + if (plan.data_requests.some(r => r.table === "flat_residents") && data.residents.length === 0) + missingFiles.push("doc_residents (resident roster)"); + if (plan.data_requests.some(r => r.table === "flat_enrollments") && + data.enrollments.length === 0 && data.ulEnrollments.length === 0) + missingFiles.push("doc_programs (program enrollments)"); + if (plan.data_requests.some(r => r.table === "flat_sessions") && data.sessions.length === 0) + missingFiles.push("user_session_tracking"); + + if (missingFiles.length > 0) { + const fileMsg: ChatMessage = { + id: crypto.randomUUID(), + role: "assistant", + content: `To answer this I need: **${missingFiles.join(", ")}**. Upload ${missingFiles.length > 1 ? "these files" : "this file"} on the Load Data page.`, + snapshot_id: snapshotId, + timestamp: new Date().toISOString(), + }; + setMessages(prev => [...prev, fileMsg]); + return; + } + + const packet = buildContextPacket(plan, data, snapshot, text); + const { content, citationWarning } = await callWriter(packet, llmConfig, history); + + const assistantMsg: ChatMessage = { + id: crypto.randomUUID(), + role: "assistant", + content: citationWarning ? `${content}\n\n⚠ ${citationWarning}` : content, + metric_ids: plan.data_requests.map(r => r.id), + snapshot_id: snapshotId, + timestamp: new Date().toISOString(), + }; + setMessages(prev => [...prev, assistantMsg]); + } catch (e: unknown) { + const errMsg = e instanceof Error ? e.message : String(e); + setMessages(prev => [...prev, { + id: crypto.randomUUID(), + role: "assistant", + content: errMsg, + timestamp: new Date().toISOString(), + }]); + } finally { + setIsLoading(false); + } + }; + + const sendDemoMessage = (entry: DemoEntry) => { + const userMsg: ChatMessage = { + id: crypto.randomUUID(), + role: "user", + content: entry.question, + timestamp: new Date().toISOString(), + }; + const assistantMsg: ChatMessage = { + id: crypto.randomUUID(), + role: "assistant", + content: entry.response, + snapshot_id: snapshot?.id ?? "demo", + timestamp: new Date().toISOString(), + }; + setMessages(prev => [...prev, userMsg, assistantMsg]); + setActiveDemoEntry(entry); + setDemoEntries(null); + }; + + const sendDemoFollowUp = (question: string, response: string) => { + const userMsg: ChatMessage = { + id: crypto.randomUUID(), + role: "user", + content: question, + timestamp: new Date().toISOString(), + }; + const assistantMsg: ChatMessage = { + id: crypto.randomUUID(), + role: "assistant", + content: response, + snapshot_id: snapshot?.id ?? "demo", + timestamp: new Date().toISOString(), + }; + setMessages(prev => [...prev, userMsg, assistantMsg]); + setActiveDemoEntry(null); + }; + + const DRAWER_WIDTH = CHAT_DRAWER_WIDTH; + const EXAMPLE_QUESTIONS = [ + "What should I expect at SMWRC?", + "Why is facility completion low?", + "Are we serving high-risk residents in education?", + "Where should we focus this quarter?", + ]; + + const providerLabel = llmConfig ? PROVIDER_INFO[llmConfig.provider].label : "AI"; + const activeModel = llmConfig ? (llmConfig.model ?? PROVIDER_INFO[llmConfig.provider].models[0]) : null; + + return ( + <> + + + {isOpen && ( +
+
+
+ ✦ {providerLabel} + {llmConfig && ( + + {llmConfig.provider === "ollama" ? "local" : "key set"} + + )} + {activeModel && ( + + {activeModel} + + )} +
+
+ {llmConfig && } + +
+
+ + {/* Demo mode toggle */} +
+
+ + Demo mode + + {chatDemoMode && ( + + ON + + )} +
+ +
+ + {!chatDemoMode && llmConfig?.provider === "ollama" && ( +
+ Running locally — no data leaves your machine. +
+ )} + {!chatDemoMode && llmConfig?.provider !== "ollama" && ( +
+ Aggregated metrics only — no resident names or DOC numbers are shared with the API. +
+ )} + {chatDemoMode && ( +
+ Demo active — click "Ask AI" on Facilities or Engagement cards to explore sample insights. +
+ )} + +
+ {!llmConfig && !chatDemoMode ? ( + + ) : ( + <> + {/* Demo: starter questions for a card */} + {chatDemoMode && demoEntries && messages.length === 0 && ( +
+

Sample questions for this card:

+ {demoEntries.map(entry => ( + + ))} +
+ )} + + {/* Normal empty state */} + {!chatDemoMode && messages.length === 0 && ( +
+

Try asking:

+ {EXAMPLE_QUESTIONS.map(q => ( + + ))} +
+ )} + + {/* Demo: no card selected yet */} + {chatDemoMode && !demoEntries && messages.length === 0 && ( +
+

Click "Ask AI" on the

+

Facilities needing attention

+

or

+

Engagement overview

+

card to start.

+
+ )} + + {messages.map(msg => )} + + {/* Demo: follow-up questions after a response */} + {chatDemoMode && activeDemoEntry && activeDemoEntry.followUps.length > 0 && ( +
+

Follow-up questions:

+ {activeDemoEntry.followUps.map(fu => ( + + ))} +
+ )} + + {isLoading && ( +
+ Thinking… +
+ )} +
+ + )} +
+ + {llmConfig && !chatDemoMode && ( +
+ {contextLabel && ( +
+ Context: + + {contextLabel} + + +
+ )} +
+

__c~Wc z|FcIalmnzdfGYPLe1YaZWQ} zJRvHHV>tHI1MJCO6*upaW3Wxg|KR?kO-ostvgOHbC2&M)n07#RElFg)sKawdaWx#r zAS`!SAA@1&DYnKLis!evx{ z_T`dP8-Zst1Mo_f0A#ojOIkODY2%+kJ0QD85;>lCasq$@2*Xf(aU>G)B(ah@HZ?WT zqq`mviNWsx6hOlP6?1KkfNU5OwqGz0NSwP~`=Mxo6JYfr1I_EM5BzQzI8YOmPf#VW z3*<$@l0q<11wIC}gENf?xRQ;*WFZaf*RQ92Klw4;bkirOr>94x50eKt@pzn0oame| z7^As%lyZ81{|v`BY2kZF(=C{9{n?js{MMpWORK2qN)33Dnt7|Gd}0^0B!S7}3?B?0 zh$`?g)kqIqa5ioF7_DBtoVvQY#UMjv;_;Y#f6qN%rX4%JP4%9QnKU|*0%g08(jb>~ zL_1*jU;+vb)y!GU>h%#t#u)){4DG^Ea6`W2*%WZUEYYAg)lDW<<8UM=aUT4kby%#(_Y&NNENZIy--(I&7ikZ$r&n z1Lr#tTQd_91gU^+f*O7QkzMrQga0a06-%_JymlIoAoi0{7&`VV6~lR?m?2Y(FTTLz zsC>1O@lTo{_a#c<1VqZ)G;~U-``K4zx@un`|f+GSS*RVE))vW zUmDDb=aKC>#{5s0uB7USndgmQ5Tw34Ps5y2g zmVUPX6}tUz@1*0$k9+aZMBMcR(UFt~996FGINO=I489|*A%r5#**si6%0vi=rCbTa zgy0X6qyo)Qc7TyZT?yrrYS|kF3`e^h;XeKJKDzlcTd1?MQ-A>|u7{hcWfA_F?Q5>D zjRPz40zy=V;H{Asi5MB8R)+k5v>gRC%{=OXNTfy#^o*=rC24mk%pM8Sg6|Ps7mL+m z6O}L&l3fA&Y6wQ~#-KWsLo&2lX>s$)8iBQfhzYDzJ#bur+#s=1YB8hInoEy_O*%Ss z{Nvgj6$8|23W9tfAXJ>r&lX+d%p#MBRAJbMOHyk}@~Mop>FSSkRFz5^7ylulYE>4R zQ*t0$E*Bd^Op3&F+FPq2PzOil38nJ=DC(E>&3s4>Q|2{Hcx=*{xlr){$C2hluwiI5 z3uNqKq|oi4IGqm*IF4lA$fJA{;;4cGOAV4!m6=0w9L;y+hNK5id2AKV!}p^NBp4W- z@z5Y8;+lD+X|eXqN<$zf;CzbN0sfsb#Y%EGps{l)sT!&>vUYC_4k%N!fe7U?&$Y2bI_MY>p(JdFk3zl(Dkb=%_;D5c*?~m>OrgWyYL%9?|CI z6ls{RQYBrz1s>V1BWzkS9^qvMZ$vw5(3PvSf~0ZCrx4F%Y?KfrmaixD68H{CMaikQ z1KNB9C<{k7O{33ON;qCHs8kCbRnn#TA+S409~#zNS>|7mM}bRDe(+nJL)tz#st{i* z4bbTGHN)z6(!Rkrq16l>Rj}q~tn^4M2bE&Jc-1BW!_a*?hQ(Y`?+HqGyrmi;oZ$q! zbX4?91GLYv8e)jigNIf#J73)dw7S@Yq=3+L-nDFu6Rch;Uv#8^KwQQBB^3s{*!K9m zRj@HwL<*hZK8NfRUZ|U+)odc|C0@tu@CxNL0!bCPmyc(USM>}W!uByOGw+hWCfhZ{ z?%!;Z%EWMQ93a>g0gaYJ;=dVF3brvO z>Q=3-ojfLwD`R$0hU-_RIZoY52YySg`KPkaR?@@;#5bPMWvB99o$`iBLw8ujn(3oo z-p`fI28nf4Ql?r@jy~~k(j^{F%+qCz%9BBz$rXD545}07R9HQXgDM0hCO9UFfZ%>A zjR~fqFw`wgm8-Wtr23^zz0*XDbe;}uze4s-7-*&ppl1$y0%<11h1g3F3d90ZN6)CX zjrfv}>Kr6gaWY`>QmK@zHcm**RDp4U00_yzm>7RdU|=tqx2feIcG->h>&6JbE!g5p zQ`c+%L+Q?gDiIwf(&ng!t0p0vEU=dVE%TaK7D@wsF47gH=~b%uV9Lh0r)7nv%>(0p zD=;R`%44d`+U8hf<>u`i5!XrMfEN+76z2L;)b`>|wMW7kSqn2qkzWb;u=@n+6N&_E zkM!;o*|2S(6*oP|mC&A1`&xpkFri+WNvhXG#uOr*Dc)t*eT7;sx{AXTzYA8?&WYNd z`@q@Pk@mpdl*j(BZvziIXwL@N{GJA#3B@*DB}SjW@E+I(iR> zp*uGXX=g2E($bs=X>-&4S%*dUM;F;8Lt@t4@?BLIu^Z|h8T=*x_wb}pnbCPZ#KbcK6gM9(jU>DM~{D%8Q zl_V4k0>fcPq~4;o=XcWw`@YFx$((WfjK<&lpzTlpJI}GjU&$HmI@wF0_IxXVAW>*% zO{}U24@9Qnj)s-UGjuexRTS6MOS`SY>X;L`M@AQ?0WrKdhfA+&~|40 z@h7w~M5=%6w$P(fJNJCqWP!Z|qOZDv2z|cjkeYk(R#}ncv0n@A2+!y41D_%N@y080 zDuZJI)abU|%pRP>9<=B$TmYEf125B|-M0qnb2GGSMlX}-H9~FdKEWmn>?JUCq^S~A zc9B+?)$B@YJokD52Q-M{rbB82+8D0C;>zH&O}&+f$*N+uU&d)V|2kT|WhX7VYAgR7 zQH|JvO)Ic5P$ftVfWct~_?mG)d2&1TOxb8zV!nC#jStY$>%Snp2!gBfhe8r-3FV3& zJhYmjqY8~fvWqShm2L-FMI*4GwOpUoPCdNJfvHU}c(@jP3}^>r*GM9vwPFXo9e;XL z90E_oGB50=qfh>`AXwSmg#)C&Ih+QgOA3qaUJ?&&<28T2Nd;@ z1EE9<+5ip!btRNfP$d8vE}XAJT2f1%Dtl6f-NAYb^}xFaB#ucQdqaDrsck`+_P+8G z7XtCrFp5Y@(K3$!QBGMYFw`^tSSGlk)kJ?6a1*h_$xd31(jmC@(xc5RlwS-|mM3p47f8iCEP z!|rnl@JL8!IL`nDSRWra4Ev>6O@(FK8BWgbcVyd0~hr!3;)dm z{=_v9qlyld0SKE0GF*~jn}orG_dNNkq8*T3OP9oH^Dc{F##+i8g^YN#a9y)>hNA%* zeZFXCMb{?gYwK4rP;d`hfJ2op`VAfF6AT`j9aN9>Y5EqF(Lh1~ z1|usu4I5bW`J$Z_U7L_D^x&b@OhwbaLvdR{5GSET3sphE4Rs}yPf#ULTNdL&ZJr_T z&lzbq+|nw5k`43vElOxkKyxB`@X%^j_U0vk%1k4Q`XI)UHwh1nHyQAKs(eCK-yvws z-V4o)zrrft1sx#6SaW&Y^Icgp*U2 zl!QPNh$&5SOxfZ>LcmT)!V(7?3>X|+7=sr;#@4=T-qQQs|9`W+Cut;)G&1HLk4Ku( zd+&eWfB(DR``ZnZXZiHWF{Xz-affE;fB4VH{+u%C!uQp0zMuX1Cm=^*YBH9Ffav=! z`5wQVB$20o_PrFS0q6#wL#D;2;$@Rz+3GV)1pmE1L4YqJ$V{WA0>t-{|Ol5%U$SjGGX_Mj- znscNG)E7eM333?hRvKvkfO?v?Q1|XPsB72j)XP6(0&qVwo?zfh)QSjJ#dtmPcnLl% zX&i1pQ*5%2VwIDqYWC--_Q*4+>aY{2bkc0HOEpJu6?lS$2cGL|WJ#l|d9-0Do^4`P z@UNC|4}Bk^zI{8XWBVVe^{r>A)UE|z3eX`BU;j%_23V148w{$NtiHW_sAbcyXzweJ zQ0IFaE8p9trttrd{`4sA{MC1;ulYUEWC~5y1p^u2`7TR&R-+n@y?_oq|2tGRc@hJz z9%@i<0}2DEwkbRm82L<4PM^!?x5~?9O+>AZc2Va{mXcO!1+$)7ezA&IW{VaAY=plj z73f2)7#SDT!h}KnEuHk<>YM4Kbq_I7uqI-c6pU9F1Z1!W=&X?3v;OK^bjT^om1@=R zr1aGA11gFQcqLY8fAd~ey*5(Uj#sJY!_Cy!vXh+7z2pWuG#zCmtJ8&6!7+^^^$ z14QVkWuKZ$^S=B5t7At}veQ-8TLc9u>M@uKOG z>&=d-cYvdRMH#C=EJ8>0ZZ!dx7%_>d3#jI(B~*9RnGF7PxwqS=*ij_dT1dt! zEY`Dk($)vBpst;-^6&Ng4fKA23;>ed%~W&v7wGV>JV+(gmAtf*418?Rhp@{mS<>xq zZ=gLdJtz`>pkt3r76cELX~1{|%wbJqL(2jqeI5hu4)n@90Ixp$RGMl-TuMG z>+)DFnUHNiyPld}ct8U^IvzbLkOP1xGj+^e{yh;=o*N- z%A+#av>`CoJ_YR~;T7R9*m$pBxQu2jyO}Dc&tg`mS4s|52SU?gD|GuKx6=D-zc*@% zw#qANZW+;#EyW^)g1>yP2rK}V3vfUUR@|Vb=T}kVgI{42cb$N1vEzouQ27s&rUKFe zJK}qHGw-idpVEP8Rzxw37q`RKMs{8fe=`9ot?Mjb^02j}d_k3WhpW z!#r;O)jwnM)d1&G0V8jfvc}QdOK(5)kF@L8-&Gzoc+#Ml`bBa-Y924X3m#+h>;K2X zZ4*DwX;e~~(CjYbS+uV0y9U)Cy_7Ycw?!C^6zII!1t=BHoznVQv|z=vWLH%3pu#Ky zlGv`Wse9);v~}g>)cyWjYMB)i+{gzqWbAO2#_MMCs$9vY{~}(c5quh~!!mhZTzd2F zGsVLPg2|UhoB0k1;6V?Dng%UG&AJt$;1~nkw)th+boW`*yJwqt+k}rzB!D$l3qi1j zH_*{UZ{2e)JCD}L_(OcxPykzTi{@RvQmjJJ+YKYHTjd3^n96L)!O(ynENWWLY-7N& zgiZTidyY2W`$aZHdSqEax=-W-NQx`3u-9L^< zi`O3-NaI6SvOd3&SxE#%!+pyEftky05i8eA_6+MyG>2moa96^c24@d^5m^`Hfk91k zx_d>)xjpR%6a_~C4Qj>sp>p=^+sCZLP6u&Qgy*naDx(?a+$>QZV;J6S4i2!H@(06R z32$1ivj=<(PMCLAeOKdokKPAmx#O? z%7tqV#VVk7!Ql>na4vYFNw6i?^uj9IyWwG_rsW~z#5rVHgT9PBCH9~X#Cq;f*EdZw z51^ISf!N^tYwlrJsu9*W;2YB0;uor@}@fIRIjJcQ+-IPNa5)YnGIh zP-$st9@p2=0sgxME7ouneJ(qlvJEc~o?ULymLFeD`(Axq(iNgsvON@kLQD=JBVW&2 z=3s#-d=c=V#S-v?AbJs9FWfpMHB*TX;~?)Tepr{T3Sa0G^o>K z%d@q$m5x8|IGS?E6mpVIRzykwj>Tx_uHDqw*hsNhY?$k-D2~H^dfot<6O)zw99Z5=|1x83$#y6s!H z<_&JZ+nbx4Y39tC^zf>m(>MS1CI-%-j*bq#cDGzVc;S9M9L`d#Y6J!-#?3tU{k3;V zlqF>4Lc?O=KWXvBO0SNmcl{4M?RsnvAy$tTgiea(uMX#p3$&&UNUK(yi&lB?13 z<{EK*WSMk{6MsX#27P5z&C{K3Yw{$oM}s z5C+DR#6o{q{tHSiD=VWP{NQf7_nz-ld3iatx3>%H2*OjISKw4EdG3|UX32bR(VJa% zGF3|iMwEaY<0MSU%pQrIe3KLm7-WgPP$_?%vhNDy0W_QjHt{D<5$ z&&gpGzAI5>2muw7Qz4`AIsjs4XD2OLaymWn_@i{_p)-XaXX@4f8&nN&UwUa>UaTi? zLWU2A)!ODao>Hk_86Yb;MpSv|Vk)Vc67tYxgaVYnE1NP;lK*fLWkm{10Ul9hLu&=& zd0@=Ye`m3fD=CSIAOm|)1mKJIP*+z+O-)VoHy2+*_x;z8sG_1mJ}=Bd^TcJ)wt0=# zxa_RK`Hn~N+6F40_8G>mH;X{c^xqjW14v)BbC|nGSld*25gfWv=}hCBeyVc6*_dJN z#Pj?Vl>$Wk41gbd{0Tbi>~rZ4&;5p~tEvjj&OCW;q~`YQc}J)@lVt>2M&*oSwD&HG zlJ$qk4^AnGWgvA z$_~1c0y$PaIh}Q+2V(2*r3gmVXw*@*Me57Nkotd%Q?2f zSe`(NU{IssJLw7|u|Jr_Bs*Ir`Oh%zq69@jrBKgaUca9H^2~E+%N9^?gHU#%G>CjC z*?_g#-O70EWy@HDtSM5g&6q(YLGW0cxpqJ%U>AtO0z-#EPO}S8vZ2yf*&57c>f?3b z0pOy1_0^4Hl+@SPjSKaLmy{(zR2AQwomugwCV@E!h&5A>w$l&c=`t?T`ceR~l7T8e zctC_>vBLWS(2BB)6M<2wWsa1yDUAFqhJw#*ju0t~jBJqA70j^WpaB)fM~Yb&FNeaP z2>BcEjff*?u$hSTT`1ole5XcecGTC%aF_gFqqyo@@edW2gEL=q;?Q3J$E@GeWNxTR zPhVXqd*(=3354E+prqoGvA8!SXskicJz%gzfUHlK3dP)sQx`#v28mwyNmBupyi+zf z6gfV2JAIxhbsyTZp0PL-D@Mu{YBVNXPTP3Xv1kys&QJ}ZFQ2)6T^d7OL#WS`dRb&R zhO9kplOvXgBAAI_Ru>m#PZiip@Hp(i$7iD6<$B?inr2C{H?lR66rGwT)zv`CxKL%3 zQnC-mL#uBPY?7_&YJgH-8{!U5iqU4JR(*<+gAxT;Ge#EcHKY&`b#f@SSY0xN*;^;6cZU^4RXy9r-d`C#F=l>KwFz|0^peGg)_6rU261Nq@|1s zd;8fp;b;JAl@CUip;96eRJU-MP%LGoOL!s(yLN04#R1OxOqmv$3x~YiP`a%MMpuf# zRi;d5PWa_xOvRE|*hQ6xevT?&2m4<)gHdn(+*F4&yp7EiiPp(zr2_8?;@%8W)a zc(EcR#Uo``%AAdy#1@I5+ZOe=cT?Ne=Ts%t&{>_n_$SbH3Qdu$xLPLJGwMsVJyJy- zq2~Oubb>el;$R5ZyPlg09l0!xy$mOJVV1WqQS0PmII)*wKWn5 zO~9JeImLz0TBL6U2Un{qO5`5t`&b+&EE~~%ROVDaO+D>ej(9|L-qNW6d)KcTR2his zLm;)sNEJobsk()ygc6_8F9PihP;KA*`fBlO43`KFDoSu5^y#O6O}lpOrU6~jAQ|us zFk*KoW!T@a5^^$-@wt(&cl9+ZC^;~Yb)Uw@xAVSFkj#Rzj)vpTl22!ZXOodG&giKe039SlWXpw>;B-lX;GH)K%~z5_6d zn)i>-2X!GkcJ8DXs+S zK|czl$fB)R?UBrXdo!q6_>?34B4(U<6K#Lw28vaEYS=b10hkEwM^RwGQe86&aH77; zCwEz@PubBk{mg%1ZEBHJqGl!;s=%|w>h5ORxA7N}7&KTyyg3vPMPoYjP4nGwD;Y^8 z?e^)@r(MO=ezy3c2W#q-3udk`!mH3>tsv7gEco&OSW2DSsOqrKGsrio8pcq=6qTv8 z`rq9A?c)z!07P(3nnz`22{akFHbUl0--pcERRui`y8!1>N$p`Q2%b=tM%IC06^gup@xlPlzVLR|iI=mWbHlad zx+_h~8_(0bEbJ{7cH|GQ3g$&_$^nv)&VOi3hrVgKJV=GF9Gdd^^XZ5yeyRiyT%zU# zZkw;ijc5l-5Ws_{ExAGg9MQPSirduR+)D4Px;DD^-Tr_qY{M>*){5x-hsJcU*K=+3 z0O(1_FQudYVYOs8B2iHdXySS7FfLH9$#Q4@)eqAlCtnl^aFET3$8G%YD_K76)Oi>A zl}qH!IAta|Du8ZM===xMI#^~QpgX~%kER9Jtz|#Q7ewC-YLzDj^{Td%7+2-2<7nZE zHB`6g6d89Ez|!t4j+PVGu@(GV(L6@dA8urQ;Y0zikg|q>_Px|_>=}}QuST8`8aI{J z5ld9iq{SDpz^sxQIG1Bz&{m9MB`r$3VATP^VDP3by`EXby;M?FEvqx6=j&F(=->J7 zqu-_ve)q#sHQ*a@^F7jKupQf8V9@%dF&+A*=}eFG^FY0GJyk?_)MBRSv#Gyz7xjGb zW~x3VY9)*n<*J}VkNCl>=blLOSQDCZ(ghMmLPcq~O_`!#0KDU=yG5IjGKEnzP1%oL zofh-2W@&hI*rm6tR+3J1pJWL@#??ch+8)K=(pR461QVuo%>wV55bOfM6Dny_{0?^| zylHUuh%cfyU=QKGO5nj@5$`_sZQ8x&4vL{0!YKDG+5fJyx+&^hR^HJ!P1L&x$t&(f zES)kH#zHYTYL&r8uzcZOg)m7?lApUP!%zb;GIrKcmMP+KctQO{L<0_Y_=DlDgf}g! z^`+d_RRn?g1`lp}aiyl<(f1TBNdII|Gz175)1hygI8zL35bs^kS6&e=YL#J{qS6yN zA3@qFtVa~VfTECXllG>i`MGNS>#6?9PEu4cX%oo;8c}5gJrR>b$OsV)INS&AO0Ih` zLl1_U1}y?YZhzbQ76jw~Xiy_+PSBVRebbOufUZ-6>B&K_3>1UIKY#!MDm_t%h_E`M z=Bmo5Rdm>(OQLGcZs|6Vwo3kE-vLsmklBO86XZo8Y%jY&fQ|JJ(VSYdGdu$T8?bg&krugbPXtdAo%4H09=QW0iJ9k$oJIr7%J^DUe`@I^qleem1w3%e`iP7PzQ zJA)~ppfMf#rlGADRyzFA!DI}2Wb6x~c4janFE7|LE7t(V>mX1MJ& z0&w9E#@OIZgR=*|2-GnKV<{LcW46yovPUI@%wHmHy{ZpCMkh!IyCzt}r{HR7?x#=< z-m}wHDYTtj8nr!A;^%M7WChg#1o=%?&;kX2ORyv&w~M^&l3lb z6-(`tn%)eic)(^J6C-S)Ex8Qzn75WFD$FvcLno%s4>mrWfUSimZfqz6xC8z8f9Rk^ U=pF literal 0 HcmV?d00001 diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..74458a5ee85ad0ead503cd81e40184d45487beda GIT binary patch literal 3507 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/app-icon.png b/src-tauri/icons/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9fb74d6b8db09b0c3dc84a5f4a2af8f1f3bea4 GIT binary patch literal 11600 zcmeHNdrVVT82?)OfbuB9hA%7_d;}N>b4Hig6$hpg9s;E_4niAQUS!J(^;@n~T@rVCCpTg64An~&^PNZjn5?vY(dTDRQU)wXx{wx}iehjYfnI|Km-8M`5W@e0C>zJ55fgZrC*e80LYk|pSP~OdH>Yp z=okIcvFeG+w>f=jr_Uvtd3&yJPCO=fYx}cRIhT_5*MI8!Xn&V;!O64xp5tEhj?p)0 z?+QAGQPg_XY8Nv#T!?2&4RF{>5Q`ef2FMRkEFe5Un8-u{+82-w5G6pA08s)&2@oZC ztlOcR^53N0dSYV0$pb$f4&Y6r-ZLB^Teui~03c^bvZXOsR|m-eyDjqhKbAWd!r=&j zCFEj3kH-(4`2fT*ZR^Q~631fri&0ReG-kSs$QGU^fdg1QIm)+|>N?=N#Q=>((j&xb zi!%;;kvUEd^~)2ywUmyVWdN{kqmH)E#kY%Ww;An;Dsg)AI$a;MngXJc5RuZD)|{^! zhSn}dR7xFe@4#=1Y-8*wrTF1Q*;Hry1im^lI7(qmZ7$Ls4k|<$O?IJDSl zH;pYKD}PJn0-V8XMAZt%R5q28R&JIvVj@fqS3FnapByp|qD+MSbtzAl;0a%ydj#NJsU6Fv@ii*N0EAFgp#H`W{K9 zO+u+pDMNdj<&h(DUq|B}2A!wD^p1+W%$+KwmsTykKTqa>FmgoY>udbre#hg3l5|@& zWjeJgMB|s*L1?k-MH9^4a(C+UpPf2mP;B zpOuc;TH^RKBX~#&bt-+icu8mPiGSjQyMI%@v>fx1`giJ?v)g(phS4Q7|M)bq2tjD? z3X0(PmA>UuB|&l@va;RAL_(&b=g@h#)T z2{zRWdZyUm>*+eCmMzEA0rh;Q9zv1l;ARjBIdPcI07X zVfJx;fEM?W+xXT^I+LtIJeOejb?i_)?6fd>xs{aT)<%0uWLvi|;g1Xf1=s$6u$pL2Dm@J+!f}PhS7G3}e|XPuv$7_xr_*Yi_3SnDLvUwe#edL-%+i__Vu4Yre)gUgDi2;C~m z)L0-rP4s%M4VjtLjjD8t-%c#pt3e%hS6imrlH7c1cZNRMg zscg7pS4V4@{|2yi{wradP&5Ep eDVgKa+Wy+0G4t0K=MBBAY5y1KVFQ2w literal 0 HcmV?d00001 diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..756b80512b992fe0aee6021749785ac6c6cb4e84 GIT binary patch literal 135932 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 ZZy+1N@%PUem^d5uUc0+K{qL#ze*wChPVE2y literal 0 HcmV?d00001 diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c8de9b9ba0953bb7b6b2427d8b9ad2a5f6d2b2dd GIT binary patch literal 32896 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..22a87192957523928b5750596831e15bcb05557f GIT binary patch literal 32585 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 Dt5F7H literal 0 HcmV?d00001 diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..a468df2 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,8 @@ +// Prevents additional console window on Windows in release +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + tauri::Builder::default() + .run(tauri::generate_context!()) + .expect("error while running Maine DOC Insight application"); +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..3600b84 --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,47 @@ +{ + "$schema": "../node_modules/@tauri-apps/cli/schema.json", + "build": { + "beforeDevCommand": "npm run dev", + "beforeBuildCommand": "npm run build", + "devPath": "http://localhost:5173", + "distDir": "../dist" + }, + "package": { + "productName": "Maine DOC Insight", + "version": "0.1.0" + }, + "tauri": { + "allowlist": { + "dialog": { "open": true }, + "fs": { "readFile": true, "scope": ["**"] } + }, + "bundle": { + "active": true, + "category": "Utility", + "copyright": "", + "deb": { "depends": [] }, + "externalBin": [], + "icon": ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"], + "identifier": "gov.maine.doc.insight", + "longDescription": "Maine DOC Education Program Analytics", + "macOS": { "entitlements": null, "exceptionDomain": "", "frameworks": [], "providerShortName": null, "signingIdentity": null }, + "resources": [], + "shortDescription": "DOC Education Analytics", + "targets": "all", + "windows": { "certificateThumbprint": null, "digestAlgorithm": "sha256", "timestampUrl": "" } + }, + "security": { "csp": null }, + "updater": { "active": false }, + "windows": [ + { + "fullscreen": false, + "height": 900, + "resizable": true, + "title": "Maine DOC Insight", + "width": 1400, + "minWidth": 1024, + "minHeight": 700 + } + ] + } +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..6679ff6 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,282 @@ +import { useState, useCallback, useEffect } from "react"; +import "./app.css"; +import { FileLoader } from "./components/FileLoader"; +import { HomeView } from "./views/HomeView"; +import { ProgramsView } from "./views/ProgramsView"; +import { ResidentsView } from "./views/ResidentsView"; +import { FacilitiesView } from "./views/FacilitiesView"; +import { ComparisonView } from "./views/ComparisonView"; +import { DataQualityView } from "./views/DataQualityView"; +import { ChatDrawer, CHAT_DRAWER_WIDTH } from "./components/chat/ChatDrawer"; +import { ingestFiles } from "./lib/ingest"; +import { generateMockData, type DemoScenario } from "./data/mockData"; +import { DataQualityProvider } from "./contexts/DataQualityContext"; +import type { ParsedData, MetricSnapshot, PendingPrompt, MetricKey, MetricQualityMap } from "./types"; + +type View = "load" | "dashboard" | "quality" | "programs" | "residents" | "facilities" | "comparison"; + +interface NavItem { id: View; label: string; icon: string } + +const NAV_ITEMS: NavItem[] = [ + { id: "dashboard", label: "Home", icon: "◈" }, + { id: "quality", label: "Data Quality", icon: "◎" }, + { id: "programs", label: "Programs", icon: "▦" }, + { id: "residents", label: "Residents", icon: "◉" }, + { id: "facilities", label: "Facilities", icon: "▣" }, + { id: "comparison", label: "DOC & UL", icon: "⇄" }, +]; + +// Metrics that belong to each view — used to compute per-tab quality indicators +const VIEW_METRICS: Partial> = { + dashboard: ["nearReleaseEngagement", "equitySummary", "qolSignals"], + programs: ["programCompletion", "completionByRisk", "attendanceCorrelation", "timeToCompletion", "completionTrends"], + residents: ["completionByEducation", "completionByRiskOffense"], + facilities: ["facilityMixAdjusted"], + comparison: ["docUlGap"], +}; + +function viewQualityStatus( + view: View, + metricQuality: MetricQualityMap, +): "ok" | "warning" | "blocked" { + const keys = VIEW_METRICS[view] ?? []; + const statuses = keys.map(k => metricQuality[k]?.status ?? "ok"); + if (statuses.includes("blocked")) return "blocked"; + if (statuses.includes("warning")) return "warning"; + return "ok"; +} + +function makeSnapshot(_data: ParsedData, signatures: Record): MetricSnapshot { + const today = new Date(); + const asOf = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, "0")}-${String(today.getDate()).padStart(2, "0")}`; + return { + id: crypto.randomUUID(), + computed_at: today.toISOString(), + as_of_date: asOf, + source_signatures: signatures, + schema_version: "v1.0", + }; +} + +export default function App() { + const [view, setView] = useState("load"); + const [data, setData] = useState(null); + const [snapshot, setSnapshot] = useState(null); + const [isDemo, setIsDemo] = useState(false); + const [chatDemoMode, setChatDemoMode] = useState(false); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [pendingPrompt, setPendingPrompt] = useState(null); + const [chatOpen, setChatOpen] = useState(false); + const [theme, setTheme] = useState<"dark" | "light">(() => + (localStorage.getItem("theme") as "dark" | "light") ?? "dark" + ); + + useEffect(() => { + document.documentElement.setAttribute("data-theme", theme); + localStorage.setItem("theme", theme); + }, [theme]); + + const loadDemo = useCallback((scenario: DemoScenario = "messy") => { + setLoading(true); + setError(null); + setTimeout(() => { + try { + const d = generateMockData(scenario); + setData(d); + setSnapshot(makeSnapshot(d, { demo: "mock-data" })); + setIsDemo(true); + setView(d.qualityReport.overallGrade !== "good" ? "quality" : "dashboard"); + } catch (e) { + setError(String(e)); + } finally { + setLoading(false); + } + }, 50); + }, []); + + const loadFiles = useCallback(async (files: Record) => { + setLoading(true); + setError(null); + try { + const d = await ingestFiles(files); + const sigs: Record = {}; + for (const [name, file] of Object.entries(files)) { + sigs[name] = `${file.size}`; + } + setData(d); + setSnapshot(makeSnapshot(d, sigs)); + setIsDemo(false); + setView(d.qualityReport.overallGrade !== "good" ? "quality" : "dashboard"); + } catch (e) { + setError(`Ingestion error: ${e}`); + } finally { + setLoading(false); + } + }, []); + + const reset = () => { setData(null); setSnapshot(null); setView("load"); setIsDemo(false); setError(null); }; + + return ( +