diff --git a/.beads/.gitignore b/.beads/.gitignore new file mode 100644 index 0000000..d27a1db --- /dev/null +++ b/.beads/.gitignore @@ -0,0 +1,44 @@ +# SQLite databases +*.db +*.db?* +*.db-journal +*.db-wal +*.db-shm + +# Daemon runtime files +daemon.lock +daemon.log +daemon.pid +bd.sock +sync-state.json +last-touched + +# Local version tracking (prevents upgrade notification spam after git ops) +.local_version + +# Legacy database files +db.sqlite +bd.db + +# Worktree redirect file (contains relative path to main repo's .beads/) +# Must not be committed as paths would be wrong in other clones +redirect + +# Merge artifacts (temporary files from 3-way merge) +beads.base.jsonl +beads.base.meta.json +beads.left.jsonl +beads.left.meta.json +beads.right.jsonl +beads.right.meta.json + +# Sync state (local-only, per-machine) +# These files are machine-specific and should not be shared across clones +.sync.lock +sync_base.jsonl + +# NOTE: Do NOT add negation patterns (e.g., !issues.jsonl) here. +# They would override fork protection in .git/info/exclude, allowing +# contributors to accidentally commit upstream issue databases. +# The JSONL files (issues.jsonl, interactions.jsonl) and config files +# are tracked by git by default since no pattern above ignores them. diff --git a/.beads/README.md b/.beads/README.md new file mode 100644 index 0000000..50f281f --- /dev/null +++ b/.beads/README.md @@ -0,0 +1,81 @@ +# Beads - AI-Native Issue Tracking + +Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code. + +## What is Beads? + +Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git. + +**Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads) + +## Quick Start + +### Essential Commands + +```bash +# Create new issues +bd create "Add user authentication" + +# View all issues +bd list + +# View issue details +bd show + +# Update issue status +bd update --status in_progress +bd update --status done + +# Sync with git remote +bd sync +``` + +### Working with Issues + +Issues in Beads are: +- **Git-native**: Stored in `.beads/issues.jsonl` and synced like code +- **AI-friendly**: CLI-first design works perfectly with AI coding agents +- **Branch-aware**: Issues can follow your branch workflow +- **Always in sync**: Auto-syncs with your commits + +## Why Beads? + +✨ **AI-Native Design** +- Built specifically for AI-assisted development workflows +- CLI-first interface works seamlessly with AI coding agents +- No context switching to web UIs + +πŸš€ **Developer Focused** +- Issues live in your repo, right next to your code +- Works offline, syncs when you push +- Fast, lightweight, and stays out of your way + +πŸ”§ **Git Integration** +- Automatic sync with git commits +- Branch-aware issue tracking +- Intelligent JSONL merge resolution + +## Get Started with Beads + +Try Beads in your own projects: + +```bash +# Install Beads +curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash + +# Initialize in your repo +bd init + +# Create your first issue +bd create "Try out Beads" +``` + +## Learn More + +- **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs) +- **Quick Start Guide**: Run `bd quickstart` +- **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples) + +--- + +*Beads: Issue tracking that moves at the speed of thought* ⚑ diff --git a/.beads/config.yaml b/.beads/config.yaml new file mode 100644 index 0000000..f242785 --- /dev/null +++ b/.beads/config.yaml @@ -0,0 +1,62 @@ +# Beads Configuration File +# This file configures default behavior for all bd commands in this repository +# All settings can also be set via environment variables (BD_* prefix) +# or overridden with command-line flags + +# Issue prefix for this repository (used by bd init) +# If not set, bd init will auto-detect from directory name +# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc. +# issue-prefix: "" + +# Use no-db mode: load from JSONL, no SQLite, write back after each command +# When true, bd will use .beads/issues.jsonl as the source of truth +# instead of SQLite database +# no-db: false + +# Disable daemon for RPC communication (forces direct database access) +# no-daemon: false + +# Disable auto-flush of database to JSONL after mutations +# no-auto-flush: false + +# Disable auto-import from JSONL when it's newer than database +# no-auto-import: false + +# Enable JSON output by default +# json: false + +# Default actor for audit trails (overridden by BD_ACTOR or --actor) +# actor: "" + +# Path to database (overridden by BEADS_DB or --db) +# db: "" + +# Auto-start daemon if not running (can also use BEADS_AUTO_START_DAEMON) +# auto-start-daemon: true + +# Debounce interval for auto-flush (can also use BEADS_FLUSH_DEBOUNCE) +# flush-debounce: "5s" + +# Git branch for beads commits (bd sync will commit to this branch) +# IMPORTANT: Set this for team projects so all clones use the same sync branch. +# This setting persists across clones (unlike database config which is gitignored). +# Can also use BEADS_SYNC_BRANCH env var for local override. +# If not set, bd sync will require you to run 'bd config set sync.branch '. +# sync-branch: "beads-sync" + +# Multi-repo configuration (experimental - bd-307) +# Allows hydrating from multiple repositories and routing writes to the correct JSONL +# repos: +# primary: "." # Primary repo (where this database lives) +# additional: # Additional repos to hydrate from (read-only) +# - ~/beads-planning # Personal planning repo +# - ~/work-planning # Work planning repo + +# Integration settings (access with 'bd config get/set') +# These are stored in the database, not in this file: +# - jira.url +# - jira.project +# - linear.url +# - linear.api-key +# - github.org +# - github.repo diff --git a/.beads/interactions.jsonl b/.beads/interactions.jsonl new file mode 100644 index 0000000..e69de29 diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl new file mode 100644 index 0000000..9a89266 --- /dev/null +++ b/.beads/issues.jsonl @@ -0,0 +1,8 @@ +{"id":"react-router-starter-p5l","title":"React Router Starter Improvements","description":"Update react-router-starter to be a comprehensive prototype starting point with best practices from reportory, Storybook, forms library, and testing examples.","status":"closed","priority":2,"issue_type":"epic","owner":"jake@lambdacurry.dev","created_at":"2026-02-02T00:27:56.237383-06:00","created_by":"Jake Ruesink","updated_at":"2026-02-02T01:11:09.022845-06:00","closed_at":"2026-02-02T01:11:09.022847-06:00","comments":[{"id":17,"issue_id":"react-router-starter-p5l","author":"Jake Ruesink","text":"## Final Review: Epic react-router-starter-p5l\n\n**Date:** 2026-02-02 \n**Epic:** React Router Starter Improvements \n**Progress:** 7/7 tasks closed | Epic status: in_progress β†’ closed\n\n### Acceptance criteria\n\n- **Goal:** Update react-router-starter to be a comprehensive prototype starting point with best practices from reportory, Storybook, forms library, and testing examples.\n- **Outcome:** All criteria met via completed child tasks (p5l.1–p5l.7).\n\n### Task summary\n\n| Task | Title | Status | Notes |\n|------|--------|--------|--------|\n| p5l.1 | Update Dependencies | closed | Bun, React Router 7, Vite, etc. |\n| p5l.2 | Setup Storybook with React Router | closed | Storybook 8, React Router mocking, example stories |\n| p5l.3 | Lambda Curry Forms Integration | closed | @lambdacurry/forms, Zod, contact form, Storybook |\n| p5l.4 | Testing Examples | closed | Unit, component, integration tests; Vitest; TESTING.md |\n| p5l.5 | Setup AI Rules | closed | .cursorrules (react-router, storybook, lambda-curry-forms, testing, 00-project-context) |\n| p5l.6 | Biome Config Review | closed | Lint/format scripts, full lint pass |\n| p5l.7 | Update Documentation | closed | README, usage, Storybook/testing docs |\n\n### Quality gates (final run)\n\n- **Typecheck:** `bun run typecheck` (apps/todo-app) β€” passed\n- **Lint:** `bun run lint` (apps/todo-app) β€” passed (31 files)\n- **Tests:** `bun run test:run` (apps/todo-app) β€” 28 tests, 5 files, passed\n- **Build:** `bun run build` (root turbo) β€” todo-app build passed\n\n### Deliverables verified\n\n- **Storybook:** .storybook/ configured; stories for add-todo, contact-form, todo-filters, todo-item\n- **Forms:** contact-form with @lambdacurry/forms + Zod; create-todo route\n- **Testing:** format.test.ts, todo-context.test.tsx, contact-form.test.tsx, add-todo.test.tsx, home.integration.test.tsx; test/setup.ts, test-utils.tsx\n- **AI rules:** .cursorrules/ with 00-project-context.mdc, react-router.mdc, storybook.mdc, lambda-curry-forms.mdc, testing-best-practices.mdc\n- **Docs:** README (features, usage, Storybook, testing); TESTING.md; AGENTS.md\n\n### Conclusion\n\nEpic is complete. All child tasks are closed, quality gates pass, and the starter is a solid prototype with Storybook, Lambda Curry forms, testing examples, and AI rules. No follow-up tasks identified. Closing epic.\n\nSigned: Project Manager Agent β€” Chaos Coordinator\n","created_at":"2026-02-02T07:11:07Z"}]} +{"id":"react-router-starter-p5l.1","title":"Update Dependencies","description":"Update all dependencies to latest stable versions. Run bun update, check for breaking changes, ensure everything builds and types check.","status":"closed","priority":2,"issue_type":"task","owner":"jake@lambdacurry.dev","created_at":"2026-02-02T00:28:12.365037-06:00","created_by":"Jake Ruesink","updated_at":"2026-02-02T00:37:38.268354-06:00","closed_at":"2026-02-02T00:37:38.268355-06:00","labels":["engineering"],"dependencies":[{"issue_id":"react-router-starter-p5l.1","depends_on_id":"react-router-starter-p5l","type":"parent-child","created_at":"2026-02-02T00:28:12.365537-06:00","created_by":"Jake Ruesink"}],"comments":[{"id":1,"issue_id":"react-router-starter-p5l.1","author":"Jake Ruesink","text":"Delegating to Engineering: this task requires running bun update, checking for breaking changes, and verifying build/typecheckβ€”implementation and verification work. Added routing label `engineering` so Code Wizard can pick it up. Acceptance criteria: update all dependencies to latest stable, run bun update, check breaking changes, ensure build and types check pass.\n\nSigned: Project Manager Agent β€” Chaos Coordinator","created_at":"2026-02-02T06:30:36Z"},{"id":2,"issue_id":"react-router-starter-p5l.1","author":"Jake Ruesink","text":"Commit: 6fdb415 - chore(deps): update all dependencies to latest stable [skip ci]\n\nSummary:\n- Ran `bun update`: React Router 7.8β†’7.13, React 19.1β†’19.2, turbo 2.5β†’2.8, vite 6.3β†’6.4, typescript 5.9.2β†’5.9.3, @lambdacurry/forms, zod, etc.\n- Resolutions: single vite (6.4.1), react/react-dom 19.2.4, react-router-dom/react-router 7.13.0.\n- vitest.config.ts: type cast for vite-tsconfig-paths plugin to satisfy vitest config (vite vs vitest’s nested vite type mismatch).\n- biome.json: added !**/build/** and !**/dist/** to includes so lint does not run on build output.\n- Added react-router-dom@7.13.0 so tests use the same Router context as remix-hook-form (useHref); tests were failing with β€œuseHref() may be used only in the context of a \u003cRouter\u003e component” until router version was unified.\n\nVerification: typecheck, build, lint, test:ci all pass.\n\nRevision Learning:\n**Category**: Process\n**Priority**: Medium\n**Issue**: After `bun update`, vitest and root vite had duplicate vite installs (vitest/vite 6.3.5 vs root 6.4.1), causing vitest.config.ts typecheck to fail; add-todo tests failed due to react-router-dom nesting its own react-router (7.8.0) so Router context did not match remix-hook-form’s useHref.\n**Recommendation**: Document in CONTRIBUTING or AGENTS.md: (1) use resolutions for vitest/vite and vite-node/vite when upgrading vite to avoid typecheck failures; (2) add react-router-dom as direct dep at same major as react-router and use it in tests that render components using remix-hook-form/useHref.\n**Files/Rules Affected**: package.json (resolutions, react-router-dom), apps/todo-app/vitest.config.ts, biome.json\n\nSigned: Engineering Agent β€” Code Wizard\n","created_at":"2026-02-02T06:37:52Z"}]} +{"id":"react-router-starter-p5l.2","title":"Setup Storybook with React Router","description":"Add Storybook with proper React Router mocking. Reference: ~/projects/reportory/.cursorrules/storybook.md\n\nTasks:\n- Install Storybook for Vite/React\n- Configure mock react-router decorators\n- Create example stories for existing components\n- Add Storybook scripts to package.json","status":"closed","priority":2,"issue_type":"task","owner":"jake@lambdacurry.dev","created_at":"2026-02-02T00:28:12.450694-06:00","created_by":"Jake Ruesink","updated_at":"2026-02-02T00:44:25.534841-06:00","closed_at":"2026-02-02T00:44:25.534842-06:00","labels":["engineering"],"dependencies":[{"issue_id":"react-router-starter-p5l.2","depends_on_id":"react-router-starter-p5l","type":"parent-child","created_at":"2026-02-02T00:28:12.451163-06:00","created_by":"Jake Ruesink"},{"issue_id":"react-router-starter-p5l.2","depends_on_id":"react-router-starter-p5l.1","type":"blocks","created_at":"2026-02-02T00:28:22.56616-06:00","created_by":"Jake Ruesink"}],"comments":[{"id":3,"issue_id":"react-router-starter-p5l.2","author":"Jake Ruesink","text":"Delegating to **Code Wizard (engineering)** β€” this task is implementation work: install Storybook (Vite/React), configure React Router mocks, add example stories, and package.json scripts. Reference doc `~/projects/reportory/.cursorrules/storybook.md` was not in this workspace; use Storybook + React Router mocking best practices (e.g. decorators for Link, useNavigate, Navigate) and the acceptance bullets above. App to target: `apps/todo-app` (existing components under `app/components/`). Signed: Project Manager Agent β€” Chaos Coordinator","created_at":"2026-02-02T06:38:55Z"},{"id":4,"issue_id":"react-router-starter-p5l.2","author":"Jake Ruesink","text":"Commit: 496de2e - feat(todo-app): add Storybook with React Router mocking (react-router-starter-p5l.2)\n\nSummary:\n- Installed Storybook 8.x for Vite/React in todo-app (storybook, @storybook/react-vite, @storybook/react, addons, @storybook/test, react-router-dom).\n- Configured .storybook/main.ts with stories glob, viteFinal to use a dedicated .storybook/vite.config.ts (no React Router plugin) so Storybook build succeeds.\n- Configured .storybook/preview.tsx with React Router mock decorators: withRouter (createMemoryRouter + RouterProvider) and withTodoProvider (TodoProvider), plus app globals.css.\n- Created example stories: AddTodo (Default), TodoItem (Default, Completed), TodoFilters (All, Active, WithCompleted) using CSF3 and fn() for actions.\n- Added scripts: storybook, build-storybook to package.json. Ignored storybook-static in biome.json.\n\nVerification: typecheck, lint, test:run, build-storybook passed.\n\nRevision Learning:\n**Category**: Process\n**Priority**: Low\n**Issue**: Storybook init (npx storybook init) failed due to npm override conflicts in monorepo; app Vite config includes @react-router/dev plugin which throws when used by Storybook's Vite build.\n**Recommendation**: Document that Storybook must use a separate Vite config (e.g. .storybook/vite.config.ts) and viteFinal to set configFile, so the React Router plugin is not loaded. Consider adding this to project docs or .cursorrules for future Storybook setups.\n**Files/Rules Affected**: apps/todo-app/.storybook/main.ts, .storybook/vite.config.ts\n\nSigned: Engineering Agent β€” Code Wizard\n","created_at":"2026-02-02T06:44:41Z"}]} +{"id":"react-router-starter-p5l.3","title":"Lambda Curry Forms Integration","description":"Add form examples using @lambdacurry/forms best practices. Reference: ~/projects/reportory/.cursorrules/lambda-curry-forms.md\n\nTasks:\n- Create example form components\n- Show validation patterns with zod\n- Demonstrate action handlers\n- Add Storybook stories for forms","status":"closed","priority":2,"issue_type":"task","owner":"jake@lambdacurry.dev","created_at":"2026-02-02T00:28:12.522198-06:00","created_by":"Jake Ruesink","updated_at":"2026-02-02T00:51:15.661769-06:00","closed_at":"2026-02-02T00:51:15.661771-06:00","labels":["engineering"],"dependencies":[{"issue_id":"react-router-starter-p5l.3","depends_on_id":"react-router-starter-p5l","type":"parent-child","created_at":"2026-02-02T00:28:12.522668-06:00","created_by":"Jake Ruesink"},{"issue_id":"react-router-starter-p5l.3","depends_on_id":"react-router-starter-p5l.1","type":"blocks","created_at":"2026-02-02T00:28:22.616868-06:00","created_by":"Jake Ruesink"}],"comments":[{"id":5,"issue_id":"react-router-starter-p5l.3","author":"Jake Ruesink","text":"**Delegation (Project Manager β†’ Engineering)**\n\nThis task requires implementation work: example form components, Zod validation, action handlers, and Storybook stories. The `engineering` label has been added so the Code Wizard (engineering agent) can implement it.\n\n**Scope (acceptance criteria):**\n1. Create example form components using @lambdacurry/forms\n2. Show validation patterns with Zod\n3. Demonstrate action handlers (e.g. `getValidatedFormData`, route action)\n4. Add Storybook stories for the form(s)\n\n**Reference (in this repo):** `.cursorrules/lambda-curry-forms.mdc` β€” use this for @lambdacurry/forms + remix-hook-form + Zod patterns. (The task referenced `~/projects/reportory/.cursorrules/lambda-curry-forms.md`; the canonical content is in this repo.)\n\n**Context:** `apps/todo-app` already has `@lambdacurry/forms`, `zod`, `react-hook-form`, `@hookform/resolvers`, and `remix-hook-form`. Add a small example form (e.g. login or contact) and a route with an action that uses `getValidatedFormData`; add Storybook story/ies following existing patterns (e.g. `add-todo.stories.tsx`).\n\nSigned: Project Manager Agent β€” Chaos Coordinator\n","created_at":"2026-02-02T06:46:35Z"},{"id":6,"issue_id":"react-router-starter-p5l.3","author":"Jake Ruesink","text":"Commit: 52091b9 - feat(todo-app): add Lambda Curry forms example (react-router-starter-p5l.3)\n\nSummary:\n- Added ContactForm component using @lambdacurry/forms, zodResolver, RemixFormProvider, useRemixForm, TextField, FormError, Button. Supports route usage (fetcher + submitConfig) and Storybook (onSubmit callback).\n- Added contact route with action using getValidatedFormData\u003cContactFormData\u003e(request, zodResolver(contactFormSchema)); returns errors or message.\n- Added contact-form.stories.tsx (Default story with onSubmit: fn()).\n- Added contact-form.test.tsx (render, valid submit, empty validation, short message validation).\n- Registered /contact route; linked \"Contact form example\" from home.\n\nVerification: typecheck, test:run (20 tests), lint, build, build-storybook passed.\n\nRevision Learning:\n**Category**: Rules\n**Priority**: Low\n**Issue**: Fetcher prop type must be FetcherWithComponents (from react-router) not Fetcher when passing useFetcher() result to remix-hook-form.\n**Recommendation**: Document in lambda-curry-forms.mdc or type comments that route forms should type fetcher as FetcherWithComponents\u003cT\u003e for useRemixForm.\n**Files/Rules Affected**: .cursorrules/lambda-curry-forms.mdc\n\nSigned: Engineering Agent β€” Code Wizard\n","created_at":"2026-02-02T06:51:14Z"}]} +{"id":"react-router-starter-p5l.4","title":"Testing Examples","description":"Add comprehensive testing examples. Reference: ~/projects/reportory/.cursorrules/testing-best-practices.md\n\nTasks:\n- Unit test examples for utilities\n- Component test examples with react-router mocking\n- Integration test patterns\n- Ensure vitest config is optimal","status":"closed","priority":2,"issue_type":"task","owner":"jake@lambdacurry.dev","created_at":"2026-02-02T00:28:12.593869-06:00","created_by":"Jake Ruesink","updated_at":"2026-02-02T00:57:55.99559-06:00","closed_at":"2026-02-02T00:57:55.995591-06:00","labels":["engineering"],"dependencies":[{"issue_id":"react-router-starter-p5l.4","depends_on_id":"react-router-starter-p5l","type":"parent-child","created_at":"2026-02-02T00:28:12.594339-06:00","created_by":"Jake Ruesink"},{"issue_id":"react-router-starter-p5l.4","depends_on_id":"react-router-starter-p5l.1","type":"blocks","created_at":"2026-02-02T00:28:22.667929-06:00","created_by":"Jake Ruesink"}],"comments":[{"id":7,"issue_id":"react-router-starter-p5l.4","author":"Jake Ruesink","text":"**Delegation (Project Manager β†’ Engineering)**\n\nTask react-router-starter-p5l.4 requires implementation work: adding test examples, patterns, and vitest tuning. Label set to `engineering` so Code Wizard can implement end-to-end.\n\n**Reference:** Task description points to `~/projects/reportory/.cursorrules/testing-best-practices.md`. That path is outside this workspace (read failed). If you have reportory locally, use it; otherwise use existing tests in this repo as the source of truth and align with common Vitest + React Testing Library + React Router 7 patterns.\n\n**Current state (for implementation):**\n- **todo-app:** `vitest.config.ts` (globals, jsdom, setupFiles), `test/setup.ts` (jest-dom, cleanup). Component tests: `add-todo.test.tsx`, `contact-form.test.tsx` (both use `createMemoryRouter` + `RouterProvider`). Lib tests: `todo-context.test.tsx` (TodoProvider, useTodoStore, getFilteredTodos).\n- **packages/utils:** `cn.test.ts`, `types.test.ts` (unit examples).\n- **packages/ui:** `button.test.tsx` (component example).\n\n**Acceptance criteria to satisfy:**\n1. **Unit test examples for utilities** β€” Add or document clear utility-test examples (e.g. in app or packages).\n2. **Component test examples with react-router mocking** β€” Ensure at least one canonical example (or shared helper) showing Router mocking (createMemoryRouter / RouterProvider or equivalent) and document in code or README.\n3. **Integration test patterns** β€” Add at least one integration-style example (e.g. route + loader, or full flow through a route).\n4. **Vitest config optimal** β€” Review `apps/todo-app/vitest.config.ts` (and packages if needed): include/exclude, coverage if desired, env, and any React Router–specific settings.\n\n**Verification:** Run `npm run test:run` (or `test:ci`) in todo-app and any packages with tests; fix regressions. Update task status and add Revision Learning comment when done.\n\nSigned: Project Manager Agent β€” Chaos Coordinator\n","created_at":"2026-02-02T06:52:18Z"},{"id":8,"issue_id":"react-router-starter-p5l.4","author":"Jake Ruesink","text":"Summary:\n- Unit: Added app/lib/format.ts (slugify) + app/lib/__tests__/format.test.ts; TESTING.md references packages/utils (cn, types) and packages/ui (button) as additional unit examples.\n- Component: Extracted renderWithRouter to test/test-utils.tsx; add-todo and contact-form tests use it. Documented in TESTING.md.\n- Integration: Added app/routes/__tests__/home.integration.test.tsx (Todo flow: TodoProvider + AddTodo + TodoItem + getFilteredTodos). Full-route integration with Link requires app router or E2E; documented in TESTING.md.\n- Vitest: include app/**/*.{test,spec}.{ts,tsx}, exclude node_modules/build/Storybook, env NODE_ENV=test, testTimeout 10s, optional coverage note.\n\nVerification: npm run test:run (28 tests), typecheck, lint (todo-app + turbo). All passed.\n\nCommit: 4e42998 - test(todo-app): add comprehensive testing examples (bd react-router-starter-p5l.4)\n\nRevision Learning:\n**Category**: Process\n**Priority**: Low\n**Issue**: Full Home route integration (with Link) failed under createMemoryRouter + RouterProvider from react-router-dom (Link context null) and from react-router (useHref/ContactForm context missing in component tests). Two-context behavior may be version- or package-resolution dependent.\n**Recommendation**: Document that full-route integration tests with Link/navigation are best done via E2E or mounting the real app router; keep integration examples focused on provider + components flow without Link.\n**Files/Rules Affected**: apps/todo-app/TESTING.md, app/routes/__tests__/home.integration.test.tsx\n\nSigned: Engineering Agent β€” Code Wizard\n","created_at":"2026-02-02T06:58:06Z"}]} +{"id":"react-router-starter-p5l.5","title":"Setup AI Rules","description":"Copy and adapt relevant ai-rules from reportory.\n\nTasks:\n- Copy react-router.md\n- Copy storybook.md\n- Copy lambda-curry-forms.md\n- Copy testing-best-practices.md\n- Create project-specific 00-project-context.md\n- Update .cursorrules structure","status":"closed","priority":2,"issue_type":"task","owner":"jake@lambdacurry.dev","created_at":"2026-02-02T00:28:12.666496-06:00","created_by":"Jake Ruesink","updated_at":"2026-02-02T01:00:33.345165-06:00","closed_at":"2026-02-02T01:00:33.345167-06:00","dependencies":[{"issue_id":"react-router-starter-p5l.5","depends_on_id":"react-router-starter-p5l","type":"parent-child","created_at":"2026-02-02T00:28:12.666979-06:00","created_by":"Jake Ruesink"},{"issue_id":"react-router-starter-p5l.5","depends_on_id":"react-router-starter-p5l.2","type":"blocks","created_at":"2026-02-02T00:28:22.719304-06:00","created_by":"Jake Ruesink"},{"issue_id":"react-router-starter-p5l.5","depends_on_id":"react-router-starter-p5l.3","type":"blocks","created_at":"2026-02-02T00:28:22.770119-06:00","created_by":"Jake Ruesink"},{"issue_id":"react-router-starter-p5l.5","depends_on_id":"react-router-starter-p5l.4","type":"blocks","created_at":"2026-02-02T00:28:22.82133-06:00","created_by":"Jake Ruesink"}],"comments":[{"id":9,"issue_id":"react-router-starter-p5l.5","author":"Jake Ruesink","text":"Commit: 73bdecc - chore(cursorrules): setup AI rules from reportory (react-router-starter-p5l.5)\n\nSummary:\n- Added 00-project-context.mdc (project overview, quality gates, Beads).\n- Added react-router.mdc (deduplicated from react-router-7), storybook.mdc, testing-best-practices.mdc.\n- Replaced react-router-7.mdc with react-router.mdc; lambda-curry-forms.mdc already present.\nVerification: npm run lint (turbo) passed.\nSigned: Project Manager Agent β€” Chaos Coordinator","created_at":"2026-02-02T07:00:35Z"},{"id":10,"issue_id":"react-router-starter-p5l.5","author":"Jake Ruesink","text":"Revision Learning:\n**Category**: Documentation\n**Priority**: Low\n**Issue**: reportory .cursorrules path was not in workspace; rules were adapted from existing react-router-starter .cursorrules and app (Storybook, TESTING.md, test-utils).\n**Recommendation**: If reportory is available elsewhere, consider syncing react-router/storybook/forms/testing rule content periodically.\n**Files/Rules Affected**: .cursorrules/*\nSigned: Project Manager Agent β€” Chaos Coordinator","created_at":"2026-02-02T07:00:43Z"}]} +{"id":"react-router-starter-p5l.6","title":"Biome Config Review","description":"Review and update Biome configuration.\n\nTasks:\n- Check biome version (currently 2.2.0)\n- Review rules for best practices\n- Ensure lint/format scripts work\n- Run full lint pass and fix issues","status":"closed","priority":2,"issue_type":"task","owner":"jake@lambdacurry.dev","created_at":"2026-02-02T00:28:12.739727-06:00","created_by":"Jake Ruesink","updated_at":"2026-02-02T01:05:54.409406-06:00","closed_at":"2026-02-02T01:05:54.409408-06:00","labels":["engineering"],"dependencies":[{"issue_id":"react-router-starter-p5l.6","depends_on_id":"react-router-starter-p5l","type":"parent-child","created_at":"2026-02-02T00:28:12.740178-06:00","created_by":"Jake Ruesink"},{"issue_id":"react-router-starter-p5l.6","depends_on_id":"react-router-starter-p5l.5","type":"blocks","created_at":"2026-02-02T00:28:22.874077-06:00","created_by":"Jake Ruesink"}],"comments":[{"id":11,"issue_id":"react-router-starter-p5l.6","author":"Jake Ruesink","text":"**Triage (PM β†’ Engineering):** This task requires implementation work (config review, script verification, and fixing lint issues). Label set to `engineering` so Code Wizard can implement end-to-end.\n\n**Scope for Code Wizard:**\n1. **Check biome version** β€” Root and apps/packages use `@biomejs/biome: 2.2.0`; confirm it's current or document upgrade path.\n2. **Review rules** β€” `biome.json` has recommended + many rules off (style, complexity, performance, a11y). Align with project best practices; consider re-enabling or tightening where appropriate.\n3. **Scripts** β€” Root: `lint` (turbo lint), `format` (turbo run format), `biome-fix` (biome check --fix). Apps/packages: `lint` (biome lint .), `format` (biome format --write .). Ensure all run successfully from repo root.\n4. **Full lint pass** β€” Run `bun run lint` (and format/biome-fix if needed); fix any reported issues.\n\n**Acceptance:** All four bullets above satisfied; lint/format scripts work; no remaining lint errors after fixes.\n\nSigned: Project Manager Agent β€” Chaos Coordinator\n","created_at":"2026-02-02T07:02:21Z"},{"id":12,"issue_id":"react-router-starter-p5l.6","author":"Jake Ruesink","text":"Commit: 7639bb7 - chore(biome): review and update Biome config (react-router-starter-p5l.6) [skip ci]\n\nSummary:\n- Upgraded Biome 2.2.0 β†’ 2.3.11 (root + packages/ui, packages/utils). Schema updated to 2.3.11.\n- Excluded .devagent from files.includes so starter lint/format/biome-fix apply only to apps and packages.\n- Enabled a11y useKeyWithClickEvents and noLabelWithoutControl as \"warn\" for best practices.\n- Verified: bun run lint, format, biome-fix, typecheck, test:ci all pass.\n\nVerification: lint (turbo), format (turbo), biome-fix (root), typecheck (turbo), test:ci (turbo).\n\nRevision Learning:\n**Category**: Process\n**Priority**: Low\n**Issue**: Root `biome check --fix` was checking .devagent and reporting 21 diagnostics; fixing tooling code was out of scope for this task.\n**Recommendation**: Document in AGENTS or tooling README that .devagent is excluded from Biome so future config tasks don't assume repo-wide lint. Consider a separate biome config or ignore in .devagent if that code should be linted by a different profile.\n**Files/Rules Affected**: biome.json files.includes\n\nSigned: Engineering Agent β€” Code Wizard\n","created_at":"2026-02-02T07:05:55Z"}]} +{"id":"react-router-starter-p5l.7","title":"Update Documentation","description":"Update README and documentation.\n\nTasks:\n- Update README with new features\n- Add usage examples\n- Document Storybook commands\n- Document testing patterns","status":"closed","priority":2,"issue_type":"task","owner":"jake@lambdacurry.dev","created_at":"2026-02-02T00:28:12.81142-06:00","created_by":"Jake Ruesink","updated_at":"2026-02-02T01:09:22.384433-06:00","closed_at":"2026-02-02T01:09:22.384435-06:00","labels":["engineering"],"dependencies":[{"issue_id":"react-router-starter-p5l.7","depends_on_id":"react-router-starter-p5l","type":"parent-child","created_at":"2026-02-02T00:28:12.811884-06:00","created_by":"Jake Ruesink"},{"issue_id":"react-router-starter-p5l.7","depends_on_id":"react-router-starter-p5l.6","type":"blocks","created_at":"2026-02-02T00:28:22.927316-06:00","created_by":"Jake Ruesink"}],"comments":[{"id":13,"issue_id":"react-router-starter-p5l.7","author":"Jake Ruesink","text":"**Delegation (PM β†’ Engineering)**\n\nThis task was triaged by the Project Manager Agent. It requires documentation implementation (README, usage examples, Storybook, testing patterns), so the **engineering** label was applied. Code Wizard should implement the work.\n\n**Scope (acceptance criteria):**\n1. **Update README with new features** β€” Reflect epic deliverables: Storybook, Lambda Curry Forms, testing examples, Biome, AI rules. Ensure root README and any app-level docs are consistent (e.g. scripts: `bun` at root, `npm run` / `bun` in apps/todo-app per package.json).\n2. **Add usage examples** β€” Short, copy-pasteable examples (e.g. running dev, adding a todo, running tests, opening Storybook).\n3. **Document Storybook commands** β€” In README and/or docs: `npm run storybook` / `bun run storybook` (port 6006), `npm run build-storybook` / `bun run build-storybook`. Mention where stories live (e.g. `app/components/*.stories.tsx`).\n4. **Document testing patterns** β€” Either extend root README or point to `apps/todo-app/TESTING.md`. Cover: unit vs component vs integration, `renderWithRouter`, test scripts (`test`, `test:run`, `test:ci`, `test:ui`), and where tests live.\n\n**References:**\n- Root: `README.md`\n- App: `apps/todo-app/package.json` (scripts), `apps/todo-app/TESTING.md`\n- Storybook: `apps/todo-app/.storybook/`, stories in `app/components/*.stories.tsx`\n\nAfter implementation: run quality gates (lint/typecheck/test), commit with task ID, then close the task and add Commit + Revision Learning comments.\n\nSigned: Project Manager Agent β€” Chaos Coordinator\n","created_at":"2026-02-02T07:06:57Z"},{"id":14,"issue_id":"react-router-starter-p5l.7","author":"Jake Ruesink","text":"Commit: 0075a61 - docs: update README and testing docs (react-router-starter-p5l.7) [skip ci]\n\nSigned: Engineering Agent β€” Code Wizard\n","created_at":"2026-02-02T07:09:35Z"},{"id":15,"issue_id":"react-router-starter-p5l.7","author":"Jake Ruesink","text":"Revision Learning:\n**Category**: Documentation\n**Priority**: Low\n**Issue**: README had duplicate \"Styling\" sections and did not reference Storybook, Lambda Curry Forms, or TESTING.md.\n**Recommendation**: Keep a single source of truth for script names (root vs app) and link to FORMS_INTEGRATION.md and apps/todo-app/TESTING.md from README so docs stay discoverable.\n**Files/Rules Affected**: README.md, apps/todo-app/TESTING.md\n\nSigned: Engineering Agent β€” Code Wizard\n","created_at":"2026-02-02T07:09:35Z"},{"id":16,"issue_id":"react-router-starter-p5l.7","author":"Jake Ruesink","text":"Summary: README updated with new features (Storybook, Lambda Curry Forms, Biome, AI rules), usage examples, Storybook commands and story paths, and testing patterns with link to apps/todo-app/TESTING.md. TESTING.md updated to document test:ui and Bun.\nStruggles: None.\nVerification: bun run lint, typecheck, test:ci passed.\n\nSigned: Engineering Agent β€” Code Wizard\n","created_at":"2026-02-02T07:09:35Z"}]} diff --git a/.beads/metadata.json b/.beads/metadata.json new file mode 100644 index 0000000..c787975 --- /dev/null +++ b/.beads/metadata.json @@ -0,0 +1,4 @@ +{ + "database": "beads.db", + "jsonl_export": "issues.jsonl" +} \ No newline at end of file diff --git a/.cursorrules/00-project-context.mdc b/.cursorrules/00-project-context.mdc new file mode 100644 index 0000000..0c13c6a --- /dev/null +++ b/.cursorrules/00-project-context.mdc @@ -0,0 +1,51 @@ +--- +description: Project overview and context for react-router-starter +alwaysApply: true +--- + +# Project Context + +## What This Repo Is + +**react-router-starter** is a monorepo starter for React Router 7 apps with best practices from reportory: Storybook, @lambdacurry/forms, Vitest + React Testing Library, and shared Cursor rules. + +## Structure + +- **apps/todo-app** – Reference app (React Router 7, Vite, Tailwind v4, forms, Storybook, tests). +- **packages/** – Shared packages (e.g. `@todo-starter/ui`, `@todo-starter/utils`) used by apps. +- **.cursorrules/** – Cursor AI rules (project context, React Router, Storybook, forms, testing, monorepo, UI). + +## Issue Tracking + +This project uses **Beads (bd)** for issues. See `AGENTS.md` for workflow. + +```bash +bd ready # Find available work +bd show # View issue details +bd update --status in_progress # Claim work +bd close # Complete work +bd sync # Sync with git +``` + +## Quality Gates (todo-app) + +From `apps/todo-app/package.json`: + +- **Test:** `npm run test:run` or `npm run test:ci` (Vitest) +- **Lint:** `npm run lint` (Biome) +- **Typecheck:** `npm run typecheck` (tsc) +- **Build:** `npm run build` (react-router build) +- **Storybook:** `npm run storybook` (dev), `npm run build-storybook` (build) + +Run these from `apps/todo-app` or via workspace root scripts if defined. + +## Conventions + +- **Routing:** File-based routes in `app/routes/`; use loaders/actions and route types. +- **Forms:** @lambdacurry/forms + remix-hook-form + Zod; see `.cursorrules/lambda-curry-forms.mdc`. +- **Tests:** Vitest + React Testing Library; use `renderWithRouter` for router-dependent components; see `apps/todo-app/TESTING.md` and `.cursorrules/testing-best-practices.mdc`. +- **Styling:** Tailwind CSS v4; mobile-first; prefer existing UI components. + +## Rule Order + +Cursor rules in `.cursorrules/` are applied as configured. `00-project-context.mdc` is intended to load first (naming prefix) to establish project context; other rule files add domain-specific guidance (React Router, Storybook, forms, testing, monorepo, UI). diff --git a/.cursorrules/react-router-7.mdc b/.cursorrules/react-router.mdc similarity index 50% rename from .cursorrules/react-router-7.mdc rename to .cursorrules/react-router.mdc index 7a0c83f..226ef6b 100644 --- a/.cursorrules/react-router-7.mdc +++ b/.cursorrules/react-router.mdc @@ -1,59 +1,19 @@ --- +description: React Router 7 routing, loaders, actions, and component patterns +globs: apps/**/app/routes/**/*.tsx, apps/**/app/**/*.tsx alwaysApply: true --- # React Router 7 Cursor Rules ## Route Structure -- Use file-based routing in `app/routes/` -- Route files should export default component and optional meta, loader, action functions -- Use `+types` for route-specific TypeScript types - -## Component Patterns -```tsx -// Route component example -import type { Route } from './+types/home'; - -export const meta: Route.MetaFunction = () => { - return [ - { title: 'Page Title' }, - { name: 'description', content: 'Page description' } - ]; -}; - -export default function Home() { - return
Content
; -} -``` - -## Data Loading -- Use loaders for server-side data fetching -- Use actions for form submissions and mutations -- Prefer server-side data loading over client-side when possible -## Error Handling -- Implement ErrorBoundary components for route-level error handling -- Use isRouteErrorResponse for proper error type checking - -## Navigation -- Use Link component for internal navigation -- Use NavLink for navigation with active states -- Prefer declarative navigation over imperative - -## Best Practices -- Keep route components focused on layout and data orchestration -- Extract business logic into custom hooks or utilities -- Use proper TypeScript types from route type definitions -- Implement proper loading and error states - -# React Router 7 Cursor Rules - -## Route Structure - Use file-based routing in `app/routes/` - Route files should export default component and optional meta, loader, action functions - Use `+types` for route-specific TypeScript types ## Component Patterns + ```tsx // Route component example import type { Route } from './+types/home'; @@ -71,22 +31,25 @@ export default function Home() { ``` ## Data Loading + - Use loaders for server-side data fetching - Use actions for form submissions and mutations - Prefer server-side data loading over client-side when possible ## Error Handling + - Implement ErrorBoundary components for route-level error handling - Use isRouteErrorResponse for proper error type checking ## Navigation + - Use Link component for internal navigation - Use NavLink for navigation with active states - Prefer declarative navigation over imperative ## Best Practices + - Keep route components focused on layout and data orchestration - Extract business logic into custom hooks or utilities - Use proper TypeScript types from route type definitions - Implement proper loading and error states - diff --git a/.cursorrules/storybook.mdc b/.cursorrules/storybook.mdc new file mode 100644 index 0000000..f444e83 --- /dev/null +++ b/.cursorrules/storybook.mdc @@ -0,0 +1,53 @@ +--- +description: Storybook setup and patterns for React Router apps +globs: apps/**/.storybook/**/*.ts, apps/**/.storybook/**/*.tsx, apps/**/*.stories.@(ts|tsx) +alwaysApply: false +--- + +# Storybook Cursor Rules + +## Setup (todo-app) + +- **Framework:** `@storybook/react-vite` with Vite config from app root +- **Stories:** `../app/**/*.stories.@(ts|tsx)` +- **Addons:** `@storybook/addon-essentials`, `@storybook/addon-links` +- **Config:** `main.ts` uses `viteFinal` to resolve `vite.config.ts` for path aliases and Tailwind + +## React Router in Storybook + +Components that use `Link`, `useNavigate`, `useFetcher`, or `useHref` need router context. Use a global decorator in `preview.tsx`: + +```tsx +import type { ComponentType } from 'react'; +import { createMemoryRouter, RouterProvider } from 'react-router-dom'; + +const withRouter = (Story: ComponentType) => { + const router = createMemoryRouter( + [{ path: '/', element: }], + { initialEntries: ['/'] } + ); + return ; +}; + +const preview: Preview = { + decorators: [withRouter, withTodoProvider], // add app providers as needed + // ... +}; +``` + +## Patterns + +- **Single route:** One route with `element: ` and `initialEntries: ['/']` (or desired path) +- **App providers:** Add decorators for context providers (e.g. TodoProvider) so stories match app behavior +- **Global styles:** Import app `globals.css` in `preview.tsx` so Tailwind and theme apply + +## Scripts + +- **Dev:** `npm run storybook` (port 6006) +- **Build:** `npm run build-storybook` (static output for deployment) + +## Best Practices + +- Keep stories colocated with components (`component.stories.tsx`) +- Use args and controls for props; use decorators for router and providers +- Prefer one default export with a descriptive title; use named exports for variants diff --git a/.cursorrules/testing-best-practices.mdc b/.cursorrules/testing-best-practices.mdc new file mode 100644 index 0000000..727b580 --- /dev/null +++ b/.cursorrules/testing-best-practices.mdc @@ -0,0 +1,79 @@ +--- +description: Vitest and React Testing Library patterns for React Router apps +globs: apps/**/*.test.{ts,tsx}, apps/**/*.spec.{ts,tsx}, apps/**/test/**/* +alwaysApply: false +--- + +# Testing Best Practices + +## Stack + +- **Runner:** Vitest (globals, jsdom, `test/setup.ts`) +- **Component/DOM:** React Testing Library +- **Router:** `createMemoryRouter` + `RouterProvider` via shared `renderWithRouter` helper + +## Test Layout (todo-app) + +| Pattern | Location | Purpose | +|---------------|-----------------------------------|--------| +| Unit | `app/lib/__tests__/*.test.ts` | Pure utilities, helpers | +| Component | `app/components/__tests__/*.test.tsx` | UI with router/context mocking | +| Integration | `app/routes/__tests__/*.integration.test.tsx` | Full route + provider flows | + +Shared setup: `test/setup.ts` (jest-dom, RTL cleanup). Shared helpers: `test/test-utils.tsx`. + +## Router-Dependent Components + +Use `renderWithRouter` for any component that uses `Link`, `useNavigate`, `useFetcher`, or `useHref`: + +```tsx +import { renderWithRouter } from '../../../test/test-utils'; + +it('renders and submits', () => { + renderWithRouter(); +}); + +it('renders at /contact', () => { + renderWithRouter(, { initialEntries: ['/contact'] }); +}); +``` + +For full route trees (loaders, nested layouts), use `createTestRouter` or pass `routes` into `renderWithRouter`. + +## Integration Tests + +Wrap route components with the same providers as the app (e.g. TodoProvider), then assert user flows: + +```tsx +import { renderWithRouter } from '../../test/test-utils'; +import { TodoProvider } from '../../lib/todo-context'; +import Home from '../home'; + +renderWithRouter( + + + +); +// fire events, assert DOM/state +``` + +## Vitest Config (reference) + +- **include:** `app/**/*.{test,spec}.{ts,tsx}` +- **exclude:** node_modules, build, `**/*.stories.*`, .storybook +- **env:** NODE_ENV=test +- **setupFiles:** `test/setup.ts` +- **testTimeout:** 10_000 (adjust if needed for slow flows) + +## Commands + +- `npm run test` – watch +- `npm run test:run` / `npm run test:ci` – single run (CI) + +## Best Practices + +- Prefer `getByRole`, `getByLabelText`, `getByPlaceholderText` over brittle selectors +- Use `vi.fn()` for callbacks; assert calls and args +- Hoist repeated regex/selectors to describe scope to satisfy lint rules +- Keep tests focused; use multiple `it` blocks instead of one large test +- For forms: test validation, submit behavior, and error display (see lambda-curry-forms rules for FormError) diff --git a/.devagent/config.json b/.devagent/config.json new file mode 100644 index 0000000..1ddfd43 --- /dev/null +++ b/.devagent/config.json @@ -0,0 +1,8 @@ +{ + "name": "react-router-starter", + "plugins": ["ralph"], + "defaults": { + "maxAgents": 5, + "model": "claude-sonnet-4-20250514" + } +} diff --git a/.devagent/core/AGENTS.md b/.devagent/core/AGENTS.md new file mode 100644 index 0000000..78ddc56 --- /dev/null +++ b/.devagent/core/AGENTS.md @@ -0,0 +1,7 @@ +# Standard Workflow Instructions + +This repo centralizes agent guidance in: +- `AGENTS.md` (repo root) +- `.devagent/plugins/ralph/AGENTS.md` (Ralph plugin playbook) + +When workflows reference this file, follow the instructions in those sources. No additional core-specific workflow rules are required here. diff --git a/.devagent/final-review-react-router-starter-p5l.txt b/.devagent/final-review-react-router-starter-p5l.txt new file mode 100644 index 0000000..63df401 --- /dev/null +++ b/.devagent/final-review-react-router-starter-p5l.txt @@ -0,0 +1,43 @@ +## Final Review: Epic react-router-starter-p5l + +**Date:** 2026-02-02 +**Epic:** React Router Starter Improvements +**Progress:** 7/7 tasks closed | Epic status: in_progress β†’ closed + +### Acceptance criteria + +- **Goal:** Update react-router-starter to be a comprehensive prototype starting point with best practices from reportory, Storybook, forms library, and testing examples. +- **Outcome:** All criteria met via completed child tasks (p5l.1–p5l.7). + +### Task summary + +| Task | Title | Status | Notes | +|------|--------|--------|--------| +| p5l.1 | Update Dependencies | closed | Bun, React Router 7, Vite, etc. | +| p5l.2 | Setup Storybook with React Router | closed | Storybook 8, React Router mocking, example stories | +| p5l.3 | Lambda Curry Forms Integration | closed | @lambdacurry/forms, Zod, contact form, Storybook | +| p5l.4 | Testing Examples | closed | Unit, component, integration tests; Vitest; TESTING.md | +| p5l.5 | Setup AI Rules | closed | .cursorrules (react-router, storybook, lambda-curry-forms, testing, 00-project-context) | +| p5l.6 | Biome Config Review | closed | Lint/format scripts, full lint pass | +| p5l.7 | Update Documentation | closed | README, usage, Storybook/testing docs | + +### Quality gates (final run) + +- **Typecheck:** `bun run typecheck` (apps/todo-app) β€” passed +- **Lint:** `bun run lint` (apps/todo-app) β€” passed (31 files) +- **Tests:** `bun run test:run` (apps/todo-app) β€” 28 tests, 5 files, passed +- **Build:** `bun run build` (root turbo) β€” todo-app build passed + +### Deliverables verified + +- **Storybook:** .storybook/ configured; stories for add-todo, contact-form, todo-filters, todo-item +- **Forms:** contact-form with @lambdacurry/forms + Zod; create-todo route +- **Testing:** format.test.ts, todo-context.test.tsx, contact-form.test.tsx, add-todo.test.tsx, home.integration.test.tsx; test/setup.ts, test-utils.tsx +- **AI rules:** .cursorrules/ with 00-project-context.mdc, react-router.mdc, storybook.mdc, lambda-curry-forms.mdc, testing-best-practices.mdc +- **Docs:** README (features, usage, Storybook, testing); TESTING.md; AGENTS.md + +### Conclusion + +Epic is complete. All child tasks are closed, quality gates pass, and the starter is a solid prototype with Storybook, Lambda Curry forms, testing examples, and AI rules. No follow-up tasks identified. Closing epic. + +Signed: Project Manager Agent β€” Chaos Coordinator diff --git a/.devagent/loops/starter-improvements.yaml b/.devagent/loops/starter-improvements.yaml new file mode 100644 index 0000000..669254f --- /dev/null +++ b/.devagent/loops/starter-improvements.yaml @@ -0,0 +1,121 @@ +name: starter-improvements +description: > + Update react-router-starter to be a comprehensive prototype starting point + with best practices from reportory, Storybook, forms library, and testing examples. + +context: + goal: | + Create a best-practices starter template that can be quickly duplicated + for prototype apps. Should demonstrate patterns for react-router, forms, + testing, and Storybook that we use across Lambda Curry projects. + + references: + - ~/projects/reportory/.cursorrules/react-router.md + - ~/projects/reportory/.cursorrules/storybook.md + - ~/projects/reportory/.cursorrules/lambda-curry-forms.md + - ~/projects/reportory/.cursorrules/testing-best-practices.md + +beads: + - id: update-deps + name: Update Dependencies + description: | + Update all dependencies to latest stable versions. + - Run bun update + - Check for any breaking changes + - Ensure everything builds and types check + priority: 1 + agent: 1 + + - id: setup-storybook + name: Setup Storybook with React Router + description: | + Add Storybook with proper React Router mocking. + Reference: ~/projects/reportory/.cursorrules/storybook.md + + Tasks: + - Install Storybook for Vite/React + - Configure mock react-router decorators + - Create example stories for existing components + - Add Storybook scripts to package.json + priority: 2 + agent: 2 + depends_on: [update-deps] + + - id: forms-examples + name: Lambda Curry Forms Integration + description: | + Add form examples using @lambdacurry/forms best practices. + Reference: ~/projects/reportory/.cursorrules/lambda-curry-forms.md + + Tasks: + - Create example form components + - Show validation patterns with zod + - Demonstrate action handlers + - Add Storybook stories for forms + priority: 2 + agent: 3 + depends_on: [update-deps] + + - id: testing-examples + name: Testing Examples + description: | + Add comprehensive testing examples. + Reference: ~/projects/reportory/.cursorrules/testing-best-practices.md + + Tasks: + - Unit test examples for utilities + - Component test examples with react-router mocking + - Integration test patterns + - Ensure vitest config is optimal + priority: 2 + agent: 4 + depends_on: [update-deps] + + - id: ai-rules + name: Setup AI Rules + description: | + Copy and adapt relevant ai-rules from reportory. + + Tasks: + - Copy react-router.md + - Copy storybook.md (if added) + - Copy lambda-curry-forms.md + - Copy testing-best-practices.md + - Create project-specific 00-project-context.md + - Update .cursorrules structure + priority: 3 + agent: 5 + depends_on: [setup-storybook, forms-examples, testing-examples] + + - id: biome-check + name: Biome Config Review + description: | + Review and update Biome configuration. + + Tasks: + - Check biome version (currently 2.2.0) + - Review rules for best practices + - Ensure lint/format scripts work + - Run full lint pass and fix issues + priority: 3 + agent: 1 + depends_on: [ai-rules] + + - id: docs-update + name: Update Documentation + description: | + Update README and documentation. + + Tasks: + - Update README with new features + - Add usage examples + - Document Storybook commands + - Document testing patterns + priority: 4 + agent: 2 + depends_on: [biome-check] + +settings: + maxAgents: 5 + model: claude-sonnet-4-20250514 + autoMerge: false diff --git a/.devagent/plugins/ralph/AGENTS.md b/.devagent/plugins/ralph/AGENTS.md new file mode 100644 index 0000000..eb23d67 --- /dev/null +++ b/.devagent/plugins/ralph/AGENTS.md @@ -0,0 +1,269 @@ +# Ralph Plugin Instructions + +## High-Level Execution Strategy + +Ralph executes tasks autonomously with built-in quality verification. Your approach: read context β†’ plan β†’ implement β†’ verify β†’ review β†’ commit β†’ update status. **Key principle:** No task is complete until all validation gates pass and work is verified. You are responsible for end-to-end execution including verification and documentation. + +## Beads Issue Tracking + +This project uses [Beads (bd)](https://github.com/steveyegge/beads) for issue tracking. **All work must be tracked in Beads** - never use markdown TODOs or comment-based task lists. + +### Core Rules + +- Track ALL work in Beads (never use markdown TODOs or comment-based task lists) +- Use `bd ready --parent --limit 200` to find available work for the current epic (default limit is 10) +- Use `bd create` to track new issues/tasks/bugs (only if discovering new work during execution) +- Always use `--json` flag for programmatic interaction with Beads CLI + +### Quick Reference + +```bash +bd prime # Load complete workflow context (AI-optimized format) +bd ready --parent --limit 200 --json # Show ready tasks for an epic (no blockers) +bd list --status open --json # List all open issues +bd show --json # Get full task details +bd update --status in_progress # Claim work +bd update --status closed # Mark complete +bd update --status blocked # Mark blocked (with reason) +bd comments add "..." # Add progress comment +bd dep add # Add dependency +``` + +**Tip:** For multiline or markdown-heavy comments, use `bd comments add -f ` (see `.devagent/plugins/ralph/skills/beads-integration/SKILL.md`). + +### Beads Status Values + +**Valid statuses:** +- `open` - Ready to be worked on (default for new tasks) +- `in_progress` - Currently being worked on +- `closed` - Work completed +- `blocked` - Blocked by dependencies or external factors + +**Status workflow:** +1. Tasks start as `open` (ready for work) +2. When starting work: `bd update --status in_progress` +3. When complete: `bd update --status closed` +4. If blocked: `bd update --status blocked` (must document reason) + +### Issue Types + +- `bug` - Something broken +- `feature` - New functionality +- `task` - Work item (tests, docs, refactoring) +- `epic` - Large feature with subtasks (hierarchical parent) +- `chore` - Maintenance (dependencies, tooling) + +### Priorities + +- `0` or `P0` - Critical (security, data loss, broken builds) +- `1` or `P1` - High (major features, important bugs) +- `2` or `P2` - Medium (default, nice-to-have) +- `3` or `P3` - Low (polish, optimization) +- `4` or `P4` - Backlog (future ideas) + +### Context Loading + +Run `bd prime` to get complete workflow documentation in AI-optimized format. This provides comprehensive Beads workflow context when needed. + +For detailed Beads CLI reference, see `.devagent/plugins/ralph/skills/beads-integration/SKILL.md`. + +### Workflow Index (Ralph Plugin) +- Setup: `.devagent/plugins/ralph/workflows/setup-ralph-loop.md` (plan β†’ Beads + config) +- Task setup handoff: `.devagent/plugins/ralph/workflows/task-setup-handoff.md` (write a reusable setup/runbook packet) +- Execution: `.devagent/plugins/ralph/workflows/start-ralph-execution.md` (run the epic) +- Workspace: `.devagent/plugins/ralph/workflows/setup-workspace.md` (workspace/worktree preparation) +- Final review: `.devagent/plugins/ralph/workflows/final-review.md` +- Revise report: `.devagent/plugins/ralph/workflows/generate-revise-report.md` + +## Objective Orchestration & Branching Protocols (C6) + +When participating in a multi-epic Objective (an Admin Loop), you must follow these specialized protocols to ensure autonomous coordination across the entire tree. + +### 1. Context-Aware Branching +In an objective loop, different tasks may belong to different branches. You are responsible for managing your git state autonomously. + +**The Protocol:** +1. **Detect Branch Hint:** Before starting any task, check the task `description` (and older plans may use `objective`) for a line starting with `Branch: feature/...`. +2. **Autonomous Switch:** + - If a hint is found and you are not on that branch: + - `git checkout ` (create it off the hub if it doesn't exist). + - `git pull origin ` (if it exists remotely). + - If no hint is found, remain on the current working branch. +3. **Hub Operations:** For "Merge" or "Rebase" tasks, you must switch to the **Hub Branch** (defined in `config.json` or derived from context) to perform the integration. + +### 2. Epic Lifecycle Management (Flow Control) +Beads dependencies only unblock when the blocker is `closed`. Therefore, you must explicitly manage the lifecycle of implementation epics to unblock the next phase of the objective. + +**The Protocol:** +1. **The "Wrap up & Close" Task**: Most epics will have a final task titled "Wrap up & Close Epic". When you complete this task, you are signaling that implementation is 100% verified. +2. **Closing Epics**: After closing the final task, you MUST mark the **Epic itself** as `closed`: + - `bd update --status closed` +3. **Signaling Unblock**: Closing the epic is the primary signal that unblocks integration/merge tasks in the objective tree. Integration tasks are typically blocked by the Epic object, not just individual tasks. + +### 3. The "Branch Hint" Pattern +To ensure you are working in the correct git context, always look for a `Branch: feature/...` hint in your task description (older tasks may say `objective`). If you see one, ensure you are on that branch before making any file changes. If you create a new branch, use the name suggested in the hint. + +## Task Execution Flow + +1. **Read Context:** Read task details (`bd show --json`), **read latest task comments** (`bd comments --json`), plan documents, and acceptance criteria. Set task status to `in_progress` immediately after confirming the latest comments. +2. **Plan:** Understand requirements, identify impacted files, and determine verification commands by reading `package.json`. +3. **Implement:** Modify code to satisfy requirements. +4. **Verify:** Run validation gates (test/lint/typecheck) and UI verification if applicable. **You MUST NOT mark task as 'closed' until ALL validation gates pass.** +5. **Review:** Self-review your work against acceptance criteria and quality standards. +6. **Commit & Push:** Create conventional commit with task ID reference AND push to the remote working branch. Prefer running `git add`/`git commit` from the repo root (or use `git -C `) to avoid pathspec mistakes in monorepos. +7. **Update Status:** Mark task as `closed` (if all gates passed), `blocked` (if cannot proceed), or leave `in_progress` (if retry needed). + +## Task Context & Beads Integration + +**Reading Task Context:** Use `bd show --json` to access: +- `description`: Inline task details or content from `descriptionPath`. Includes Objective, Impacted Modules/Files, References, Testing Criteria. +- `acceptance_criteria`: Success criteria +- `design`: Architecture decisions (if present) +- `notes`: Additional context - **Always check for "Plan document: " and read it** +- `priority`, `labels`, `depends_on`, `parent_id` + +**Reading Latest Comments (Required):** Use `bd comments --json` before starting work. Review the most recent comments for updated guidance, QA findings, or design decisions. + +**Starting Work:** Immediately set status to `in_progress` using `bd update --status in_progress` after reading task context. **Never use `todo` or `done` as status values** - Beads uses `open` and `closed`. + +**Reading Epic Context:** Use `bd show --json`. Epic `description` contains "Plan document: " - read it for complete implementation context. + +**Updating Task Metadata:** During implementation: +- Architectural decisions: `bd update --design ""` +- Important context: `bd update --notes ""` +- Priority adjustment: `bd update --priority ` +- Progress comments: `bd comments add ""` (use `-f ` for multiline/markdown) + +**Reference:** See `.devagent/plugins/ralph/skills/beads-integration/SKILL.md` for complete Beads CLI reference. + +## Validation Gates + +**You MUST NOT update task status to 'closed' until ALL validation gates pass.** At the start of each task, generate a dynamic checklist that adapts to task requirements, including all relevant items below plus task-specific verification steps. + +**The 7-Point Validation Checklist:** + +1. **Read Task & Context:** Understand requirements, plan docs, and acceptance criteria. +2. **Self-Diagnose Commands:** Read `package.json` to find actual project scripts for test, lint, and typecheck. Do not assume `npm test` works unless verified. +3. **Implementation:** Modify code to satisfy requirements. +4. **Standard Checks:** Run diagnosed commands (e.g., `npm run test:unit`, `npm run lint`). Fix any regressions. +5. **UI Pre-Checks (Before UI Verification):** **REQUIRED when UI verification is needed** - Run basic lint/typecheck or smoke test to catch blocking issues (e.g., empty string in Select components, type errors, syntax errors) before starting UI verification. This prevents UI testing from being blocked by simple errors that should be caught earlier. +6. **UI Verification:** **REQUIRED when:** file extensions indicate UI work (`.tsx`, `.jsx`, `.css`, `.html`, Tailwind config changes), task mentions UI/frontend/visual changes, or client-side state/routing logic is modified. + - Default owner is the **QA task**. Engineering may defer UI verification to QA when a dedicated QA task exists, but must still run non-UI gates and leave a handoff comment noting the deferral. + - If you are the QA task (or no QA task exists), run `agent-browser` to visit the local URL and perform DOM assertions (see `.devagent/plugins/ralph/skills/agent-browser/SKILL.md`). + - **Capture failure screenshots** if assertions fail (mandatory). + - **Capture success screenshots** only if visual design review expected (optional). + - Avoid running long-lived dev servers inside coding steps; keep evidence capture in QA tasks unless explicitly required. + - If browser testing cannot be completed, document reason clearly - "good enough for now" requires explicit reasoning. +7. **Add/Update Tests:** If logic changed, add unit tests. If UI changed, ensure browser checks cover it. +8. **Commit & Push:** Create conventional commit and push to the remote working branch. + +**Failure Handling:** If any validation gate fails, you MUST fix the issue or mark task as 'blocked' with reason. Never proceed silently when operations fail. + +## Status Management + +**Agent Responsibility:** You are responsible for verifying work and managing task status. The script will not automatically close tasks. + +**Status Criteria:** +- **`open`:** Ready to be worked on (default for new tasks, tasks that need retry after failure) +- **`in_progress`:** Work in progress, retry needed, or waiting for next iteration +- **`closed`:** All acceptance criteria met, all validation gates passed, work committed +- **`blocked`:** Cannot proceed due to external dependency or unresolvable issue (MUST document reason) + +**QA Reopen Rule:** If QA has a high-confidence fix direction (what + where), reset the task status to `open` with a concise FAIL comment and guidance. Out-of-scope improvements should be logged for the revise report instead of reopening. + +**Important:** Beads uses `open` (not `todo`) and `closed` (not `done`). Always use the correct Beads status values. + +**Status Transitions:** +- **Success:** If task completed and verified, run `bd update --status closed`. +- **Blocker:** If task cannot be completed, run `bd update --status blocked` and document reason. +- **Retry:** If task needs more work (e.g., failed tests), leave as `in_progress`. Script will provide failure context in next iteration. + +**Epic Status:** If critical path is blocked, consider blocking parent Epic if appropriate (stops autonomous execution loop). + +**Decision-Making:** Infer commit type and scope from task metadata. Default to `chore` for maintenance/tooling, `feat` for new capabilities, `fix` for behavior corrections. Describe reasoning in commit body when it adds clarity. + +## Commit Messaging Guidelines + +Follow **Conventional Commits v1.0.0**: select type (`feat`, `fix`, `chore`, `docs`, `style`, `refactor`, `perf`, `test`, `build`, `ci`, `revert`) and add meaningful `scope` when it clarifies surface area (e.g., `feat(api): add healthcheck`). Keep subject imperative, lowercase type, no trailing period, under 50 characters where practical. + +**CI/CD Optimization:** By default, append `[skip ci]` to subject line for intermediate/incremental commits. Omit `[skip ci]` (trigger build) ONLY when: task is significant feature/UI change warranting preview deployment, explicitly instructed to deploy, or closing major milestone/integration point. + +**Task Reference:** Include Beads task ID in subject or first line of body (e.g., `feat(api): add healthcheck endpoint (bd-1234.1)`). + +**Commit Body:** Explain what changed, why, and how acceptance criteria were satisfied. Include: `Task:` (full task ID and title), `Acceptance:` (satisfied criteria), `Quality Gates:` (which gates ran and passed), `Iteration:` (Ralph iteration number), `Testing:` (commands executed or verifications performed). Optional `Notes:` for follow-up work. + +**Co-author:** Preserve `Co-authored-by: Ralph ` trailer when AI agent participates. + +## Sub-Issues Context & Completion Summary (C6) + +- Ralph prompts include a bounded sub-issues list (top N + remainder). Treat it as context only; do not auto-select a child when running the parent/epic. +- Prefer plan order when available; otherwise pick the next sub-issue without extra justification. +- When closing a sub-issue, add a short completion summary comment (suggested format, keep it brief): + ``` + Summary: + Struggles: (input for revise reports) + Verification: + ``` + +### Cross-task notes (C6) +If your work affects another task in this epic, leave a brief comment: +`bd comments add ""` (use `-f ` for multiline/markdown). + +## Task Commenting for Traceability + +**Mandatory Steps After Implementation:** +1. **Run Validation Gates:** Execute diagnosed test, lint, and typecheck commands. +2. **Commit Work:** Create git commit with conventional commit message referencing task ID. +3. **Update Task Status:** Mark as `closed` (if successful), `blocked` (if blocked), or leave `in_progress` (if retry needed). +4. **Use safe comment input:** Prefer `bd comments add -f ` for multiline markdown (avoids shell interpolation). +5. **Add Comments:** After commit, add: + ``` + Commit: - + ``` +6. **Revision Learning:** Every task must have a "Revision Learning" comment. Use format: + ``` + Revision Learning: + **Category**: Documentation|Process|Rules|Architecture + **Priority**: Critical|High|Medium|Low + **Issue**: [description] + **Recommendation**: [actionable suggestion] + **Files/Rules Affected**: [references] + ``` +7. **Screenshot Documentation:** If screenshots captured during browser testing, add: + ``` + Screenshots captured: .devagent/workspace/tasks/active/YYYY-MM-DD_task-slug/screenshots/[paths] + ``` + **Save to task folder (preferred):** `.devagent/workspace/tasks/active/YYYY-MM-DD_task-slug/screenshots/` (extract task folder from Epic's plan document path) + **Fallback:** Epic-level `.devagent/workspace/reviews/[epic-id]/screenshots/` or task-specific `.devagent/workspace/reviews/[epic-id]/[task-id]/screenshots/` if task folder cannot be determined. + +**Quality Gate Failures:** Document which gates failed and what needs fixing. For multi-task commits, cite each task ID in comments. + +## Ralph Configuration & Validation + +**Git Configuration:** Ralph requires explicit branch configuration in `config.json`: +- `git.base_branch`: Base branch name (e.g., "main") +- `git.working_branch`: Working branch name (e.g., "ralph-") + +**Pre-Execution Validation:** Before starting the execution loop, `ralph.sh` validates: +- Epic exists in Beads database (`bd show `) +- Working branch exists locally +- Current branch matches `working_branch` from config + +**Branch Setup:** Branch creation/switching is intentionally **out of scope** for `setup-ralph-loop`. Users must create and check out the desired working branch themselves, then set `git.base_branch` and `git.working_branch` in `config.json` accordingly. + +**Error Handling:** All validation failures result in immediate script exit with clear error messages. Users must ensure branches are created and configured before running Ralph. + +## Epic Quality Gate & Retrospectives + +**Epic Report:** Every Epic includes final quality gate task "Generate Epic Revise Report" that runs only after all other tasks are closed or blocked. When this task becomes ready, follow `.devagent/plugins/ralph/workflows/generate-revise-report.md`. + +**Completion Verification:** Before generating report, verify all child tasks have status `closed` or `blocked` (use `bd list --parent --json`). Do NOT generate report mid-epic while tasks are still in progress. + +**Aggregation:** Workflow aggregates all "Revision Learning" and "Commit" comments from child tasks into consolidated improvement report. Categories: **Documentation** (missing docs, outdated content, onboarding gaps), **Process** (workflow friction, automation opportunities, quality gate improvements), **Rules & Standards** (Cursor rules updates, coding standards violations, pattern inconsistencies), **Tech Architecture** (code structure issues, dependency concerns, technical debt, performance). + +**Screenshot Integration:** Reports include screenshot directory references and key screenshots with descriptions. Use generated report to identify systemic issues and create new tasks for process or tooling improvements. Reports saved as `YYYY-MM-DD_-improvements.md` in `.devagent/workspace/reviews/`. + +## References + +- https://www.conventionalcommits.org/en/v1.0.0/ +- Keep using the quality-gate/comment automation defined in `.devagent/plugins/ralph/tools/ralph.sh`, but apply this guidance when narrating commits and adding Beads comments. diff --git a/.devagent/plugins/ralph/agents/design-agent-instructions.md b/.devagent/plugins/ralph/agents/design-agent-instructions.md new file mode 100644 index 0000000..90db7f2 --- /dev/null +++ b/.devagent/plugins/ralph/agents/design-agent-instructions.md @@ -0,0 +1,54 @@ +# Design Agent Instructions + +## Role & Purpose + +You are the **design + UX guidance agent** for tasks labeled `design`. + +Your job is to make design decisions concrete and actionable for engineers and QA by producing: + +- Clear behavioral/visual guidance tied to acceptance criteria +- Portable design artifacts (prefer Storybook stories/docs when available) +- Concise Beads comments that engineers can implement directly + +## Skills to Reference (Canonical) + +- `.devagent/plugins/ralph/skills/beads-integration/SKILL.md` +- `.devagent/plugins/ralph/skills/quality-gate-detection/SKILL.md` +- `.devagent/plugins/ralph/skills/agent-browser/SKILL.md` (UI verification + screenshots) +- `.devagent/plugins/ralph/skills/storybook/SKILL.md` (design artifacts + component states) + +## When You're Assigned a Task + +- Read the task description, **latest task comments** (`bd comments --json`), acceptance criteria, and any linked plan context. +- Identify the **design intent** (what users should experience) and restate it as **observable UI acceptance**. +- Prefer **Storybook** as the design artifact: + - Add/update stories to capture key states (empty/loading/error/success) and variants. + - Add/update docs (MDX) only when narrative rationale is needed. +- If browser evidence is needed (or the task is UI-sensitive), use the `agent-browser` skill for DOM assertions and failure screenshots. +- Leave Beads comments that are short, specific, and implementation-ready. + +## Design Deliverables Checklist (UI-Sensitive Tasks) + +- **Intent + observable acceptance:** Describe what users should experience as testable UI behavior. +- **Component inventory + reuse:** List components to reuse or extend, with code references (file paths). +- **Storybook stories:** Add/update stories when Storybook is available. +- **Minimum artifact when Storybook is missing:** Provide a lightweight mockup or annotated screenshot plus acceptance bullets and component inventory. +- **Output location:** Design output must live in the design task comments with links to artifacts. + +## Output Requirements (C6-friendly) + +In Beads comments, include: + +- **Artifact**: story/doc path(s) if created (or β€œStorybook not available” + follow-up task reference) +- **Decision**: what should change and why +- **Acceptance**: the observable behavior/state that should be true after implementation +- **References**: relevant docs (library/framework/accessibility) when they justify expectations +- **Cross-task guidance**: leave short design-direction comments on relevant engineering/qa tasks, linking to the artifacts produced here + +## Failure Semantics (Status) + +If you are responsible for verifying a design-labeled task and it does not meet acceptance criteria: + +- Leave a **FAIL** comment with expected vs actual and evidence (screenshots if applicable). +- Reset the task status back to `open` (see `beads-integration` skill). +- Do not set `blocked` for acceptance failures (MVP default). diff --git a/.devagent/plugins/ralph/agents/design-agent.json b/.devagent/plugins/ralph/agents/design-agent.json new file mode 100644 index 0000000..c01be54 --- /dev/null +++ b/.devagent/plugins/ralph/agents/design-agent.json @@ -0,0 +1,10 @@ +{ + "name": "Design Agent", + "label": "design", + "ai_tool": { + "name": "agent", + "command": "agent" + }, + "model_tier": "cheap", + "instructions_path": ".devagent/plugins/ralph/agents/design-agent-instructions.md" +} diff --git a/.devagent/plugins/ralph/agents/engineering-agent-instructions.md b/.devagent/plugins/ralph/agents/engineering-agent-instructions.md new file mode 100644 index 0000000..aa5379b --- /dev/null +++ b/.devagent/plugins/ralph/agents/engineering-agent-instructions.md @@ -0,0 +1,38 @@ +# Engineering Agent Instructions + +## Role & Purpose + +You are the **primary coding agent** for engineering tasks. + +Notes: +- Ralph selects an agent based on **Beads task labels**. +- In this repo, use the `engineering` label for tasks that require code changes. + +Your job is to deliver working code changes that satisfy acceptance criteria with minimal churn, plus the required verification (lint/typecheck/tests) and Beads traceability. + +## Execution Checklist + +- Read task context, **latest task comments** (`bd comments --json`), plan docs, and impacted file list before setting status to `in_progress`. +- Identify correct verification commands by reading `package.json` scripts (see `quality-gate-detection` skill). +- Implement the change with clear, TypeScript-first code. +- Add/update tests if behavior changed. +- Run quality gates (test/lint/typecheck). +- If UI verification is required and a QA task exists, defer agent-browser execution to QA and call it out in your handoff comment. +- Commit and push. +- Run `git add`/`git commit` from the repo root (or use `git -C `) to avoid pathspec errors in monorepos. +- Update Beads status + add required comments (commit + revision learning). + +## Skills to Reference (Canonical) + +- `.devagent/plugins/ralph/skills/beads-integration/SKILL.md` +- `.devagent/plugins/ralph/skills/quality-gate-detection/SKILL.md` +- `.devagent/plugins/ralph/skills/agent-browser/SKILL.md` (when UI verification is required) +- `.devagent/plugins/ralph/skills/storybook/SKILL.md` (when implementing design guidance / component states) + +## Engineering Standards + +- Prefer small, composable functions and clear names. +- Avoid unnecessary `useEffect` and state in UI code. +- Use existing libraries/components already present in the repo. +- Keep error handling framework-native. +- Keep deterministic logic isolated in pure modules when possible so tests and QA remain stable. diff --git a/.devagent/plugins/ralph/agents/engineering-agent.json b/.devagent/plugins/ralph/agents/engineering-agent.json new file mode 100644 index 0000000..469627f --- /dev/null +++ b/.devagent/plugins/ralph/agents/engineering-agent.json @@ -0,0 +1,10 @@ +{ + "name": "Engineering Agent", + "label": "engineering", + "ai_tool": { + "name": "agent", + "command": "agent" + }, + "model_tier": "cheap", + "instructions_path": ".devagent/plugins/ralph/agents/engineering-agent-instructions.md" +} diff --git a/.devagent/plugins/ralph/agents/implementation-agent-instructions.md b/.devagent/plugins/ralph/agents/implementation-agent-instructions.md new file mode 100644 index 0000000..7c918a7 --- /dev/null +++ b/.devagent/plugins/ralph/agents/implementation-agent-instructions.md @@ -0,0 +1,35 @@ +# Engineering Agent Instructions + +## Role & Purpose + +You are the **primary coding agent** for engineering tasks. + +Notes: +- Ralph selects an agent based on **Beads task labels**. +- In this repo, use the `engineering` label for tasks that require code changes. + +Your job is to deliver working code changes that satisfy acceptance criteria with minimal churn, plus the required verification (lint/typecheck/tests) and Beads traceability. + +## Execution Checklist + +- Read task context, **latest task comments** (`bd comments --json`), plan docs, and impacted file list before setting status to `in_progress`. +- Identify correct verification commands by reading `package.json` scripts (see `quality-gate-detection` skill). +- Implement the change with clear, TypeScript-first code. +- Add/update tests if behavior changed. +- Run quality gates (test/lint/typecheck). +- Commit and push. +- Update Beads status + add required comments (commit + revision learning). + +## Skills to Reference (Canonical) + +- `.devagent/plugins/ralph/skills/beads-integration/SKILL.md` +- `.devagent/plugins/ralph/skills/quality-gate-detection/SKILL.md` +- `.devagent/plugins/ralph/skills/agent-browser/SKILL.md` (when UI verification is required) +- `.devagent/plugins/ralph/skills/storybook/SKILL.md` (when implementing design guidance / component states) + +## Engineering Standards + +- Prefer small, composable functions and clear names. +- Avoid unnecessary `useEffect` and state in UI code. +- Use existing libraries/components already present in the repo. +- Keep error handling framework-native. diff --git a/.devagent/plugins/ralph/agents/implementation-agent.json b/.devagent/plugins/ralph/agents/implementation-agent.json new file mode 100644 index 0000000..4f1f3e7 --- /dev/null +++ b/.devagent/plugins/ralph/agents/implementation-agent.json @@ -0,0 +1,10 @@ +{ + "name": "Engineering Agent", + "label": "engineering", + "ai_tool": { + "name": "agent", + "command": "agent" + }, + "model_tier": "cheap", + "instructions_path": ".devagent/plugins/ralph/agents/implementation-agent-instructions.md" +} diff --git a/.devagent/plugins/ralph/agents/project-manager-agent-instructions.md b/.devagent/plugins/ralph/agents/project-manager-agent-instructions.md new file mode 100644 index 0000000..aa44088 --- /dev/null +++ b/.devagent/plugins/ralph/agents/project-manager-agent-instructions.md @@ -0,0 +1,271 @@ +# Project Manager Agent Instructions + +## Role & Purpose + +The Project Manager Agent serves **dual roles**: + +1. **Default Fallback Agent**: You are the default agent for tasks without specific labels. **Triage first, apply the correct routing label, and delegate** to the specialized agent when appropriate. Only implement directly when the task is truly general/coordination work or no specialized agent applies. + +2. **Specialized Coordination Agent**: When explicitly assigned via the `project-manager` label, focus on oversight and coordination rather than direct implementation. + +**Primary Specialized Use Cases (when labeled `project-manager`):** +1. **Phase Check-ins**: Review progress between large phases of work (e.g., after multiple tasks complete) +2. **Final Review**: Comprehensive epic review before closing, ensuring all work is complete and quality standards are met +3. **Strategic Coordination**: When explicit project management oversight is needed + +## Skills to Reference (Canonical) + +- `.devagent/plugins/ralph/skills/beads-integration/SKILL.md` (task status + comments) +- `.devagent/plugins/ralph/skills/quality-gate-detection/SKILL.md` (which lint/typecheck/test commands to run) +- `.devagent/plugins/ralph/skills/agent-browser/SKILL.md` (when UI verification is required) +- `.devagent/plugins/ralph/skills/plan-to-beads-conversion/SKILL.md` (plan β†’ Beads epic/task setup) +- `.devagent/plugins/ralph/skills/revise-report-generation/SKILL.md` (epic revise report) + +## When You're Assigned a Task + +### Default Fallback (No Label) +- You are the **default agent** for tasks without labels or when no other agent matches +- **Default behavior:** triage β†’ choose the correct routing label β†’ add it β†’ delegate +- Only implement directly when the task is truly coordination-only or when no specialized agent fits +- Always leave a short comment explaining any label changes or delegation decisions +- Always read the latest task comments before acting: `bd comments --json` + +### Explicit Project Management (project-manager label) +- When assigned tasks with `project-manager` label, focus on oversight and coordination +- Your role is coordination and review, NOT direct implementation +- If you receive a task that needs engineering work, add the `engineering` label and note why in comments +- Read the latest task comments before acting: `bd comments --json` + +## Core Responsibilities + +### 1. Phase Check-ins (Between Large Phases) + +**When to Perform:** +- After a significant milestone (e.g., 3-5 tasks completed, major feature implemented) +- When transitioning between phases of work +- When blockers or coordination issues are suspected + +**What to Do:** +- Review epic status and all child tasks using `bd list --parent --json` +- Identify tasks that are stuck, blocked, or have mismatched statuses +- Check overall progress toward epic goals +- Leave comprehensive status update on the epic: `bd comments add ""` +- Identify and document any coordination needs or blockers +- Create follow-up tasks if gaps are discovered + +**Check-in Report Format:** +``` +Phase Check-in: [Date] +Progress: X/Y tasks complete +Current Phase: [description] +Blockers: [list any blockers] +Next Focus: [what should be prioritized next] +Quality Status: [overall quality assessment] +``` + +### 2. Final Review (Before Epic Completion) + +**When to Perform:** +- When all or most tasks are marked closed +- Before epic is closed +- As the final quality gate + +**What to Do:** +- Comprehensive review of all tasks in the epic +- Verify all acceptance criteria are met +- Check code quality, test coverage, and documentation +- Verify all commits are properly linked to tasks +- Identify any missing work or follow-up tasks needed +- If PR review comments exist, create new child tasks (engineering/qa labels) for each actionable comment before running the revise report +- Keep the final review task **open** while follow-up tasks are open; run the revise report only after they are closed +- Update epic status if appropriate (close if complete, block if issues found) +- Leave final review summary on epic + +### 3. Task Coordination & Focus Guidance + +**During Check-ins:** +- Review task dependencies and blockers across the epic +- Leave comments on tasks that need coordination or clarification +- Use: `bd comments add ""` + +**Examples:** +- "Focus on implementing the core API endpoint first, tests can come after" +- "This task is blocked by Task X, check its status before proceeding" +- "The acceptance criteria requires Y, make sure to address that before closing" + +### 4. Status Management & Corrections + +**During Final Review:** +- Identify mismatches between task status and actual work +- Task marked `closed` but no commits found β†’ Update to `open` or `in_progress` with explanation +- Task marked `in_progress` but no recent activity β†’ Check if it's actually blocked +- Task has commits but status is still `open` β†’ Update to `closed` if work is complete + +**QA fail semantics (MVP):** +- If a task fails QA verification, reset it back to `open` (not `blocked`) with a concise failure comment and evidence. +- Do not set `in_progress` for QA failures; use `open` (per DEV-36 clarification Q33). + +**Update Statuses:** +```bash +bd update --status +bd comments add "Status corrected: " +``` + +### 5. Code Quality Review + +**During Final Review:** +- Comprehensive review of all code changes in the epic +- Check if code changes match task acceptance criteria +- Verify tests exist and pass for new functionality +- Identify missing documentation or incomplete implementations +- Run quality gates (test/lint/typecheck) and report results +- Check commit messages for proper task references +- Verify code follows project standards + +**Quality Assessment:** +- Document overall code quality in final review +- Identify any technical debt or follow-up work needed +- Note any patterns or issues that should be addressed + +### 6. Task Creation + +**When to Create New Tasks:** +- Discovered dependencies that aren't tracked +- Missing acceptance criteria or unclear requirements identified during review +- Technical debt or follow-up work that needs tracking +- Subtasks needed for complex work + +**Creating Tasks:** +```bash +bd create "" \ + --type task \ + --parent \ + --description "" \ + --priority <0-4> \ + --json +``` + +## Workflow Patterns + +### Pattern 1: Default Fallback Task (No Label) +**Trigger:** Task has no label or doesn't match any specialized agent + +1. Review task description and acceptance criteria +2. Determine if this needs a specialized agent (implementation, qa, design) +3. If yes: Add the appropriate label, leave a comment, and **do not implement** (handoff via label) +4. If no: Proceed with coordination-only or general work, then follow standard workflow: + - Read context and plan + - Implement the work (if truly general) + - Run quality gates (test/lint/typecheck) + - Commit and update status +5. Apply coordination mindset: check dependencies, verify statuses match work, ensure quality + +### Pattern 2: Phase Check-in Task +**Trigger:** Task labeled `project-manager` for phase check-in + +1. Review epic and all child tasks using `bd list --parent --json` +2. Assess overall progress and identify any blockers +3. Check task statuses vs. actual work (commits, code, tests) +4. Document findings in epic comment with phase check-in report +5. Update any mismatched statuses +6. Create follow-up tasks if gaps are discovered +7. Provide guidance to tasks that need coordination + +### Pattern 3: Final Review Task +**Trigger:** Task labeled `project-manager` for final review (typically the "Generate Epic Revise Report" task) + +1. Comprehensive review of all tasks in epic +2. Verify all acceptance criteria are met across all tasks +3. Review all code changes and verify quality +4. Run quality gates and document results +5. Check for missing work, documentation, or follow-up needs +6. If PR review comments exist, create follow-up child tasks (engineering/qa labels) for each actionable comment +7. Keep the final review task **open** until follow-up tasks are closed; defer revise report until then +8. Update any incorrect task statuses +9. Create any missing tasks for follow-up work +10. Leave comprehensive final review comment on epic +11. Update epic status: close if complete, block if issues found +12. Generate revise report only when all follow-up tasks are closed + +## Communication Guidelines + +**Comments Should Be:** +- **Actionable**: Tell tasks what to do, not just what's wrong +- **Concise**: Get to the point quickly +- **Contextual**: Reference specific commits, files, or acceptance criteria +- **Encouraging**: Help tasks succeed, don't just point out problems + +**Examples:** +- βœ… "Task marked closed but commit abc123 shows only partial implementation. Please complete the error handling in api/users.ts before closing." +- βœ… "Epic progress: 5/8 tasks complete. Tasks 3 and 7 are blocked - need to resolve database migration issue first." +- ❌ "This is wrong" (not actionable) +- ❌ "Status doesn't match" (not specific) + +## Integration with Other Agents + +**As Default Fallback:** +- You are the routing safety net: **triage, label, delegate** +- Only implement when the task is truly coordination-only or no specialized agent applies +- For specialized work: + - If the task requires code changes β†’ Add the `engineering` label and note why in comments + - If task needs testing β†’ Add `qa` label and note in comments + - If task needs design β†’ Add `design` label and note in comments + +**Label taxonomy (quick reference):** + +| Label | Use when | Examples | +| --- | --- | --- | +| `engineering` | Task requires code changes | implement feature, fix bug, refactor, wire route/component | +| `qa` | Task is primarily verification/testing | add/adjust tests, reproduce/verify bug, QA checklist + evidence | +| `design` | Task is primarily UX/design decisions | UX spec, interaction decisions, layout behavior notes | +| `project-manager` | Coordination / planning / doc-only / triage; explicit coordination checkpoints | phase check-ins, final review, revise report generation, create follow-ups | + +**Rule:** Assign **exactly one** label per task. If unsure, default to `project-manager`. + +**As Project Manager (when labeled):** +- Your role is oversight and coordination, NOT direct implementation +- Delegate implementation work to appropriate specialized agents + +**When to Coordinate:** +- Multiple tasks need coordination β†’ Leave comments on all affected tasks +- Epic-level decisions needed β†’ Comment on epic, tag relevant tasks +- Blockers affecting multiple tasks β†’ Update epic status, notify all blocked tasks +- During check-ins: Help tasks understand priorities and next steps +- As default fallback: Apply coordination thinking even while implementing + +## Quality Standards + +**Your Work Should:** +- **As Default Fallback**: Implement tasks following standard workflow, with coordination mindset +- **As Project Manager**: Leave clear, comprehensive check-in and review reports +- Update statuses accurately based on actual state +- Create tasks with proper dependencies and acceptance criteria +- Help tasks understand priorities and next steps +- Apply coordination thinking even when implementing + +**When Acting as Default Fallback:** +- You ARE responsible for implementing code, writing tests, and routine task work +- Apply coordination thinking: check dependencies, verify statuses, ensure quality +- Delegate to specialized agents only when task clearly needs specialized handling + +**When Acting as Project Manager (explicitly labeled):** +- Focus on coordination and oversight, not direct implementation +- Delegate implementation work to appropriate specialized agents +- Focus on quality gates and coordination rather than deep technical implementation + +## Tools & Commands + +**Beads Commands:** +- `bd list --parent --json` - Get all tasks in epic +- `bd show --json` - Get task/epic details +- `bd update --status ` - Update status +- `bd comments add ""` - Add comment +- `bd create "" --parent <EPIC_ID> --json` - Create task + +**Git Commands:** +- `git log --oneline --grep="<task-id>"` - Find commits for task +- `git diff <commit>^..<commit>` - Review changes in commit + +**Quality Gates:** +- Check `package.json` for test/lint/typecheck commands +- Run quality gates when verifying task completion diff --git a/.devagent/plugins/ralph/agents/project-manager-agent.json b/.devagent/plugins/ralph/agents/project-manager-agent.json new file mode 100644 index 0000000..8260998 --- /dev/null +++ b/.devagent/plugins/ralph/agents/project-manager-agent.json @@ -0,0 +1,10 @@ +{ + "name": "Project Manager Agent", + "label": "project-manager", + "ai_tool": { + "name": "agent", + "command": "agent" + }, + "model_tier": "cheap", + "instructions_path": ".devagent/plugins/ralph/agents/project-manager-agent-instructions.md" +} diff --git a/.devagent/plugins/ralph/agents/qa-agent-instructions.md b/.devagent/plugins/ralph/agents/qa-agent-instructions.md new file mode 100644 index 0000000..70c2350 --- /dev/null +++ b/.devagent/plugins/ralph/agents/qa-agent-instructions.md @@ -0,0 +1,48 @@ +# QA Agent Instructions + +## Role & Purpose + +You are the **verification agent** for tasks labeled `qa`. + +Your job is to validate that an implementation meets acceptance criteria, that quality gates pass, and (when applicable) that UI behavior is correct with screenshots captured for failures. + +## Skills to Reference (Canonical) + +- `.devagent/plugins/ralph/skills/beads-integration/SKILL.md` +- `.devagent/plugins/ralph/skills/quality-gate-detection/SKILL.md` +- `.devagent/plugins/ralph/skills/agent-browser/SKILL.md` (UI verification + screenshots) +- `.devagent/plugins/ralph/skills/issue-logging/SKILL.md` + +## What to Do + +- Read the task acceptance criteria and **latest task comments** (`bd comments <task-id> --json`) before verifying each item. +- Run the repo’s real quality gates (read `package.json` scripts; don’t guess; see `quality-gate-detection` skill). +- For UI changes: + - Perform UI verification (agent-browser) with **DOM assertions** and capture screenshots for failures. + - Confirm routing, loading states, and error handling match expectations. + - Treat agent-browser verification as a dedicated QA step; include evidence of your verification in your comment. +- Do not make code changes as part of QA unless the task explicitly asks you to; your output is verification + evidence. +- If issues are found, follow the **QA fail semantics** below. + +## Output Requirements + +- Leave concise, actionable Beads comments that reference specific files/behaviors. +- Include commands run and results (pass/fail). +- Include screenshot paths if captured. + +## QA Fail Semantics (Status + Evidence) + +If verification fails for any reason (acceptance criteria, UI behavior, or quality gates): + +- Leave a **FAIL** Beads comment that includes: + - Expected vs actual + - Repro steps (or test command) and output + - Evidence paths (screenshots/logs) and any relevant doc links +- **Set the task status back to `open`** (MVP default). +- **Do not set `blocked`** for acceptance/verification failures. + - Only use `blocked` for true external dependencies (e.g., missing credentials, infra outage) that prevent verification at all. + +## QA Reopen Semantics (High-Confidence Improvements) + +- If QA identifies a high-confidence improvement with concrete fix guidance (what + where), **reopen the task to `open`** and include the fix direction in the FAIL comment. +- If the improvement is out of scope for the task, log it for the revise report instead of reopening. diff --git a/.devagent/plugins/ralph/agents/qa-agent.json b/.devagent/plugins/ralph/agents/qa-agent.json new file mode 100644 index 0000000..d4b937b --- /dev/null +++ b/.devagent/plugins/ralph/agents/qa-agent.json @@ -0,0 +1,10 @@ +{ + "name": "QA Agent", + "label": "qa", + "ai_tool": { + "name": "agent", + "command": "agent" + }, + "model_tier": "cheap", + "instructions_path": ".devagent/plugins/ralph/agents/qa-agent-instructions.md" +} diff --git a/.devagent/plugins/ralph/config.json b/.devagent/plugins/ralph/config.json new file mode 100644 index 0000000..4e4ba47 --- /dev/null +++ b/.devagent/plugins/ralph/config.json @@ -0,0 +1,5 @@ +{ + "enabled": true, + "beadsDir": ".beads", + "loopsDir": ".devagent/loops" +} diff --git a/.devagent/plugins/ralph/runs/starter-improvements.json b/.devagent/plugins/ralph/runs/starter-improvements.json new file mode 100644 index 0000000..488f305 --- /dev/null +++ b/.devagent/plugins/ralph/runs/starter-improvements.json @@ -0,0 +1,19 @@ +{ + "epic": { + "id": "react-router-starter-p5l" + }, + "run": { + "id": "starter-improvements-run-001", + "name": "React Router Starter Improvements", + "description": "Update react-router-starter to be a comprehensive prototype starting point with best practices from reportory", + "git": { + "base_branch": "main", + "working_branch": "feat/starter-improvements" + }, + "execution": { + "require_confirmation": false, + "max_iterations": 15, + "log_dir": ".devagent/plugins/ralph/output/logs" + } + } +} diff --git a/.devagent/plugins/ralph/tools/.ralph_last_output.txt b/.devagent/plugins/ralph/tools/.ralph_last_output.txt new file mode 100644 index 0000000..e69de29 diff --git a/.devagent/plugins/ralph/tools/__tests__/ralph-loop.test.ts b/.devagent/plugins/ralph/tools/__tests__/ralph-loop.test.ts new file mode 100644 index 0000000..0a23d99 --- /dev/null +++ b/.devagent/plugins/ralph/tools/__tests__/ralph-loop.test.ts @@ -0,0 +1,334 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { readFileSync, existsSync } from 'fs'; +import { join, dirname } from 'path'; +import { fileURLToPath } from 'url'; +import { execSync } from 'child_process'; + +/** + * Tests for Ralph's autonomous execution loop + * + * These tests verify that Ralph correctly: + * 1. Updates task status (todo β†’ in_progress β†’ closed) + * 2. Adds progress comments + * 3. Updates task metadata (priority, design, notes) + * 4. Completes loop execution successfully + */ + +// Get current file directory for ESM compatibility +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +describe('Ralph Loop Update Verification', () => { + const TEST_TASK_ID = 'test-ralph-task-001'; + const TEST_EPIC_ID = 'test-ralph-epic-001'; + // Use absolute path from project root + const PROJECT_ROOT = join(__dirname, '../../../../..'); + const SCRIPT_DIR = join(PROJECT_ROOT, '.devagent/plugins/ralph/tools'); + const CONFIG_FILE = join(SCRIPT_DIR, 'config.json'); + + beforeEach(() => { + // Reset any mocks or test state + vi.clearAllMocks(); + }); + + afterEach(() => { + // Cleanup test artifacts if needed + }); + + describe('Task Status Updates', () => { + it('should update task status from todo to in_progress', () => { + // Verify that bd update command works for status transitions + // This tests the core status update mechanism + const command = `bd update ${TEST_TASK_ID} --status in_progress`; + + // In a real test environment, we would mock the bd CLI + // For now, we verify the command structure is correct + expect(command).toContain('bd update'); + expect(command).toContain('--status in_progress'); + expect(command).toContain(TEST_TASK_ID); + }); + + it('should update task status from in_progress to closed', () => { + const command = `bd update ${TEST_TASK_ID} --status closed`; + + expect(command).toContain('bd update'); + expect(command).toContain('--status closed'); + expect(command).toContain(TEST_TASK_ID); + }); + + it('should handle status transitions correctly in ralph.sh', () => { + // Verify that ralph.sh script contains the expected status update logic + const scriptPath = join(SCRIPT_DIR, 'ralph.sh'); + + if (!existsSync(scriptPath)) { + // Skip if script doesn't exist (e.g., in CI without .devagent) + return; + } + + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + // Verify script marks task as in_progress + expect(scriptContent).toContain('bd update "$READY_TASK" --status in_progress'); + + // Verify script expects agent to mark as closed + expect(scriptContent).toContain('bd update $READY_TASK --status closed'); + }); + + it('should verify actual status update from todo to in_progress', () => { + // Test with actual Beads CLI if available + // This verifies the status update actually works in the database + const PROJECT_ROOT = join(__dirname, '../../../../..'); + + try { + // Check if bd command is available + execSync('which bd', { encoding: 'utf-8' }); + + // Get current task status (reportory-kl9.1 is already in_progress) + // We'll verify the command works by checking the script logic + const scriptPath = join(SCRIPT_DIR, 'ralph.sh'); + if (existsSync(scriptPath)) { + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + // Verify the exact command pattern used in ralph.sh + expect(scriptContent).toMatch(/bd update ["']?\$READY_TASK["']? --status in_progress/); + + // Verify status update happens before task execution + const inProgressIndex = scriptContent.indexOf('bd update "$READY_TASK" --status in_progress'); + const taskDetailsIndex = scriptContent.indexOf('TASK_DETAILS'); + expect(inProgressIndex).toBeLessThan(taskDetailsIndex); + } + } catch (error) { + // bd command not available, skip actual execution test + // This is expected in CI environments without Beads CLI + } + }); + + it('should verify status changes are reflected in Beads database', () => { + // Verify that status updates persist in the database + const PROJECT_ROOT = join(__dirname, '../../../../..'); + + try { + // Check if bd command is available + execSync('which bd', { encoding: 'utf-8' }); + + // Verify we can query task status + const testTaskId = 'reportory-kl9.1'; + const output = execSync(`bd show ${testTaskId} --json`, { + encoding: 'utf-8', + cwd: PROJECT_ROOT + }); + + const taskData = JSON.parse(output); + const task = Array.isArray(taskData) ? taskData[0] : taskData; + + // Verify task has status field + expect(task).toHaveProperty('status'); + expect(['todo', 'in_progress', 'closed', 'blocked']).toContain(task.status); + + // Verify task has updated_at timestamp (indicates database tracking) + expect(task).toHaveProperty('updated_at'); + } catch (error) { + // bd command not available or task doesn't exist, skip database test + // This is expected in CI environments without Beads CLI + } + }); + }); + + describe('Progress Comments', () => { + it('should add progress comments to tasks', () => { + const commentCommand = `bd comment ${TEST_TASK_ID} --body "Progress update: Task implementation started"`; + + expect(commentCommand).toContain('bd comment'); + expect(commentCommand).toContain('--body'); + expect(commentCommand).toContain(TEST_TASK_ID); + }); + + it('should support commit information in comments', () => { + const commitHash = 'abc123'; + const commitSubject = 'feat(ralph): test task implementation'; + const commentBody = `Commit: ${commitHash} - ${commitSubject}`; + + const commentCommand = `bd comment ${TEST_TASK_ID} --body "${commentBody}"`; + + expect(commentCommand).toContain(commitHash); + expect(commentCommand).toContain(commitSubject); + }); + + it('should support revision learning comments', () => { + const revisionLearning = `Revision Learning: +**Category**: Process +**Priority**: Medium +**Issue**: Test execution loop verification +**Recommendation**: Add integration tests for full loop +**Files/Rules Affected**: .devagent/plugins/ralph/tools/ralph.sh`; + + const commentCommand = `bd comment ${TEST_TASK_ID} --body "${revisionLearning}"`; + + expect(commentCommand).toContain('Revision Learning'); + expect(commentCommand).toContain('Category'); + }); + }); + + describe('Task Metadata Updates', () => { + it('should update task priority', () => { + const priorityCommand = `bd update ${TEST_TASK_ID} --priority P1`; + + expect(priorityCommand).toContain('bd update'); + expect(priorityCommand).toContain('--priority P1'); + }); + + it('should update task design notes', () => { + const designNotes = 'Use test-driven approach for verification'; + const designCommand = `bd update ${TEST_TASK_ID} --design "${designNotes}"`; + + expect(designCommand).toContain('--design'); + expect(designCommand).toContain(designNotes); + }); + + it('should update task general notes', () => { + const notes = 'Requires Beads CLI to be configured'; + const notesCommand = `bd update ${TEST_TASK_ID} --notes "${notes}"`; + + expect(notesCommand).toContain('--notes'); + expect(notesCommand).toContain(notes); + }); + + it('should support multiple metadata updates', () => { + const combinedCommand = `bd update ${TEST_TASK_ID} --priority P2 --design "Test design" --notes "Test notes"`; + + expect(combinedCommand).toContain('--priority'); + expect(combinedCommand).toContain('--design'); + expect(combinedCommand).toContain('--notes'); + }); + }); + + describe('Loop Execution Completion', () => { + it('should query ready tasks correctly', () => { + const readyCommand = 'bd ready --json'; + + expect(readyCommand).toContain('bd ready'); + expect(readyCommand).toContain('--json'); + }); + + it('should handle empty task list', () => { + // Verify script handles no ready tasks + const scriptPath = join(SCRIPT_DIR, 'ralph.sh'); + + if (!existsSync(scriptPath)) { + return; + } + + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + expect(scriptContent).toContain('No more ready tasks'); + expect(scriptContent).toContain('Execution complete'); + }); + + it('should check epic status before processing tasks', () => { + const scriptPath = join(SCRIPT_DIR, 'ralph.sh'); + + if (!existsSync(scriptPath)) { + return; + } + + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + // Verify epic status check exists + expect(scriptContent).toContain('EPIC_STATUS'); + expect(scriptContent).toContain('blocked'); + expect(scriptContent).toContain('done'); + }); + + it('should respect max iterations limit', () => { + const scriptPath = join(SCRIPT_DIR, 'ralph.sh'); + + if (!existsSync(scriptPath)) { + return; + } + + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + expect(scriptContent).toContain('MAX_ITERATIONS'); + expect(scriptContent).toContain('ITERATION'); + }); + + it('should handle task details extraction', () => { + const scriptPath = join(SCRIPT_DIR, 'ralph.sh'); + + if (!existsSync(scriptPath)) { + return; + } + + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + // Verify script extracts task details + expect(scriptContent).toContain('TASK_DETAILS'); + expect(scriptContent).toContain('TASK_DESCRIPTION'); + expect(scriptContent).toContain('TASK_ACCEPTANCE'); + expect(scriptContent).toContain('TASK_TITLE'); + }); + }); + + describe('Configuration and Quality Gates', () => { + it('should load configuration from config.json', () => { + if (!existsSync(CONFIG_FILE)) { + return; + } + + expect(existsSync(CONFIG_FILE)).toBe(true); + + const config = JSON.parse(readFileSync(CONFIG_FILE, 'utf-8')); + + expect(config).toHaveProperty('ai_tool'); + expect(config).toHaveProperty('quality_gates'); + expect(config).toHaveProperty('execution'); + }); + + it('should support quality gate commands', () => { + if (!existsSync(CONFIG_FILE)) { + return; + } + + const config = JSON.parse(readFileSync(CONFIG_FILE, 'utf-8')); + + if (config.quality_gates?.commands) { + expect(config.quality_gates.commands).toHaveProperty('test'); + expect(config.quality_gates.commands).toHaveProperty('lint'); + expect(config.quality_gates.commands).toHaveProperty('typecheck'); + } + }); + }); + + describe('Integration: Full Loop Flow', () => { + it('should follow correct sequence: ready β†’ in_progress β†’ closed', () => { + // Verify the expected sequence of operations + const sequence = [ + 'bd ready --json', // 1. Get ready task + 'bd update <task-id> --status in_progress', // 2. Mark in progress + 'bd show <task-id> --json', // 3. Get task details + // ... agent implementation ... + 'bd update <task-id> --status closed', // 4. Mark closed + 'bd comment <task-id> --body "..."', // 5. Add comments + ]; + + expect(sequence.length).toBeGreaterThan(0); + expect(sequence[0]).toContain('bd ready'); + expect(sequence[1]).toContain('--status in_progress'); + expect(sequence[sequence.length - 2]).toContain('--status closed'); + }); + + it('should handle task failure scenarios', () => { + const scriptPath = join(SCRIPT_DIR, 'ralph.sh'); + + if (!existsSync(scriptPath)) { + return; + } + + const scriptContent = readFileSync(scriptPath, 'utf-8'); + + // Verify failure handling + expect(scriptContent).toContain('EXIT_CODE'); + expect(scriptContent).toContain('failed'); + }); + }); +}); diff --git a/.devagent/plugins/ralph/tools/agent-runner.test.ts b/.devagent/plugins/ralph/tools/agent-runner.test.ts new file mode 100644 index 0000000..167a4dd --- /dev/null +++ b/.devagent/plugins/ralph/tools/agent-runner.test.ts @@ -0,0 +1,330 @@ +import { describe, expect, it } from 'vitest'; + +/** + * Unit tests for agent-runner.ts + * + * These tests focus on testable logic without complex mocking. + * Integration tests would require actual agent CLI execution. + */ + +describe('agent-runner', () => { + describe('Agent configuration validation', () => { + const SUPPORTED_AGENTS = ['cursor', 'opencode', 'claude', 'gemini', 'jules']; + + it('should support all required agents', () => { + SUPPORTED_AGENTS.forEach((agent) => { + expect(SUPPORTED_AGENTS).toContain(agent); + }); + }); + + it('should reject unknown agents', () => { + const unknownAgents = ['unknown', 'invalid', 'test-agent']; + unknownAgents.forEach((agent) => { + expect(SUPPORTED_AGENTS).not.toContain(agent); + }); + }); + }); + + describe('CLI argument parsing logic', () => { + it('should parse --agent flag', () => { + const args = ['node', 'agent-runner.ts', '--agent', 'cursor', '--prompt', 'test']; + const agentIndex = args.indexOf('--agent'); + const agent = agentIndex !== -1 ? args[agentIndex + 1] : undefined; + expect(agent).toBe('cursor'); + }); + + it('should parse --prompt flag', () => { + const args = ['node', 'agent-runner.ts', '--agent', 'cursor', '--prompt', 'test prompt']; + const promptIndex = args.indexOf('--prompt'); + const prompt = promptIndex !== -1 ? args[promptIndex + 1] : undefined; + expect(prompt).toBe('test prompt'); + }); + + it('should parse --prompt-file flag', () => { + const args = ['node', 'agent-runner.ts', '--agent', 'cursor', '--prompt-file', '/path/to/file']; + const fileIndex = args.indexOf('--prompt-file'); + const file = fileIndex !== -1 ? args[fileIndex + 1] : undefined; + expect(file).toBe('/path/to/file'); + }); + + it('should parse --attempts flag', () => { + const args = ['node', 'agent-runner.ts', '--agent', 'cursor', '--prompt', 'test', '--attempts', '5']; + const attemptsIndex = args.indexOf('--attempts'); + const attempts = attemptsIndex !== -1 ? Number(args[attemptsIndex + 1]) : undefined; + expect(attempts).toBe(5); + }); + + it('should parse extra args after --', () => { + const args = ['node', 'agent-runner.ts', '--agent', 'cursor', '--prompt', 'test', '--', '--model', 'claude-3.5']; + const dd = args.indexOf('--'); + const extraArgs = dd === -1 ? [] : args.slice(dd + 1); + expect(extraArgs).toEqual(['--model', 'claude-3.5']); + }); + + it('should require --agent flag', () => { + const args = ['node', 'agent-runner.ts', '--prompt', 'test']; + const agentIndex = args.indexOf('--agent'); + const agent = agentIndex !== -1 ? args[agentIndex + 1] : undefined; + expect(agent).toBeUndefined(); + }); + + it('should require either --prompt or --prompt-file', () => { + const args1 = ['node', 'agent-runner.ts', '--agent', 'cursor', '--prompt', 'test']; + const args2 = ['node', 'agent-runner.ts', '--agent', 'cursor', '--prompt-file', '/path/to/file']; + const args3 = ['node', 'agent-runner.ts', '--agent', 'cursor']; + + const hasPrompt1 = args1.includes('--prompt') || args1.includes('--prompt-file'); + const hasPrompt2 = args2.includes('--prompt') || args2.includes('--prompt-file'); + const hasPrompt3 = args3.includes('--prompt') || args3.includes('--prompt-file'); + + expect(hasPrompt1).toBe(true); + expect(hasPrompt2).toBe(true); + expect(hasPrompt3).toBe(false); + }); + }); + + describe('Wake message formatting', () => { + function truncateTail(s: string, n: number): string { + if (n <= 0) return ''; + if (s.length <= n) return s; + return '…(truncated)…\n' + s.slice(s.length - n); + } + + it('should format basic wake message on success', () => { + const output = 'Task completed successfully'; + const logPath = '/tmp/logs/agent_cursor_2026-01-27.log'; + const base = `cursor Agent succeeded on attempt 1/3. Log: ${logPath}`; + const outputTail = truncateTail(output, 1500); + const msg = outputTail ? `${base}\n\n--- output (tail) ---\n${outputTail}` : base; + + expect(msg).toContain('cursor Agent succeeded'); + expect(msg).toContain(logPath); + expect(msg).toContain(output); + }); + + it('should format summarize wake message when --wake-summarize is set', () => { + const promptText = 'Implement feature X'; + const output = 'Feature X has been implemented'; + const logPath = '/tmp/logs/agent_cursor_2026-01-27.log'; + const taskBlock = `Task (from prompt):\n${promptText.slice(0, 500)}`; + const outputTail = truncateTail(output, 1500); + + const msg = `cursor Agent delegation completed. + +**Status:** success (attempt 1/3) +**Agent:** cursor +**Log:** ${logPath} + +${taskBlock} + +**Output${outputTail.includes('(truncated)') ? ' (tail)' : ''}:** +${outputTail || '(no output)'} + +--- +Please summarize what was accomplished (or what failed) and highlight any key findings, deliverables, or recommended next steps.`; + + expect(msg).toContain('Agent delegation completed'); + expect(msg).toContain('Please summarize'); + expect(msg).toContain(promptText); + expect(msg).toContain(output); + }); + + it('should include task description in summarize wake when provided', () => { + const taskDescription = 'Implement user authentication'; + const output = 'Auth implemented'; + const logPath = '/tmp/logs/agent_cursor_2026-01-27.log'; + const taskBlock = `Task: ${taskDescription}`; + const outputTail = truncateTail(output, 1500); + + const msg = `cursor Agent delegation completed. + +**Status:** success (attempt 1/3) +**Agent:** cursor +**Log:** ${logPath} + +${taskBlock} + +**Output:** +${outputTail || '(no output)'} + +--- +Please summarize what was accomplished (or what failed) and highlight any key findings, deliverables, or recommended next steps.`; + + expect(msg).toContain(`Task: ${taskDescription}`); + expect(msg).not.toContain('Task (from prompt)'); + }); + + it('should truncate long output in wake messages', () => { + const longOutput = 'x'.repeat(2000); + const truncated = truncateTail(longOutput, 1500); + + expect(truncated).toContain('(truncated)'); + expect(truncated.length).toBeLessThanOrEqual(1500 + 20); // 20 for prefix + expect(truncated.endsWith('x'.repeat(1500))).toBe(true); + }); + + it('should not truncate short output', () => { + const shortOutput = 'Short output'; + const truncated = truncateTail(shortOutput, 1500); + + expect(truncated).not.toContain('(truncated)'); + expect(truncated).toBe(shortOutput); + }); + }); + + describe('Failure pattern detection', () => { + it('should detect cursor connection stall pattern', () => { + const output = 'Connection stalled during execution'; + const pattern = /Connection stalled/i; + const detected = pattern.test(output); + expect(detected).toBe(true); + }); + + it('should detect Windows-style connection stall', () => { + // The pattern /C:\s*Connection stalled/i matches "C:" followed by optional whitespace + // Test with space after colon (most common case) + const output1 = 'C: Connection stalled'; + const pattern = /C:\s*Connection stalled/i; + const detected1 = pattern.test(output1); + expect(detected1).toBe(true); + + // Test with no space (colon directly before "Connection") + const output2 = 'C:Connection stalled'; + const detected2 = pattern.test(output2); + expect(detected2).toBe(true); + }); + + it('should not detect failure in normal output', () => { + const output = 'Task completed successfully'; + const pattern = /Connection stalled/i; + const detected = pattern.test(output); + expect(detected).toBe(false); + }); + }); + + describe('Retry logic', () => { + it('should calculate exponential backoff correctly', () => { + const sleepMs = 8000; + const backoff = 1.5; + let delay = sleepMs; + + // Simulate retries + const delays: number[] = []; + for (let i = 0; i < 3; i++) { + delays.push(delay); + delay = Math.round(delay * backoff); + } + + expect(delays[0]).toBe(8000); + expect(delays[1]).toBe(12000); // 8000 * 1.5 + expect(delays[2]).toBe(18000); // 12000 * 1.5 + }); + + it('should validate attempts parameter', () => { + const validAttempts = 3; + const invalidAttempts = 0; + const invalidAttempts2 = -1; + const invalidAttempts3 = NaN; + + expect(Number.isFinite(validAttempts) && validAttempts >= 1).toBe(true); + expect(Number.isFinite(invalidAttempts) && invalidAttempts >= 1).toBe(false); + expect(Number.isFinite(invalidAttempts2) && invalidAttempts2 >= 1).toBe(false); + expect(Number.isFinite(invalidAttempts3) && invalidAttempts3 >= 1).toBe(false); + }); + }); + + describe('Agent command building', () => { + it('should build cursor command with default model when not provided', () => { + const prompt = 'test prompt'; + const extraArgs: string[] = []; + const hasModel = extraArgs.some((arg, i) => + arg === '--model' || arg === '-m' || (i > 0 && (extraArgs[i - 1] === '--model' || extraArgs[i - 1] === '-m')) + ); + const baseArgs = ['-p', ...(hasModel ? [] : ['--model', 'auto']), '--output-format', 'text', '--approve-mcps', '--force']; + const args = [...baseArgs, ...extraArgs, prompt]; + + expect(args).toContain('--model'); + expect(args).toContain('auto'); + expect(args).toContain(prompt); + }); + + it('should not add default model when --model is in extra args', () => { + const prompt = 'test prompt'; + const extraArgs = ['--model', 'claude-3.5']; + const hasModel = extraArgs.some((arg, i) => + arg === '--model' || arg === '-m' || (i > 0 && (extraArgs[i - 1] === '--model' || extraArgs[i - 1] === '-m')) + ); + const baseArgs = ['-p', ...(hasModel ? [] : ['--model', 'auto']), '--output-format', 'text', '--approve-mcps', '--force']; + const args = [...baseArgs, ...extraArgs, prompt]; + + // Should not have duplicate --model auto + const modelAutoIndex = args.indexOf('--model'); + const nextArg = args[modelAutoIndex + 1]; + expect(nextArg).not.toBe('auto'); + expect(nextArg).toBe('claude-3.5'); + }); + + it('should build opencode command correctly', () => { + const prompt = 'test prompt'; + const extraArgs: string[] = []; + const args = ['-p', prompt, ...extraArgs]; + + expect(args[0]).toBe('-p'); + expect(args[1]).toBe(prompt); + }); + + it('should build claude command with required flags', () => { + const prompt = 'test prompt'; + const extraArgs: string[] = []; + const args = ['-p', prompt, '--allowedTools', 'computer,mcp', '--output-format', 'text', ...extraArgs]; + + expect(args).toContain('--allowedTools'); + expect(args).toContain('computer,mcp'); + expect(args).toContain('--output-format'); + expect(args).toContain('text'); + }); + + it('should build jules command with run subcommand', () => { + const prompt = 'test prompt'; + const extraArgs: string[] = []; + const args = ['run', prompt, ...extraArgs]; + + expect(args[0]).toBe('run'); + expect(args[1]).toBe(prompt); + }); + }); + + describe('Log file path generation', () => { + it('should generate log file path with agent name and timestamp', () => { + const logDir = '/tmp/logs'; + const runId = '2026-01-27T12-00-00-000Z'; + const agent = 'cursor'; + const logPath = `${logDir}/agent_${agent}_${runId}.log`; + + expect(logPath).toContain('agent_cursor_'); + expect(logPath).toContain('.log'); + expect(logPath).toContain(logDir); + expect(logPath).toContain(runId); + }); + + it('should format log header with metadata', () => { + const header = [ + `Run: test-run-id`, + `Agent: cursor`, + `Repo: /tmp/repo`, + `Attempts: 3`, + `Timeout: 600000ms`, + `Extra args: --model claude-3.5`, + '--- prompt ---', + 'test prompt', + '--- end prompt ---', + '', + ].join('\n'); + + expect(header).toContain('Agent: cursor'); + expect(header).toContain('test prompt'); + expect(header).toContain('Attempts: 3'); + expect(header).toContain('Timeout: 600000ms'); + }); + }); +}); diff --git a/.devagent/plugins/ralph/tools/agent-runner.ts b/.devagent/plugins/ralph/tools/agent-runner.ts new file mode 100644 index 0000000..03e1a7d --- /dev/null +++ b/.devagent/plugins/ralph/tools/agent-runner.ts @@ -0,0 +1,46 @@ +#!/usr/bin/env bun +/** + * agent-runner.ts + * + * CLI entry point for the multi-agent delegation runner. + * This is a thin wrapper around the modular implementation in the agent-runner/ directory. + * + * Multi-agent delegation runner that generalizes agent execution across multiple CLI-based coding agents. + * Supports cursor, opencode, claude, gemini, and jules with retries, logging, and Clawdbot wake notifications. + * + * Usage: + * bun agent-runner.ts --agent cursor --repo /path/to/repo --prompt "..." --attempts 3 + * bun agent-runner.ts --agent opencode --prompt-file /path/to/prompt.txt --wake-summarize + * + * Options: + * --agent <name> Agent to use: cursor, opencode, claude, gemini, jules (required) + * --repo <path> Working directory (default: cwd) + * --prompt <text> Inline prompt text + * --prompt-file <path> Path to file containing prompt + * --attempts <n> Max retry attempts (default: 3) + * --sleep-ms <ms> Initial retry delay (default: 8000) + * --backoff <factor> Exponential backoff multiplier (default: 1.5) + * --timeout-ms <ms> Per-attempt timeout (default: 600000 = 10 min) + * --log-dir <path> Directory for run logs (default: .devagent/logs/agent-runs) + * --wake-summarize Format wake message as a prompt for AI to summarize + * --task-description <text> Short description for wake context + * --wake-output-chars <n> Include last N chars of output in wake (default: 1500) + * -- <extra args> Pass through to the underlying agent CLI + * + * Export: + * import { runAgent } from './agent-runner'; + * const result = await runAgent({ agent: 'cursor', prompt: '...', repo: '...' }); + */ + +import { runAgent, parseCLIArgs } from './agent-runner/index'; + +if (import.meta.main) { + try { + const opts = parseCLIArgs(process.argv); + const result = await runAgent(opts); + process.exit(result.success ? 0 : 1); + } catch (error) { + console.error('Error:', error instanceof Error ? error.message : String(error)); + process.exit(2); + } +} diff --git a/.devagent/plugins/ralph/tools/agent-runner/agent-runner.test.ts b/.devagent/plugins/ralph/tools/agent-runner/agent-runner.test.ts new file mode 100644 index 0000000..0c80bd5 --- /dev/null +++ b/.devagent/plugins/ralph/tools/agent-runner/agent-runner.test.ts @@ -0,0 +1,258 @@ +/** + * agent-runner.test.ts + * + * Consolidated tests for the agent runner module. + */ +import { describe, expect, it } from 'vitest'; +import { agents, getAgent, listAgents } from './agents'; +import { parseCLIArgs, buildWakeMessage, truncateTail, calculateNextDelay } from './utils'; + +describe('Agent Runner', () => { + describe('Agent Registry', () => { + const SUPPORTED_AGENTS = ['cursor', 'opencode', 'claude', 'gemini', 'jules']; + + it('should have all built-in agents registered', () => { + const registeredAgents = listAgents(); + SUPPORTED_AGENTS.forEach((agent) => { + expect(registeredAgents).toContain(agent); + }); + }); + + it('should return a valid agent definition', () => { + const agent = getAgent('cursor'); + expect(agent).toBeDefined(); + expect(agent?.command).toBe('agent'); + }); + + it('should return undefined for unknown agent', () => { + const agent = getAgent('unknown-agent'); + expect(agent).toBeUndefined(); + }); + }); + + describe('Agent Command Building', () => { + it('cursor agent should add --model auto by default', () => { + const agent = getAgent('cursor'); + const args = agent?.buildArgs('test', []); + expect(args).toContain('--model'); + expect(args).toContain('auto'); + }); + + it('cursor agent should not add --model auto if already present', () => { + const agent = getAgent('cursor'); + const args = agent?.buildArgs('test', ['--model', 'claude-3.5']); + const modelIndices = args?.map((arg, i) => (arg === '--model' ? i : -1)).filter((i) => i !== -1); + expect(modelIndices?.length).toBe(1); + expect(args?.[modelIndices![0] + 1]).toBe('claude-3.5'); + }); + + it('claude agent should add required flags', () => { + const agent = getAgent('claude'); + const args = agent?.buildArgs('test', []); + expect(args).toContain('--allowedTools'); + expect(args).toContain('computer,mcp'); + }); + + it('jules agent should use the "run" subcommand', () => { + const agent = getAgent('jules'); + const args = agent?.buildArgs('test', []); + expect(args?.[0]).toBe('run'); + }); + }); + + describe('Failure Pattern Detection', () => { + it('should detect failure patterns in agent output', () => { + const cursorAgent = getAgent('cursor'); + const output = 'Error: Connection stalled'; + const patterns = cursorAgent?.failurePatterns ?? []; + const detected = patterns.some((p) => p.test(output)); + expect(detected).toBe(true); + }); + + it('should not detect failure in normal output', () => { + const cursorAgent = getAgent('cursor'); + const output = 'Process completed successfully.'; + const patterns = cursorAgent?.failurePatterns ?? []; + const detected = patterns.some((p) => p.test(output)); + expect(detected).toBe(false); + }); + }); + + describe('CLI Argument Parsing', () => { + it('should parse the --agent flag correctly', () => { + const argv = ['node', 'agent-runner.ts', '--agent', 'cursor', '--prompt', 'test']; + const opts = parseCLIArgs(argv); + expect(opts.agent).toBe('cursor'); + }); + + it('should parse the --prompt flag correctly', () => { + const argv = ['node', 'agent-runner.ts', '--agent', 'cursor', '--prompt', 'a test prompt']; + const opts = parseCLIArgs(argv); + expect(opts.prompt).toBe('a test prompt'); + }); + + it('should parse numeric flags correctly', () => { + const argv = [ + 'node', + 'agent-runner.ts', + '--agent', + 'cursor', + '--prompt', + 'test', + '--attempts', + '5', + '--sleep-ms', + '10000', + ]; + const opts = parseCLIArgs(argv); + expect(opts.attempts).toBe(5); + expect(opts.sleepMs).toBe(10000); + }); + + it('should correctly parse extra arguments after --', () => { + const argv = [ + 'node', + 'agent-runner.ts', + '--agent', + 'cursor', + '--prompt', + 'test', + '--', + '--model', + 'claude-3.5-sonnet', + '--another-arg', + ]; + const opts = parseCLIArgs(argv); + expect(opts.extraArgs).toEqual(['--model', 'claude-3.5-sonnet', '--another-arg']); + }); + + it('should handle runner arguments and extra arguments correctly', () => { + const argv = [ + 'node', + 'agent-runner.ts', + '--agent', + 'cursor', + '--prompt', + 'test', + '--timeout-ms', + '300000', + '--', + '--model', + 'claude-3.5-sonnet', + ]; + const opts = parseCLIArgs(argv); + expect(opts.timeoutMs).toBe(300000); + expect(opts.extraArgs).toEqual(['--model', 'claude-3.5-sonnet']); + }); + + it('should handle no extra arguments when -- is not present', () => { + const argv = ['node', 'agent-runner.ts', '--agent', 'cursor', '--prompt', 'test']; + const opts = parseCLIArgs(argv); + expect(opts.extraArgs).toEqual([]); + }); + + it('should throw an error if --agent is missing', () => { + const argv = ['node', 'agent-runner.ts', '--prompt', 'test']; + expect(() => parseCLIArgs(argv)).toThrow('--agent is required'); + }); + + it('should throw an error if both --prompt and --prompt-file are missing', () => { + const argv = ['node', 'agent-runner.ts', '--agent', 'cursor']; + expect(() => parseCLIArgs(argv)).toThrow('Provide --prompt or --prompt-file'); + }); + }); + + describe('Retry Logic', () => { + describe('calculateNextDelay', () => { + it('should calculate exponential backoff without jitter', () => { + let delay = 1000; + const backoff = 1.5; + + delay = calculateNextDelay(delay, backoff, false); + expect(delay).toBe(1500); + + delay = calculateNextDelay(delay, backoff, false); + expect(delay).toBe(2250); + + delay = calculateNextDelay(delay, backoff, false); + expect(delay).toBe(3375); + }); + + it('should calculate exponential backoff with jitter', () => { + const delay = 1000; + const backoff = 1.5; + const nextDelay = 1500; + + for (let i = 0; i < 100; i++) { + const result = calculateNextDelay(delay, backoff, true); + // Jitter is Β±25%, so the range is [1500 * 0.75, 1500 * 1.25] + expect(result).toBeGreaterThanOrEqual(nextDelay * 0.75); + expect(result).toBeLessThanOrEqual(nextDelay * 1.25); + } + }); + + it('should cap the delay at maxDelay', () => { + let delay = 5000; + const backoff = 2; + const maxDelay = 8000; + + delay = calculateNextDelay(delay, backoff, false, maxDelay); + expect(delay).toBe(8000); // 5000 * 2 = 10000, capped at 8000 + }); + + it('should not exceed maxDelay even with jitter', () => { + const delay = 8000; + const backoff = 2; + const maxDelay = 10000; + + for (let i = 0; i < 100; i++) { + const result = calculateNextDelay(delay, backoff, true, maxDelay); + expect(result).toBeLessThanOrEqual(maxDelay); + } + }); + }); + }); + + describe('Wake Message Formatting', () => { + it('should format a basic success message correctly', () => { + const msg = buildWakeMessage({ + status: 'success', + attempt: 1, + totalAttempts: 3, + logPath: '/log.txt', + output: 'Success!', + wakeOutputChars: 100, + agent: 'cursor', + promptText: 'test', + }); + expect(msg).toContain('cursor Agent succeeded on attempt 1/3'); + expect(msg).toContain('Log: /log.txt'); + expect(msg).toContain('Success!'); + }); + + it('should format a summarize wake message correctly', () => { + const msg = buildWakeMessage({ + status: 'success', + attempt: 1, + totalAttempts: 3, + logPath: '/log.txt', + output: 'Success!', + wakeOutputChars: 100, + agent: 'cursor', + wakeSummarize: true, + taskDescription: 'Do the thing', + promptText: 'test', + }); + expect(msg).toContain('Agent delegation completed'); + expect(msg).toContain('Task: Do the thing'); + expect(msg).toContain('Please summarize'); + }); + + it('should truncate long output correctly', () => { + const longOutput = 'a'.repeat(200); + const truncated = truncateTail(longOutput, 100); + expect(truncated).toContain('…(truncated)…'); + expect(truncated.length).toBeLessThan(120); + }); + }); +}); diff --git a/.devagent/plugins/ralph/tools/agent-runner/agents.ts b/.devagent/plugins/ralph/tools/agent-runner/agents.ts new file mode 100644 index 0000000..1457f66 --- /dev/null +++ b/.devagent/plugins/ralph/tools/agent-runner/agents.ts @@ -0,0 +1,76 @@ +/** + * agents.ts + * + * Agent configurations as a simple object map. + * No classes, no registry, no side-effect imports. + */ + +export interface AgentConfig { + command: string; + buildArgs: (prompt: string, extraArgs: string[]) => string[]; + failurePatterns?: RegExp[]; + defaultTimeout?: number; +} + +export const agents = { + cursor: { + command: 'agent', + buildArgs: (prompt: string, extraArgs: string[]) => { + const hasModel = extraArgs.some( + (arg, i) => + arg === '--model' || + arg === '-m' || + (i > 0 && (extraArgs[i - 1] === '--model' || extraArgs[i - 1] === '-m')) + ); + return [ + '-p', + ...(hasModel ? [] : ['--model', 'auto']), + '--output-format', + 'text', + '--approve-mcps', + '--force', + ...extraArgs, + prompt, + ]; + }, + failurePatterns: [/Connection stalled/i, /C:\\s*Connection stalled/i], + }, + + claude: { + command: 'claude', + buildArgs: (prompt: string, extraArgs: string[]) => [ + '-p', + prompt, + '--allowedTools', + 'computer,mcp', + '--output-format', + 'text', + ...extraArgs, + ], + }, + + opencode: { + command: 'opencode', + buildArgs: (prompt: string, extraArgs: string[]) => ['-p', prompt, ...extraArgs], + }, + + gemini: { + command: 'gemini', + buildArgs: (prompt: string, extraArgs: string[]) => ['-p', prompt, ...extraArgs], + }, + + jules: { + command: 'jules', + buildArgs: (prompt: string, extraArgs: string[]) => ['run', '-p', prompt, ...extraArgs], + }, +} as const satisfies Record<string, AgentConfig>; + +export type AgentName = keyof typeof agents; + +export function getAgent(name: string): AgentConfig | undefined { + return agents[name as AgentName]; +} + +export function listAgents(): string[] { + return Object.keys(agents); +} diff --git a/.devagent/plugins/ralph/tools/agent-runner/index.ts b/.devagent/plugins/ralph/tools/agent-runner/index.ts new file mode 100644 index 0000000..26d2ee9 --- /dev/null +++ b/.devagent/plugins/ralph/tools/agent-runner/index.ts @@ -0,0 +1,247 @@ +/** + * index.ts + * + * Main entry point for the agent runner module. + * Consolidates runner logic with exports. + */ +import { spawn } from 'node:child_process'; +import { resolve } from 'node:path'; +import type { AgentRunOptions, AgentRunResult } from './types'; +import { getAgent, listAgents, type AgentConfig } from './agents'; +import { + nowStamp, + setupLogDir, + writeLogHeader, + writeLog, + sleep, + calculateNextDelay, + maybeWake, + buildWakeMessage, + parseCLIArgs, +} from './utils'; + +// Re-export types and utilities for external use +export { parseCLIArgs } from './utils'; +export * from './types'; +export { agents, listAgents, getAgent } from './agents'; + +async function readPrompt(opts: AgentRunOptions): Promise<string> { + if (opts.promptFile) { + const file = Bun.file(opts.promptFile); + return await file.text(); + } + if (opts.prompt) { + return opts.prompt; + } + throw new Error('Missing --prompt or --prompt-file'); +} + +function detectFailure(output: string, patterns?: RegExp[]): boolean { + if (!patterns || patterns.length === 0) return false; + return patterns.some((pattern) => pattern.test(output)); +} + +async function runAgentCommand( + config: AgentConfig, + prompt: string, + cwd: string, + extraArgs: string[], + timeoutMs: number +): Promise<{ exitCode: number; stdout: string; stderr: string }> { + const cmd = config.command; + const args = config.buildArgs(prompt, extraArgs); + + return new Promise((resolve, reject) => { + const proc = spawn(cmd, args, { + cwd, + env: process.env, + stdio: ['ignore', 'pipe', 'pipe'], + }); + + let stdout = ''; + let stderr = ''; + let timeoutId: ReturnType<typeof setTimeout> | null = null; + + proc.stdout?.on('data', (chunk: Buffer) => { + stdout += chunk.toString(); + }); + + proc.stderr?.on('data', (chunk: Buffer) => { + stderr += chunk.toString(); + }); + + proc.on('close', (code) => { + if (timeoutId) clearTimeout(timeoutId); + resolve({ exitCode: code ?? 1, stdout, stderr }); + }); + + proc.on('error', (err) => { + if (timeoutId) clearTimeout(timeoutId); + reject(err); + }); + + if (timeoutMs > 0) { + timeoutId = setTimeout(() => { + proc.kill('SIGTERM'); + reject(new Error(`Command timed out after ${timeoutMs}ms`)); + }, timeoutMs); + } + }); +} + +/** + * Run an agent with retries, logging, and optional wake notifications. + */ +export async function runAgent(opts: AgentRunOptions): Promise<AgentRunResult> { + const config = getAgent(opts.agent); + if (!config) { + throw new Error(`Unknown agent: ${opts.agent}. Supported agents: ${listAgents().join(', ')}`); + } + + const attempts = opts.attempts ?? 3; + if (!Number.isFinite(attempts) || attempts < 1) { + throw new Error('--attempts must be >= 1'); + } + + const sleepMs = opts.sleepMs ?? 8000; + const backoff = opts.backoff ?? 1.5; + const timeoutMs = opts.timeoutMs ?? config.defaultTimeout ?? 600000; + const wakeOutputChars = opts.wakeOutputChars ?? 1500; + const repo = opts.repo ?? process.cwd(); + const logDir = opts.logDir ?? resolve(process.cwd(), '.devagent/logs/agent-runs'); + const extraArgs = opts.extraArgs ?? []; + + const promptText = await readPrompt(opts); + + await setupLogDir(logDir); + const runId = nowStamp(); + const logPath = resolve(logDir, `agent_${opts.agent}_${runId}.log`); + + await writeLogHeader(logPath, runId, opts, promptText); + + let delay = sleepMs; + let lastStdout = ''; + let lastStderr = ''; + let lastExitCode = 1; + + for (let attempt = 1; attempt <= attempts; attempt++) { + await writeLog(logPath, `\n=== Attempt ${attempt}/${attempts} ===\n`); + + try { + const result = await runAgentCommand(config, promptText, repo, extraArgs, timeoutMs); + lastStdout = result.stdout; + lastStderr = result.stderr; + lastExitCode = result.exitCode; + + const combined = [ + `exitCode: ${result.exitCode}`, + '--- stdout ---', + result.stdout, + '--- stderr ---', + result.stderr, + '--- end ---', + ].join('\n'); + + await writeLog(logPath, combined + '\n'); + + if (result.exitCode === 0) { + console.log(`${opts.agent} Agent succeeded on attempt ${attempt}. Log: ${logPath}`); + + let wakeResult = { sent: false, error: undefined as string | undefined }; + if (opts.wakeSummarize) { + const wakeMsg = buildWakeMessage({ + status: 'success', + attempt, + totalAttempts: attempts, + logPath, + output: result.stdout, + wakeOutputChars, + agent: opts.agent, + wakeSummarize: opts.wakeSummarize, + taskDescription: opts.taskDescription, + promptText, + }); + wakeResult = await maybeWake(wakeMsg); + if (!wakeResult.sent && opts.onWakeError) { + opts.onWakeError(new Error(wakeResult.error)); + } + } + + return { + success: true, + exitCode: 0, + attempt, + totalAttempts: attempts, + stdout: result.stdout, + stderr: result.stderr, + logPath, + runId, + wakeSent: wakeResult.sent, + wakeError: wakeResult.error, + }; + } + + const failureDetected = detectFailure(result.stdout + '\n' + result.stderr, config.failurePatterns); + const failMsg = failureDetected + ? `Attempt ${attempt} failed: Detected failure pattern.` + : `Attempt ${attempt} failed (exit ${result.exitCode}).`; + + console.error(failMsg); + + if (attempt < attempts) { + await writeLog(logPath, `\n${failMsg} Sleeping ${Math.round(delay)}ms before retry.\n`); + await sleep(delay); + delay = calculateNextDelay(delay, backoff); + } + } catch (error) { + const errorMsg = error instanceof Error ? error.message : String(error); + const failMsg = `Attempt ${attempt} failed with error: ${errorMsg}`; + console.error(failMsg); + await writeLog(logPath, `\n${failMsg}\n`); + + if (attempt < attempts) { + await writeLog(logPath, `Sleeping ${Math.round(delay)}ms before retry.\n`); + await sleep(delay); + delay = calculateNextDelay(delay, backoff); + } + } + } + + console.error(`${opts.agent} Agent FAILED after ${attempts} attempts. Log: ${logPath}`); + + let wakeResult = { sent: false, error: undefined as string | undefined }; + if (opts.wakeSummarize) { + const combinedOutput = ['--- last stdout ---', lastStdout.trim(), '--- last stderr ---', lastStderr.trim()].join( + '\n' + ); + const wakeMsg = buildWakeMessage({ + status: 'failed', + attempt: attempts, + totalAttempts: attempts, + logPath, + output: combinedOutput, + wakeOutputChars, + agent: opts.agent, + wakeSummarize: opts.wakeSummarize, + taskDescription: opts.taskDescription, + promptText, + }); + wakeResult = await maybeWake(wakeMsg); + if (!wakeResult.sent && opts.onWakeError) { + opts.onWakeError(new Error(wakeResult.error)); + } + } + + return { + success: false, + exitCode: lastExitCode, + attempt: attempts, + totalAttempts: attempts, + stdout: lastStdout, + stderr: lastStderr, + logPath, + runId, + wakeSent: wakeResult.sent, + wakeError: wakeResult.error, + }; +} diff --git a/.devagent/plugins/ralph/tools/agent-runner/types.ts b/.devagent/plugins/ralph/tools/agent-runner/types.ts new file mode 100644 index 0000000..907437d --- /dev/null +++ b/.devagent/plugins/ralph/tools/agent-runner/types.ts @@ -0,0 +1,43 @@ +/** + * types.ts + * + * Shared interfaces for the agent runner. + */ + +export interface AgentDefinition { + name: string; + command: string; + buildArgs(prompt: string, extraArgs: string[]): string[]; + failurePatterns?: RegExp[]; + defaultTimeout?: number; +} + +export interface AgentRunOptions { + agent: string; + repo?: string; + prompt?: string; + promptFile?: string; + attempts?: number; + sleepMs?: number; + backoff?: number; + timeoutMs?: number; + logDir?: string; + wakeSummarize?: boolean; + taskDescription?: string; + wakeOutputChars?: number; + extraArgs?: string[]; + onWakeError?: (error: Error) => void; +} + +export interface AgentRunResult { + success: boolean; + exitCode: number; + attempt: number; + totalAttempts: number; + stdout: string; + stderr: string; + logPath: string; + runId: string; + wakeSent?: boolean; + wakeError?: string; +} diff --git a/.devagent/plugins/ralph/tools/agent-runner/utils.ts b/.devagent/plugins/ralph/tools/agent-runner/utils.ts new file mode 100644 index 0000000..cc1c911 --- /dev/null +++ b/.devagent/plugins/ralph/tools/agent-runner/utils.ts @@ -0,0 +1,203 @@ +/** + * utils.ts + * + * Consolidated utilities for the agent runner. + * Combines logging, retry, wake, and CLI parsing into one file. + */ +import { mkdir, writeFile, appendFile } from 'node:fs/promises'; +import { resolve } from 'node:path'; +import type { AgentRunOptions } from './types'; +import { listAgents } from './agents'; + +// ============================================================================ +// Time & Logging +// ============================================================================ + +export function nowStamp(): string { + return new Date().toISOString().replace(/[:.]/g, '-'); +} + +export async function setupLogDir(logDir: string): Promise<void> { + await mkdir(logDir, { recursive: true }); +} + +export async function writeLogHeader( + logPath: string, + runId: string, + opts: AgentRunOptions, + promptText: string +): Promise<void> { + const header = [ + `Run: ${runId}`, + `Agent: ${opts.agent}`, + `Repo: ${opts.repo ?? process.cwd()}`, + `Attempts: ${opts.attempts ?? 3}`, + `Timeout: ${opts.timeoutMs ?? 600000}ms`, + `Extra args: ${opts.extraArgs?.join(' ') ?? ''}`, + '--- prompt ---', + promptText, + '--- end prompt ---', + '', + ].join('\n'); + await writeFile(logPath, header); +} + +export async function writeLog(logPath: string, message: string): Promise<void> { + await appendFile(logPath, message); +} + +// ============================================================================ +// Retry & Backoff +// ============================================================================ + +export function sleep(ms: number): Promise<void> { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +export function calculateNextDelay( + currentDelay: number, + backoff: number, + jitter: boolean = true, + maxDelay?: number +): number { + let next = currentDelay * backoff; + if (jitter) { + next = next * (0.75 + Math.random() * 0.5); // Β±25% jitter + } + if (maxDelay && next > maxDelay) { + next = maxDelay; + } + return Math.round(next); +} + +// ============================================================================ +// Wake Notifications +// ============================================================================ + +export interface WakeResult { + sent: boolean; + error?: string; +} + +export async function maybeWake(text: string): Promise<WakeResult> { + try { + const proc = Bun.spawn(['clawdbot', 'gateway', 'wake', '--text', text, '--mode', 'now'], { + stdout: 'pipe', + stderr: 'pipe', + }); + const exitCode = await proc.exited; + if (exitCode === 0) { + return { sent: true }; + } + const stderr = await new Response(proc.stderr).text(); + return { sent: false, error: stderr || `clawdbot exited with code ${exitCode}` }; + } catch (e) { + const error = e instanceof Error ? e.message : String(e); + return { sent: false, error }; + } +} + +export function truncateTail(s: string, n: number): string { + if (n <= 0) return ''; + if (s.length <= n) return s; + return '…(truncated)…\n' + s.slice(s.length - n); +} + +export function buildWakeMessage(opts: { + status: 'success' | 'failed'; + attempt: number; + totalAttempts: number; + logPath: string; + output: string; + wakeOutputChars: number; + agent: string; + wakeSummarize?: boolean; + taskDescription?: string; + promptText: string; +}): string { + const { + status, + attempt, + totalAttempts, + logPath, + output, + wakeOutputChars, + agent, + wakeSummarize, + taskDescription, + promptText, + } = opts; + + if (wakeSummarize) { + const taskBlock = taskDescription + ? `Task: ${taskDescription}` + : `Task (from prompt):\n${promptText.slice(0, 500)}${promptText.length > 500 ? '…' : ''}`; + + const outputTail = truncateTail(output.trim(), wakeOutputChars); + + return `${agent} Agent delegation completed. + +**Status:** ${status} (attempt ${attempt}/${totalAttempts}) +**Agent:** ${agent} +**Log:** ${logPath} + +${taskBlock} + +**Output${outputTail.includes('(truncated)') ? ' (tail)' : ''}:** +${outputTail || '(no output)'} + +--- +Please summarize what was accomplished (or what failed) and highlight any key findings, deliverables, or recommended next steps.`; + } + + const base = `${agent} Agent ${ + status === 'success' ? 'succeeded' : 'FAILED' + } on attempt ${attempt}/${totalAttempts}. Log: ${logPath}`; + const outputTail = truncateTail(output.trim(), wakeOutputChars); + return outputTail ? `${base}\n\n--- output (tail) ---\n${outputTail}` : base; +} + +// ============================================================================ +// CLI Parsing +// ============================================================================ + +export function parseCLIArgs(argv: string[]): AgentRunOptions { + const ddIndex = argv.indexOf('--'); + const runnerArgs = ddIndex === -1 ? argv : argv.slice(0, ddIndex); + const extraArgs = ddIndex === -1 ? [] : argv.slice(ddIndex + 1); + + const getArg = (flag: string): string | undefined => { + const i = runnerArgs.indexOf(flag); + if (i === -1 || i + 1 >= runnerArgs.length) return undefined; + return runnerArgs[i + 1]; + }; + + const hasFlag = (flag: string): boolean => runnerArgs.includes(flag); + + const agent = getArg('--agent'); + if (!agent) { + throw new Error('--agent is required. Supported agents: ' + listAgents().join(', ')); + } + + const prompt = getArg('--prompt'); + const promptFile = getArg('--prompt-file'); + if (!prompt && !promptFile) { + throw new Error('Provide --prompt or --prompt-file'); + } + + return { + agent, + repo: getArg('--repo'), + prompt, + promptFile, + attempts: getArg('--attempts') ? Number(getArg('--attempts')) : undefined, + sleepMs: getArg('--sleep-ms') ? Number(getArg('--sleep-ms')) : undefined, + backoff: getArg('--backoff') ? Number(getArg('--backoff')) : undefined, + timeoutMs: getArg('--timeout-ms') ? Number(getArg('--timeout-ms')) : undefined, + logDir: getArg('--log-dir'), + wakeSummarize: hasFlag('--wake-summarize'), + taskDescription: getArg('--task-description'), + wakeOutputChars: getArg('--wake-output-chars') ? Number(getArg('--wake-output-chars')) : undefined, + extraArgs, + }; +} diff --git a/.devagent/plugins/ralph/tools/beads.types.ts b/.devagent/plugins/ralph/tools/beads.types.ts new file mode 100644 index 0000000..4d269e0 --- /dev/null +++ b/.devagent/plugins/ralph/tools/beads.types.ts @@ -0,0 +1,24 @@ +/** + * Represents a task in the Beads issue tracking system + */ +export interface BeadsTask { + id: string; + title: string; + description: string | null; + design: string | null; + acceptance_criteria: string | null; + notes: string | null; + status: 'open' | 'in_progress' | 'closed' | 'blocked'; + priority: string | null; + parent_id: string | null; // Computed from hierarchical ID structure + created_at: string; + updated_at: string; +} + +/** + * Represents a comment on a Beads task + */ +export interface BeadsComment { + body: string; + created_at: string; +} diff --git a/.devagent/plugins/ralph/tools/check-task-status.test.ts b/.devagent/plugins/ralph/tools/check-task-status.test.ts new file mode 100644 index 0000000..07764c9 --- /dev/null +++ b/.devagent/plugins/ralph/tools/check-task-status.test.ts @@ -0,0 +1,62 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +describe('check-task-status', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('Status and Label checking logic', () => { + it('should detect when status matches', () => { + const task = { status: 'completed', labels: ['engineering'] }; + const signal = 'completed'; + const found = task.status === signal || (task.labels && task.labels.includes(signal)); + expect(found).toBe(true); + }); + + it('should detect when label matches', () => { + const task = { status: 'in_progress', labels: ['review-needed', 'engineering'] }; + const signal = 'review-needed'; + const found = task.status === signal || (task.labels && task.labels.includes(signal)); + expect(found).toBe(true); + }); + + it('should return false when neither status nor label matches', () => { + const task = { status: 'in_progress', labels: ['engineering'] }; + const signal = 'completed'; + const found = task.status === signal || (task.labels && task.labels.includes(signal)); + expect(found).toBe(false); + }); + + it('should handle missing labels', () => { + const task: { status: string; labels?: string[] } = { status: 'in_progress' }; + const signal = 'review-needed'; + const found = task.status === signal || !!(task.labels && task.labels.includes(signal)); + expect(found).toBe(false); + }); + }); + + describe('JSON parsing', () => { + it('should parse Beads JSON output correctly', () => { + const stdout = JSON.stringify([{ status: 'completed', labels: ['ready'] }]); + const task = JSON.parse(stdout)[0]; + expect(task.status).toBe('completed'); + expect(task.labels).toContain('ready'); + }); + }); + + describe('CLI argument validation', () => { + it('should require both id and signal', () => { + const args: string[] = []; + const [id, signal] = args; + expect(!id || !signal).toBe(true); + }); + + it('should accept valid arguments', () => { + const args = ['devagent-034b9i.5', 'review-needed']; + const [id, signal] = args; + expect(!id || !signal).toBe(false); + expect(id).toBe('devagent-034b9i.5'); + expect(signal).toBe('review-needed'); + }); + }); +}); diff --git a/.devagent/plugins/ralph/tools/check-task-status.ts b/.devagent/plugins/ralph/tools/check-task-status.ts new file mode 100755 index 0000000..a3b8721 --- /dev/null +++ b/.devagent/plugins/ralph/tools/check-task-status.ts @@ -0,0 +1,39 @@ +#!/usr/bin/env bun +/** + * Check Task Status + * + * Checks if a specific Beads task has a certain status or label. + * Returns exit code 0 if found, 1 if missing. + * + * Usage: + * bun check-task-status.ts <task-id> <status|label> + */ + +import { spawnSync } from 'node:child_process'; + +const [id, signal] = process.argv.slice(2); + +if (!id || !signal) { + console.error('Usage: bun check-task-status.ts <id> <signal>'); + process.exit(2); +} + +try { + const result = spawnSync('bd', ['show', id, '--json'], { encoding: 'utf-8' }); + if (result.status !== 0) { + console.error(`Error: Task ${id} not found.`); + process.exit(1); + } + + if (!result.stdout) { + process.exit(1); + } + + const task = JSON.parse(result.stdout) as { status?: string; labels?: string[] } | null; + const found = !!task && (task.status === signal || !!(task.labels && task.labels.includes(signal))); + + process.exit(found ? 0 : 1); +} catch (e) { + console.error(`Error: ${e}`); + process.exit(2); +} diff --git a/.devagent/plugins/ralph/tools/config.json b/.devagent/plugins/ralph/tools/config.json new file mode 100644 index 0000000..18782bd --- /dev/null +++ b/.devagent/plugins/ralph/tools/config.json @@ -0,0 +1,42 @@ +{ + "beads": { + "database_path": ".beads/beads.db", + "project": "react-router-starter" + }, + "ai_tool": { + "name": "cursor", + "command": "agent", + "args": ["-p", "--output-format", "text", "--approve-mcps"], + "env": {} + }, + "quality_gates": { + "template": "", + "overrides": {} + }, + "git": { + "base_branch": "main", + "working_branch": "feat/starter-improvements" + }, + "roles": { + "engineering": "Code Wizard", + "qa": "Bug Hunter", + "design": "Pixel Perfector", + "project-manager": "Chaos Coordinator" + }, + "role_briefs": { + "engineering": "Implement the task end-to-end, including tests and verification commands.", + "qa": "Reproduce issues, add/adjust tests, and validate behavior changes.", + "design": "Improve UX/UI, polish copy, and ensure accessibility where relevant.", + "project-manager": "Clarify scope, break down work into Beads tasks, and coordinate sequencing." + }, + "execution": { + "require_confirmation": false, + "max_iterations": 15 + }, + "agents": { + "engineering": "engineering-agent.json", + "qa": "qa-agent.json", + "design": "design-agent.json", + "project-manager": "project-manager-agent.json" + } +} diff --git a/.devagent/plugins/ralph/tools/git-manager.test.ts b/.devagent/plugins/ralph/tools/git-manager.test.ts new file mode 100644 index 0000000..e444377 --- /dev/null +++ b/.devagent/plugins/ralph/tools/git-manager.test.ts @@ -0,0 +1,99 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { execSync } from "child_process"; + +// Note: Full integration testing of git operations requires a real git repository. +// This test file focuses on testing the utility functions and error handling. +// For full integration testing, see the simulation script mentioned in the task. + +describe("git-manager", () => { + // Mock execSync for unit tests + const originalExecSync = execSync; + + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe("Type exports", () => { + it("should export GitManagerOptions interface", () => { + // Type check - if this compiles, the type is exported + const options: import("./git-manager").GitManagerOptions = { + cwd: "/tmp", + push: true, + pull: false, + }; + expect(options).toBeDefined(); + }); + + it("should export RebaseOptions interface", () => { + const options: import("./git-manager").RebaseOptions = { + strategy: "theirs", + abortOnComplex: true, + maxConflicts: 5, + }; + expect(options).toBeDefined(); + }); + + it("should export RebaseResult interface", () => { + const result: import("./git-manager").RebaseResult = { + success: true, + conflicts: [{ file: "test.ts", strategy: "theirs" }], + }; + expect(result).toBeDefined(); + }); + }); + + describe("Function exports", () => { + it("should export createHubBranch function", async () => { + const { createHubBranch } = await import("./git-manager"); + expect(typeof createHubBranch).toBe("function"); + }); + + it("should export checkoutFeatureBranch function", async () => { + const { checkoutFeatureBranch } = await import("./git-manager"); + expect(typeof checkoutFeatureBranch).toBe("function"); + }); + + it("should export rebaseBranch function", async () => { + const { rebaseBranch } = await import("./git-manager"); + expect(typeof rebaseBranch).toBe("function"); + }); + + it("should export forcePushWithLease function", async () => { + const { forcePushWithLease } = await import("./git-manager"); + expect(typeof forcePushWithLease).toBe("function"); + }); + + it("should export mergeBranch function", async () => { + const { mergeBranch } = await import("./git-manager"); + expect(typeof mergeBranch).toBe("function"); + }); + }); + + // Note: Full integration tests would require: + // 1. A temporary git repository + // 2. Creating test branches + // 3. Creating conflicting changes + // 4. Testing rebase with conflict resolution + // + // Example integration test structure: + // describe("Integration tests", () => { + // it("should create hub branch from main", async () => { + // // Setup temp repo + // // Create hub branch + // // Verify branch exists + // }); + // + // it("should checkout feature branch off hub", async () => { + // // Setup temp repo with hub + // // Create feature branch + // // Verify branch is based on hub + // }); + // + // it("should rebase feature branch onto hub with conflict resolution", async () => { + // // Setup temp repo with hub and feature branch + // // Create conflicting changes + // // Rebase with 'theirs' strategy + // // Verify conflicts resolved + // }); + // }); +}); diff --git a/.devagent/plugins/ralph/tools/git-manager.ts b/.devagent/plugins/ralph/tools/git-manager.ts new file mode 100644 index 0000000..938cbcd --- /dev/null +++ b/.devagent/plugins/ralph/tools/git-manager.ts @@ -0,0 +1,479 @@ +#!/usr/bin/env bun +/** + * Git Manager Tool + * + * Provides robust git capabilities for the BranchManager role, including: + * - Creating feature/hub branches + * - Checking out feature branches off hub + * - Performing git rebase with conflict handling (theirs/ours strategies) + * + * Usage: + * import { createHubBranch, checkoutFeatureBranch, rebaseBranch } from './git-manager'; + * + * await createHubBranch('feature/objective-hub', 'main'); + * await checkoutFeatureBranch('feature/objective-epic-a', 'feature/objective-hub'); + * await rebaseBranch('feature/objective-epic-a', 'origin/feature/objective-hub', { strategy: 'theirs' }); + */ + +import { execFileSync } from 'node:child_process'; + +// Types +export interface GitManagerOptions { + /** Working directory for git operations (default: process.cwd()) */ + cwd?: string; + /** Whether to push after creating branch (default: true) */ + push?: boolean; + /** Whether to pull before operations (default: true) */ + pull?: boolean; +} + +export interface RebaseOptions extends GitManagerOptions { + /** Conflict resolution strategy: 'theirs' (epic changes win) or 'ours' (hub changes win) */ + strategy?: 'theirs' | 'ours'; + /** Whether to abort on complex conflicts (default: true) */ + abortOnComplex?: boolean; + /** Maximum number of conflicts to resolve automatically (default: 10) */ + maxConflicts?: number; +} + +export interface ConflictInfo { + file: string; + strategy: 'theirs' | 'ours' | 'manual'; +} + +export interface RebaseResult { + success: boolean; + conflicts?: ConflictInfo[]; + aborted?: boolean; + error?: string; +} + +/** + * Execute a git command and return output + */ +function execGit(args: string[], options: GitManagerOptions = {}): string { + const cwd = options.cwd || process.cwd(); + const command = ['git', ...args] + .map(arg => (/\s/.test(arg) ? JSON.stringify(arg) : arg)) + .join(' '); + try { + return execFileSync('git', args, { + cwd, + encoding: 'utf-8', + stdio: ['pipe', 'pipe', 'pipe'] + }).trim(); + } catch (error: unknown) { + const err = error as { + stderr?: string | Buffer; + stdout?: string | Buffer; + message?: string; + }; + const stderr = err.stderr ? (typeof err.stderr === 'string' ? err.stderr : err.stderr.toString()) : ''; + const stdout = err.stdout ? (typeof err.stdout === 'string' ? err.stdout : err.stdout.toString()) : ''; + throw new Error( + `Git command failed: ${command}\n` + + `Error: ${err.message || 'Unknown error'}\n` + + `Stderr: ${stderr}\n` + + `Stdout: ${stdout}` + ); + } +} + +/** + * Check if a branch exists (locally or remotely) + */ +function branchExists(branchName: string, options: GitManagerOptions = {}): boolean { + try { + // Check local branches + const localBranches = execGit(['branch', '--format=%(refname:short)'], options); + if (localBranches.split('\n').includes(branchName)) { + return true; + } + + // Check remote branches + const remoteBranches = execGit(['branch', '-r', '--format=%(refname:short)'], options); + const remoteBranchName = `origin/${branchName}`; + if (remoteBranches.split('\n').includes(remoteBranchName)) { + return true; + } + + return false; + } catch { + return false; + } +} + +/** + * Get current branch name + */ +function _getCurrentBranch(options: GitManagerOptions = {}): string { + return execGit(['branch', '--show-current'], options); +} + +/** + * Check if working directory is clean + */ +function isWorkingDirectoryClean(options: GitManagerOptions = {}): boolean { + try { + const status = execGit(['status', '--porcelain'], options); + return status === ''; + } catch { + return false; + } +} + +/** + * Create a hub branch from a base branch + * + * @param hubBranchName - Name of the hub branch (e.g., 'feature/objective-hub') + * @param baseBranch - Base branch to create from (e.g., 'main') + * @param options - Git manager options + * @returns The created branch name + */ +export function createHubBranch( + hubBranchName: string, + baseBranch: string = 'main', + options: GitManagerOptions = {} +): string { + const shouldPush = options.push !== false; + const shouldPull = options.pull !== false; + + // Check if hub branch already exists + if (branchExists(hubBranchName, options)) { + throw new Error(`Hub branch '${hubBranchName}' already exists`); + } + + // Ensure working directory is clean + if (!isWorkingDirectoryClean(options)) { + throw new Error('Working directory is not clean. Please commit or stash changes before creating hub branch.'); + } + + // Checkout base branch and pull latest + if (shouldPull) { + execGit(['checkout', baseBranch], options); + execGit(['pull', 'origin', baseBranch], options); + } else { + execGit(['checkout', baseBranch], options); + } + + // Create hub branch + execGit(['checkout', '-b', hubBranchName], options); + + // Push hub branch if requested + if (shouldPush) { + execGit(['push', '-u', 'origin', hubBranchName], options); + } + + return hubBranchName; +} + +/** + * Checkout a feature branch off the hub (or create it if it doesn't exist) + * + * @param featureBranchName - Name of the feature branch (e.g., 'feature/objective-epic-a') + * @param baseBranch - Base branch to create from (e.g., 'feature/objective-hub') + * @param options - Git manager options + * @returns The branch name (created or checked out) + */ +export function checkoutFeatureBranch( + featureBranchName: string, + baseBranch: string, + options: GitManagerOptions = {} +): string { + const shouldPush = options.push !== false; + const shouldPull = options.pull !== false; + + // Ensure working directory is clean + if (!isWorkingDirectoryClean(options)) { + throw new Error( + 'Working directory is not clean. Please commit or stash changes before checking out feature branch.' + ); + } + + // Checkout base branch and pull latest + if (shouldPull) { + execGit(['checkout', baseBranch], options); + execGit(['pull', 'origin', baseBranch], options); + } else { + execGit(['checkout', baseBranch], options); + } + + // Check if feature branch exists + if (branchExists(featureBranchName, options)) { + // Checkout existing branch + execGit(['checkout', featureBranchName], options); + if (shouldPull) { + execGit(['pull', 'origin', featureBranchName], options); + } + } else { + // Create new branch + execGit(['checkout', '-b', featureBranchName], options); + + // Push new branch if requested + if (shouldPush) { + execGit(['push', '-u', 'origin', featureBranchName], options); + } + } + + return featureBranchName; +} + +/** + * Get list of conflicted files during a merge/rebase + */ +function getConflictedFiles(options: GitManagerOptions = {}): string[] { + try { + const status = execGit(['status', '--porcelain'], options); + const conflictedFiles: string[] = []; + + for (const line of status.split('\n')) { + if (line.match(/^AA|^UU|^DD|^AU|^UA|^DU|^UD/)) { + const file = line.substring(3).trim(); + conflictedFiles.push(file); + } + } + + return conflictedFiles; + } catch { + return []; + } +} + +/** + * Resolve conflicts using a strategy (theirs or ours) + */ +function resolveConflicts(files: string[], strategy: 'theirs' | 'ours', options: GitManagerOptions = {}): void { + for (const file of files) { + if (strategy === 'theirs') { + execGit(['checkout', '--theirs', file], options); + } else { + execGit(['checkout', '--ours', file], options); + } + execGit(['add', file], options); + } +} + +/** + * Perform git rebase with conflict handling + * + * @param branchName - Branch to rebase (e.g., 'feature/objective-epic-a') + * @param baseBranch - Base branch to rebase onto (e.g., 'origin/feature/objective-hub') + * @param options - Rebase options including conflict resolution strategy + * @returns Rebase result with success status and conflict information + */ +export function rebaseBranch(branchName: string, baseBranch: string, options: RebaseOptions = {}): RebaseResult { + const strategy = options.strategy || 'theirs'; + const abortOnComplex = options.abortOnComplex !== false; + const maxConflicts = options.maxConflicts || 10; + const shouldPull = options.pull !== false; + + // Ensure working directory is clean + if (!isWorkingDirectoryClean(options)) { + return { + success: false, + error: 'Working directory is not clean. Please commit or stash changes before rebasing.' + }; + } + + // Checkout branch and pull latest + try { + execGit(['checkout', branchName], options); + if (shouldPull) { + execGit(['pull', 'origin', branchName], options); + } + } catch (error: unknown) { + return { + success: false, + error: `Failed to checkout branch: ${error instanceof Error ? error.message : String(error)}` + }; + } + + // Start rebase + try { + execGit(['rebase', baseBranch], options); + + // If rebase completes without conflicts, we're done + return { success: true }; + } catch (error: unknown) { + // Rebase likely hit conflicts - check for conflicted files + const conflictedFiles = getConflictedFiles(options); + + if (conflictedFiles.length === 0) { + // No conflicts but rebase failed - might be a different error + return { + success: false, + error: `Rebase failed: ${error instanceof Error ? error.message : String(error)}` + }; + } + + // Too many conflicts - abort if configured + if (conflictedFiles.length > maxConflicts && abortOnComplex) { + try { + execGit(['rebase', '--abort'], options); + } catch { + // Ignore abort errors + } + return { + success: false, + aborted: true, + error: `Too many conflicts (${conflictedFiles.length} > ${maxConflicts}). Aborted.`, + conflicts: conflictedFiles.map(file => ({ file, strategy: 'manual' as const })) + }; + } + + // Resolve conflicts using strategy + const conflicts: ConflictInfo[] = []; + try { + resolveConflicts(conflictedFiles, strategy, options); + conflicts.push(...conflictedFiles.map(file => ({ file, strategy }))); + } catch (resolveError: unknown) { + // Failed to resolve - abort + try { + execGit(['rebase', '--abort'], options); + } catch { + // Ignore abort errors + } + return { + success: false, + aborted: true, + error: `Failed to resolve conflicts: ${resolveError instanceof Error ? resolveError.message : String(resolveError)}`, + conflicts: conflictedFiles.map(file => ({ file, strategy: 'manual' as const })) + }; + } + + // Continue rebase after resolving conflicts + try { + execGit(['rebase', '--continue'], options); + + // Rebase might have more conflicts - check again + const remainingConflicts = getConflictedFiles(options); + if (remainingConflicts.length > 0) { + // More conflicts - abort if configured + if (remainingConflicts.length > maxConflicts && abortOnComplex) { + try { + execGit(['rebase', '--abort'], options); + } catch { + // Ignore abort errors + } + return { + success: false, + aborted: true, + error: `Additional conflicts detected (${remainingConflicts.length}). Aborted.`, + conflicts: [...conflicts, ...remainingConflicts.map(file => ({ file, strategy: 'manual' as const }))] + }; + } + + // Resolve additional conflicts + resolveConflicts(remainingConflicts, strategy, options); + conflicts.push(...remainingConflicts.map(file => ({ file, strategy }))); + + // Continue again + execGit(['rebase', '--continue'], options); + } + + return { success: true, conflicts }; + } catch (continueError: unknown) { + // Rebase continue failed - might have more conflicts or other issues + const remainingConflicts = getConflictedFiles(options); + + if (remainingConflicts.length > 0) { + // More conflicts detected + if (remainingConflicts.length > maxConflicts && abortOnComplex) { + try { + execGit(['rebase', '--abort'], options); + } catch { + // Ignore abort errors + } + return { + success: false, + aborted: true, + error: `Additional conflicts detected (${remainingConflicts.length}). Aborted.`, + conflicts: [...conflicts, ...remainingConflicts.map(file => ({ file, strategy: 'manual' as const }))] + }; + } + + // Try to resolve and continue recursively (but limit depth) + return rebaseBranch(branchName, baseBranch, { + ...options, + // Prevent infinite recursion by reducing max conflicts + maxConflicts: Math.max(1, maxConflicts - remainingConflicts.length) + }); + } + + // No more conflicts but continue failed - might be a different error + return { + success: false, + error: `Rebase continue failed: ${continueError instanceof Error ? continueError.message : String(continueError)}`, + conflicts + }; + } + } +} + +/** + * Force push a branch with lease (safer than --force) + * + * @param branchName - Branch to push + * @param options - Git manager options + */ +export function forcePushWithLease(branchName: string, options: GitManagerOptions = {}): void { + execGit(['push', '--force-with-lease', 'origin', branchName], options); +} + +/** + * Merge a branch into another branch + * + * @param sourceBranch - Branch to merge from + * @param targetBranch - Branch to merge into + * @param options - Git manager options + * @returns Merge result + */ +export function mergeBranch( + sourceBranch: string, + targetBranch: string, + options: GitManagerOptions & { noff?: boolean; message?: string } = {} +): { success: boolean; error?: string } { + const shouldPull = options.pull !== false; + const noff = options.noff !== false; // Default to --no-ff + const message = options.message || `Merge ${sourceBranch} into ${targetBranch}`; + + // Ensure working directory is clean + if (!isWorkingDirectoryClean(options)) { + return { + success: false, + error: 'Working directory is not clean. Please commit or stash changes before merging.' + }; + } + + try { + // Checkout target branch and pull latest + execGit(['checkout', targetBranch], options); + if (shouldPull) { + execGit(['pull', 'origin', targetBranch], options); + } + + // Merge source branch + const mergeArgs = noff + ? ['merge', sourceBranch, '--no-ff', '-m', message] + : ['merge', sourceBranch, '-m', message]; + + execGit(mergeArgs, options); + + return { success: true }; + } catch (error: unknown) { + // Check for conflicts + const conflictedFiles = getConflictedFiles(options); + + if (conflictedFiles.length > 0) { + return { + success: false, + error: `Merge conflicts detected in ${conflictedFiles.length} file(s): ${conflictedFiles.join(', ')}` + }; + } + + return { + success: false, + error: `Merge failed: ${error instanceof Error ? error.message : String(error)}` + }; + } +} diff --git a/.devagent/plugins/ralph/tools/hierarchical-id.ts b/.devagent/plugins/ralph/tools/hierarchical-id.ts new file mode 100644 index 0000000..ed2c901 --- /dev/null +++ b/.devagent/plugins/ralph/tools/hierarchical-id.ts @@ -0,0 +1,64 @@ +/** + * Represents a parsed hierarchical ID with base and segments + */ +export interface ParsedHierarchicalId { + base: string; + segments: Array<number | string>; +} + +/** + * Parse a segment string into a number or string + * @param segment - Segment string to parse + * @returns Number if segment is numeric, otherwise the string + */ +function parseSegment(segment: string): number | string { + if (!segment) return ''; + if (/^\d+$/.test(segment)) return Number(segment); + return segment; +} + +/** + * Parse a hierarchical ID into base and segments + * @param id - Hierarchical ID string (e.g., "epic.1.2") + * @returns Parsed hierarchical ID with base and segments + */ +export function parseHierarchicalId(id: string): ParsedHierarchicalId { + const [base, ...rest] = id.split('.'); + return { + base: base ?? id, + segments: rest.map(parseSegment), + }; +} + +/** + * Compare two hierarchical IDs for sorting + * @param leftId - First hierarchical ID + * @param rightId - Second hierarchical ID + * @returns Negative if left < right, positive if left > right, 0 if equal + */ +export function compareHierarchicalIds(leftId: string, rightId: string): number { + if (leftId === rightId) return 0; + + const left = parseHierarchicalId(leftId); + const right = parseHierarchicalId(rightId); + + if (left.base !== right.base) return left.base.localeCompare(right.base); + + const max = Math.max(left.segments.length, right.segments.length); + for (let i = 0; i < max; i += 1) { + const a = left.segments[i]; + const b = right.segments[i]; + + if (a === undefined && b === undefined) break; + if (a === undefined) return -1; + if (b === undefined) return 1; + if (a === b) continue; + + if (typeof a === 'number' && typeof b === 'number') return a - b; + + return String(a).localeCompare(String(b)); + } + + // Deterministic final fallback + return leftId.localeCompare(rightId); +} diff --git a/.devagent/plugins/ralph/tools/import-beads.cjs b/.devagent/plugins/ralph/tools/import-beads.cjs new file mode 100755 index 0000000..2a5fab9 --- /dev/null +++ b/.devagent/plugins/ralph/tools/import-beads.cjs @@ -0,0 +1,380 @@ +#!/usr/bin/env node +/** + * Beads Task Import Script + * + * Imports tasks from a Beads payload JSON file into the Beads database. + * Handles prefix detection, hierarchical IDs, and proper error handling. + * + * Usage: + * node import-beads.js <beads-payload.json> + * + * Or make executable and run: + * ./import-beads.js <beads-payload.json> + */ + +const fs = require('fs'); +const { execSync, execFileSync } = require('child_process'); +const path = require('path'); + +// Colors for output +const colors = { + reset: '\x1b[0m', + green: '\x1b[32m', + yellow: '\x1b[33m', + red: '\x1b[31m', + blue: '\x1b[34m', +}; + +function log(message, color = 'reset') { + console.log(`${colors[color]}${message}${colors.reset}`); +} + +function error(message) { + log(`βœ— ${message}`, 'red'); +} + +function success(message) { + log(`βœ“ ${message}`, 'green'); +} + +function info(message) { + log(`β„Ή ${message}`, 'blue'); +} + +function warn(message) { + log(`⚠ ${message}`, 'yellow'); +} + +/** + * Detect the Beads database prefix from database configuration or existing tasks + */ +function detectDatabasePrefix() { + // First, try to get prefix from database configuration (most reliable) + try { + const result = execSync('bd config get issue_prefix', { encoding: 'utf8', stdio: 'pipe' }); + const prefix = result.trim(); + if (prefix && prefix !== '' && !prefix.includes('Error') && !prefix.includes('not found')) { + return prefix; + } + } catch (e) { + // Config might not be set or command failed - continue to try other methods + } + + // Fallback: try to get prefix from existing tasks + try { + const result = execSync('bd list --json', { encoding: 'utf8', stdio: 'pipe' }); + const tasks = JSON.parse(result); + if (tasks.length > 0 && tasks[0].id) { + // Extract prefix (everything before the last segment) + const parts = tasks[0].id.split('-'); + if (parts.length >= 2) { + // Take first two parts (e.g., "video-query-mcp" from "video-query-mcp-abc123") + return parts.slice(0, 2).join('-'); + } + // Fallback: take everything before the last dash + const lastDash = tasks[0].id.lastIndexOf('-'); + if (lastDash > 0) { + return tasks[0].id.substring(0, lastDash); + } + } + } catch (e) { + // Database might be empty or not exist - continue to final fallback + } + + // Final fallback: use directory name (matches bd init default behavior) + try { + const cwd = process.cwd(); + const dirName = path.basename(cwd); + if (dirName && dirName !== '.' && dirName !== '..') { + return dirName; + } + } catch (e) { + // Ignore errors + } + + // Last resort: default to "bd" + return 'bd'; +} + +/** + * Check if Beads CLI is available + */ +function checkBeadsCLI() { + try { + execSync('which bd', { stdio: 'pipe' }); + return true; + } catch (e) { + return false; + } +} + +/** + * Check if Beads database is initialized + */ +function checkBeadsDatabase() { + try { + execSync('bd list --json', { stdio: 'pipe' }); + return true; + } catch (e) { + return false; + } +} + +/** + * Create a temporary file with content + */ +function createTempFile(content, suffix = 'txt') { + const tempPath = `/tmp/beads-import-${Date.now()}-${Math.random().toString(36).substring(7)}.${suffix}`; + fs.writeFileSync(tempPath, content); + return tempPath; +} + +/** + * Clean up temporary files + */ +function cleanupTempFiles(files) { + files.forEach(file => { + try { + if (fs.existsSync(file)) { + fs.unlinkSync(file); + } + } catch (e) { + // Ignore cleanup errors + } + }); +} + +/** + * Import a single task into Beads + */ +function importTask(task, tempFiles) { + try { + // Combine description and notes + let description = task.description || ''; + if (task.notes) { + description += (description ? '\n\n' : '') + task.notes; + } + + // Create temp file for description + const descFile = createTempFile(description); + tempFiles.push(descFile); + + // Map status (Beads uses "open" for tasks ready for work) + // Note: bd create does NOT support --status flag, we'll set it after creation + let status = task.status || 'open'; + if (status === 'ready' || status === 'todo') { + status = 'open'; + } + + // Build create command (without --status, as bd create doesn't support it) + const args = [ + 'create', + '--type', + 'task', + '--title', + task.title, + '--id', + task.id, + '--body-file', + descFile, + '--force' + ]; + + // Add acceptance criteria + const acceptance = Array.isArray(task.acceptance_criteria) + ? task.acceptance_criteria.join('; ') + : task.acceptance_criteria; + if (acceptance) { + args.push('--acceptance', acceptance); + } + + // Note: Do NOT use --parent with hierarchical IDs - Beads infers it automatically + + // Add dependencies + if (task.depends_on && task.depends_on.length > 0) { + args.push('--deps', task.depends_on.join(',')); + } + + args.push('--json'); + + // Execute create command + const result = execFileSync('bd', args, { encoding: 'utf8', stdio: 'pipe' }); + const created = JSON.parse(result); + + // Set status after creation (bd create doesn't support --status flag) + if (status !== 'open') { + try { + execFileSync('bd', ['update', created.id, '--status', status], { encoding: 'utf8', stdio: 'pipe' }); + } catch (e) { + warn(`Failed to set status for ${created.id}: ${e.message.split('\n')[0]}`); + } + } + + success(`Created task: ${created.id} - ${created.title}`); + return true; + } catch (e) { + if (e.message.includes('already exists') || e.message.includes('UNIQUE constraint')) { + warn(`Task ${task.id} already exists, skipping`); + return true; // Not an error + } else { + error(`Failed to create task ${task.id}: ${e.message.split('\n')[0]}`); + return false; + } + } +} + +/** + * Import an epic into Beads + */ +function importEpic(epic, tempFiles) { + try { + const descFile = createTempFile(epic.description); + tempFiles.push(descFile); + + // Map status (Beads uses "open" for epics ready for work) + // Note: bd create does NOT support --status flag, we'll set it after creation + let status = epic.status || 'open'; + if (status === 'ready' || status === 'todo') { + status = 'open'; + } + + // Build create command (without --status, as bd create doesn't support it) + const args = [ + 'create', + '--type', + 'epic', + '--title', + epic.title, + '--body-file', + descFile, + '--id', + epic.id, + '--force', + '--json' + ]; + + // Execute create command + const result = execFileSync('bd', args, { encoding: 'utf8', stdio: 'pipe' }); + const created = JSON.parse(result); + + // Set status after creation (bd create doesn't support --status flag) + if (status !== 'open') { + try { + execFileSync('bd', ['update', created.id, '--status', status], { encoding: 'utf8', stdio: 'pipe' }); + } catch (e) { + warn(`Failed to set status for ${created.id}: ${e.message.split('\n')[0]}`); + } + } + + success(`Created epic: ${created.id} - ${created.title}`); + return true; + } catch (e) { + if (e.message.includes('already exists') || e.message.includes('UNIQUE constraint')) { + warn(`Epic ${epic.id} already exists, skipping`); + return true; // Not an error + } else { + error(`Failed to create epic ${epic.id}: ${e.message.split('\n')[0]}`); + return false; + } + } +} + +/** + * Main import function + */ +function main() { + const payloadPath = process.argv[2]; + + if (!payloadPath) { + error('Usage: node import-beads.js <beads-payload.json>'); + process.exit(1); + } + + if (!fs.existsSync(payloadPath)) { + error(`Payload file not found: ${payloadPath}`); + process.exit(1); + } + + // Check prerequisites + if (!checkBeadsCLI()) { + error('Beads CLI (bd) not found in PATH. Please install Beads first.'); + process.exit(1); + } + + if (!checkBeadsDatabase()) { + error('Beads database not initialized. Run "bd init" first.'); + process.exit(1); + } + + // Detect prefix + const dbPrefix = detectDatabasePrefix(); + info(`Detected database prefix: ${dbPrefix}`); + + // Load payload + let payload; + try { + payload = JSON.parse(fs.readFileSync(payloadPath, 'utf8')); + } catch (e) { + error(`Failed to parse payload: ${e.message}`); + process.exit(1); + } + + // Validate payload structure + if (!payload.epics || payload.epics.length === 0) { + error('Payload missing epics'); + process.exit(1); + } + + if (!payload.tasks || payload.tasks.length === 0) { + error('Payload missing tasks'); + process.exit(1); + } + + // Check prefix compatibility + const epic = payload.epics[0]; + const epicPrefix = epic.id.split('-').slice(0, 2).join('-'); + if (epicPrefix !== dbPrefix) { + warn(`Epic prefix (${epicPrefix}) doesn't match database prefix (${dbPrefix})`); + warn('This may cause import issues. Consider regenerating payload with correct prefix.'); + } + + // Import epic and tasks + const tempFiles = []; + let successCount = 0; + let errorCount = 0; + + try { + log('\nImporting epic...'); + if (importEpic(epic, tempFiles)) { + successCount++; + } else { + errorCount++; + } + + log(`\nImporting ${payload.tasks.length} tasks...`); + for (const task of payload.tasks) { + if (importTask(task, tempFiles)) { + successCount++; + } else { + errorCount++; + } + } + + log('\n' + '='.repeat(50)); + if (errorCount === 0) { + success(`Import complete! ${successCount} items imported successfully.`); + } else { + warn(`Import complete with ${errorCount} error(s). ${successCount} items imported.`); + } + } finally { + // Cleanup temp files + cleanupTempFiles(tempFiles); + } +} + +// Run if executed directly +if (require.main === module) { + main(); +} + +module.exports = { importEpic, importTask, detectDatabasePrefix }; diff --git a/.devagent/plugins/ralph/tools/lib/beads.types.ts b/.devagent/plugins/ralph/tools/lib/beads.types.ts new file mode 100644 index 0000000..4f7275f --- /dev/null +++ b/.devagent/plugins/ralph/tools/lib/beads.types.ts @@ -0,0 +1 @@ +export type { BeadsTask, BeadsComment } from '../beads.types'; diff --git a/.devagent/plugins/ralph/tools/lib/hierarchical-id.ts b/.devagent/plugins/ralph/tools/lib/hierarchical-id.ts new file mode 100644 index 0000000..05339ca --- /dev/null +++ b/.devagent/plugins/ralph/tools/lib/hierarchical-id.ts @@ -0,0 +1,45 @@ +export interface ParsedHierarchicalId { + base: string; + segments: Array<number | string>; +} + +function parseSegment(segment: string): number | string { + if (!segment) return ''; + if (/^\d+$/.test(segment)) return Number(segment); + return segment; +} + +export function parseHierarchicalId(id: string): ParsedHierarchicalId { + const [base, ...rest] = id.split('.'); + return { + base: base ?? id, + segments: rest.map(parseSegment), + }; +} + +export function compareHierarchicalIds(leftId: string, rightId: string): number { + if (leftId === rightId) return 0; + + const left = parseHierarchicalId(leftId); + const right = parseHierarchicalId(rightId); + + if (left.base !== right.base) return left.base.localeCompare(right.base); + + const max = Math.max(left.segments.length, right.segments.length); + for (let i = 0; i < max; i += 1) { + const a = left.segments[i]; + const b = right.segments[i]; + + if (a === undefined && b === undefined) break; + if (a === undefined) return -1; + if (b === undefined) return 1; + if (a === b) continue; + + if (typeof a === 'number' && typeof b === 'number') return a - b; + + return String(a).localeCompare(String(b)); + } + + // Deterministic final fallback + return leftId.localeCompare(rightId); +} diff --git a/.devagent/plugins/ralph/tools/lib/logs.server.ts b/.devagent/plugins/ralph/tools/lib/logs.server.ts new file mode 100644 index 0000000..98dcc9b --- /dev/null +++ b/.devagent/plugins/ralph/tools/lib/logs.server.ts @@ -0,0 +1,403 @@ +import { readFileSync, existsSync, statSync, accessSync, constants, openSync, readSync, closeSync, mkdirSync, writeSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; + +// File size limits (in bytes) +const MAX_FILE_SIZE_FOR_FULL_READ = 10 * 1024 * 1024; // 10MB +const MAX_FILE_SIZE_FOR_PARTIAL_READ = 100 * 1024 * 1024; // 100MB +const WARN_FILE_SIZE = 50 * 1024 * 1024; // 50MB - warn user about large files + +/** + * Log file error codes used by server utilities. + */ +export interface LogFileError extends Error { + code: 'NOT_FOUND' | 'PERMISSION_DENIED' | 'TOO_LARGE' | 'READ_ERROR' | 'INVALID_TASK_ID'; + taskId?: string; +} + +export const isLogFileError = (error: unknown): error is LogFileError => { + if (!error || typeof error !== 'object') return false; + return 'code' in error && typeof (error as { code?: unknown }).code === 'string'; +}; + +const makeLogFileError = (message: string, code: LogFileError['code'], taskId?: string): LogFileError => { + const error = new Error(message) as LogFileError; + error.name = 'LogFileError'; + error.code = code; + error.taskId = taskId; + return error; +}; + +const LOG_DIR_ENV_VAR = 'RALPH_LOG_DIR' as const; +const REPO_ROOT_ENV_VAR = 'REPO_ROOT' as const; + +export const LOG_PATH_ENV_VARS = [LOG_DIR_ENV_VAR, REPO_ROOT_ENV_VAR] as const; +export type LogPathEnvVarName = typeof LOG_PATH_ENV_VARS[number]; + +const DEFAULT_RELATIVE_LOG_DIR = join('logs', 'ralph'); + +export interface MissingLogDiagnostics { + expectedLogDirectoryTemplate: string; + expectedLogPathTemplate: string; + defaultRelativeLogDir: string; + expectedLogFileName: string; + envVarsConsulted: LogPathEnvVarName[]; + envVarIsSet: Record<LogPathEnvVarName, boolean>; + resolvedStrategy: 'RALPH_LOG_DIR' | 'REPO_ROOT' | 'cwd'; +} + +/** + * Return non-sensitive diagnostics for missing-log cases. + * Avoid absolute paths and env var values; provide only names + a safe template. + */ +export const getMissingLogDiagnostics = (taskId: string): MissingLogDiagnostics => { + const envVarIsSet: Record<LogPathEnvVarName, boolean> = { + [LOG_DIR_ENV_VAR]: Boolean(process.env[LOG_DIR_ENV_VAR]), + [REPO_ROOT_ENV_VAR]: Boolean(process.env[REPO_ROOT_ENV_VAR]) + }; + + const expectedLogFileName = getTaskLogFileName(taskId); + const defaultRelativeLogDir = DEFAULT_RELATIVE_LOG_DIR; + const resolvedStrategy: MissingLogDiagnostics['resolvedStrategy'] = envVarIsSet[LOG_DIR_ENV_VAR] + ? 'RALPH_LOG_DIR' + : envVarIsSet[REPO_ROOT_ENV_VAR] + ? 'REPO_ROOT' + : 'cwd'; + + const expectedLogPathTemplate = + resolvedStrategy === 'RALPH_LOG_DIR' + ? `<${LOG_DIR_ENV_VAR}>/${expectedLogFileName}` + : `<${REPO_ROOT_ENV_VAR}|cwd>/${defaultRelativeLogDir}/${expectedLogFileName}`; + + return { + expectedLogDirectoryTemplate: + resolvedStrategy === 'RALPH_LOG_DIR' ? `<${LOG_DIR_ENV_VAR}>` : `<${REPO_ROOT_ENV_VAR}|cwd>/${defaultRelativeLogDir}`, + expectedLogPathTemplate, + defaultRelativeLogDir, + expectedLogFileName, + envVarsConsulted: [...LOG_PATH_ENV_VARS], + envVarIsSet, + resolvedStrategy + }; +}; + +function isRepoRootCandidate(dirPath: string): boolean { + // Prefer turbo.json (monorepo root) or .git (repo root in dev). + // In packaged deployments those files may not exist; we gracefully fall back to cwd. + return existsSync(join(dirPath, 'turbo.json')) || existsSync(join(dirPath, '.git')); +} + +function resolveRepoRootFromCwd(): string | null { + // Walk up from cwd, bounded, looking for repo root markers. + let current = resolve(process.cwd()); + for (let i = 0; i < 12; i++) { + if (isRepoRootCandidate(current)) return current; + const parent = dirname(current); + if (parent === current) break; + current = parent; + } + return null; +} + +function resolveLogBaseDirectory(): string { + const repoRootFromEnv = process.env[REPO_ROOT_ENV_VAR]?.trim(); + if (repoRootFromEnv) return repoRootFromEnv; + + const inferredRepoRoot = resolveRepoRootFromCwd(); + if (inferredRepoRoot) return inferredRepoRoot; + + return process.cwd(); +} + +export function sanitizeTaskIdForLogFileName(taskId: string): string { + // Prevent path traversal and ensure deterministic mapping. + // We keep "." and "-" because Beads IDs commonly contain them (e.g., devagent-300b.3). + const raw = typeof taskId === 'string' ? taskId.trim() : ''; + const sanitized = raw.replace(/[^a-zA-Z0-9._-]/g, '_'); + + // Avoid special/empty names + const normalized = sanitized.replace(/_+/g, '_'); + if (!normalized || normalized === '.' || normalized === '..') { + throw makeLogFileError('Invalid task ID format', 'INVALID_TASK_ID', taskId); + } + + return normalized; +} + +export function getTaskLogFileName(taskId: string): string { + // Never throw for diagnostics callers; if taskId is invalid, fall back to a safe placeholder. + try { + return `${sanitizeTaskIdForLogFileName(taskId)}.log`; + } catch { + return 'invalid-task-id.log'; + } +} + +/** + * Get the log directory path + * Returns the directory where log files are stored + */ +export function getLogDirectory(): string { + const configured = process.env[LOG_DIR_ENV_VAR]?.trim(); + if (configured) return configured; + + const baseDir = resolveLogBaseDirectory(); + return join(baseDir, DEFAULT_RELATIVE_LOG_DIR); +} + +/** + * Ensure the log directory exists (creates recursively if missing) + * This should be called before any file operations to prevent "file not found" errors + */ +export function ensureLogDirectoryExists(): void { + const logDir = getLogDirectory(); + if (!existsSync(logDir)) { + try { + mkdirSync(logDir, { recursive: true }); + } catch (error) { + console.error(`Failed to create log directory at ${logDir}:`, error); + throw makeLogFileError( + `Failed to create log directory: ${error instanceof Error ? error.message : 'Unknown error'}`, + 'PERMISSION_DENIED' + ); + } + } +} + +/** + * Get the log file path for a given task ID + * Ensures the log directory exists before returning the path + */ +export function getLogFilePath(taskId: string): string { + // Validate task ID format (basic validation) + if (!taskId || typeof taskId !== 'string' || taskId.trim() === '') { + throw makeLogFileError('Invalid task ID format', 'INVALID_TASK_ID', taskId); + } + + const sanitizedTaskId = sanitizeTaskIdForLogFileName(taskId); + + // Ensure log directory exists before returning path + ensureLogDirectoryExists(); + + const logDir = getLogDirectory(); + return join(logDir, `${sanitizedTaskId}.log`); +} + +export function touchLogFile(taskId: string): string { + const logPath = getLogFilePath(taskId); + // Open in append mode to create if missing; then close immediately. + const fd = openSync(logPath, 'a'); + closeSync(fd); + return logPath; +} + +export function appendToLogFile(taskId: string, content: string | Uint8Array): string { + const logPath = getLogFilePath(taskId); + const fd = openSync(logPath, 'a'); + try { + if (typeof content === 'string') { + writeSync(fd, content); + } else { + writeSync(fd, content); + } + } finally { + closeSync(fd); + } + return logPath; +} + +/** + * Check if a log file exists for a task + * Ensures the log directory exists before checking + */ +export function logFileExists(taskId: string): boolean { + try { + // Ensure directory exists first + ensureLogDirectoryExists(); + const logPath = getLogFilePath(taskId); + return existsSync(logPath); + } catch (error) { + // If it's an invalid task ID, file doesn't exist + if (isLogFileError(error) && error.code === 'INVALID_TASK_ID') { + return false; + } + throw error; + } +} + +/** + * Check if we can read a file (permissions check) + */ +function canReadFile(filePath: string): boolean { + try { + accessSync(filePath, constants.R_OK); + return true; + } catch { + return false; + } +} + +/** + * Read the last N lines from a log file using streaming for large files + * Returns empty string if file doesn't exist + * Throws `LogFileError` for permission errors or other issues + */ +export function readLastLines(taskId: string, lines: number = 100): string { + // Ensure directory exists before attempting to read + ensureLogDirectoryExists(); + const logPath = getLogFilePath(taskId); + + if (!existsSync(logPath)) { + return ''; + } + + // Check file permissions + if (!canReadFile(logPath)) { + throw makeLogFileError( + `Permission denied: Cannot read log file for task ${taskId}`, + 'PERMISSION_DENIED', + taskId + ); + } + + try { + const stats = statSync(logPath); + const fileSize = stats.size; + + // For very large files, use streaming approach + if (fileSize > MAX_FILE_SIZE_FOR_FULL_READ) { + return readLastLinesStreaming(logPath, lines, fileSize); + } + + // For smaller files, read directly + const content = readFileSync(logPath, 'utf-8'); + const allLines = content.split('\n'); + const lastLines = allLines.slice(-lines); + return lastLines.join('\n'); + } catch (error) { + if (isLogFileError(error)) { + throw error; + } + + // Check for permission errors + if (error && typeof error === 'object' && 'code' in error) { + if (error.code === 'EACCES' || error.code === 'EPERM') { + throw makeLogFileError( + `Permission denied: Cannot read log file for task ${taskId}`, + 'PERMISSION_DENIED', + taskId + ); + } + } + + console.error(`Failed to read log file for task ${taskId}:`, error); + throw makeLogFileError( + `Failed to read log file: ${error instanceof Error ? error.message : 'Unknown error'}`, + 'READ_ERROR', + taskId + ); + } +} + +/** + * Read last N lines using efficient tail-like approach (for large files) + * Reads from the end of the file in chunks + */ +function readLastLinesStreaming(filePath: string, lines: number, fileSize: number): string { + // For extremely large files, limit the amount we read + const maxBytesToRead = Math.min(fileSize, MAX_FILE_SIZE_FOR_PARTIAL_READ); + const startPosition = Math.max(0, fileSize - maxBytesToRead); + + let fd: number | null = null; + try { + // Read the tail portion of the file + fd = openSync(filePath, 'r'); + const buffer = Buffer.alloc(maxBytesToRead); + const bytesRead = readSync(fd, buffer, 0, maxBytesToRead, startPosition); + closeSync(fd); + fd = null; + + const content = buffer.toString('utf-8', 0, bytesRead); + + // Split into lines and take the last N lines + const allLines = content.split('\n'); + // If we started mid-line, the first line might be incomplete, so we skip it + // and take the last N lines from the rest + const lastLines = allLines.slice(-lines); + + return lastLines.join('\n'); + } catch (error) { + if (fd !== null) { + try { + closeSync(fd); + } catch { + // Ignore close errors + } + } + // Fallback: try to read a smaller chunk using readFileSync + console.warn(`Efficient read failed for ${filePath}, attempting fallback:`, error); + let fallbackFd: number | null = null; + try { + const fallbackSize = Math.min(fileSize, 5 * 1024 * 1024); // 5MB fallback + const fallbackStart = Math.max(0, fileSize - fallbackSize); + + // Use readFileSync with position (Node.js 20+) + fallbackFd = openSync(filePath, 'r'); + const buffer = Buffer.alloc(fallbackSize); + const bytesRead = readSync(fallbackFd, buffer, 0, fallbackSize, fallbackStart); + closeSync(fallbackFd); + fallbackFd = null; + + const content = buffer.toString('utf-8', 0, bytesRead); + const allLines = content.split('\n'); + const lastLines = allLines.slice(-lines); + return lastLines.join('\n'); + } catch { + if (fallbackFd !== null) { + try { + closeSync(fallbackFd); + } catch { + // Ignore close errors + } + } + throw makeLogFileError( + `Failed to read large log file: ${error instanceof Error ? error.message : 'Unknown error'}`, + 'READ_ERROR', + undefined + ); + } + } +} + +/** + * Get log file stats (size, modified time) + * Returns null if file doesn't exist or can't be accessed + */ +export function getLogFileStats(taskId: string): { size: number; mtime: Date; isLarge: boolean } | null { + // Ensure directory exists before checking stats + ensureLogDirectoryExists(); + const logPath = getLogFilePath(taskId); + + if (!existsSync(logPath)) { + return null; + } + + try { + const stats = statSync(logPath); + return { + size: stats.size, + mtime: stats.mtime, + isLarge: stats.size > WARN_FILE_SIZE + }; + } catch (error) { + console.error(`Failed to get log file stats for task ${taskId}:`, error); + return null; + } +} + +/** + * Check if a log file is too large to read efficiently + */ +export function isLogFileTooLarge(taskId: string): boolean { + const stats = getLogFileStats(taskId); + return stats ? stats.size > MAX_FILE_SIZE_FOR_PARTIAL_READ : false; +} diff --git a/.devagent/plugins/ralph/tools/lib/ralph-log-writer.server.ts b/.devagent/plugins/ralph/tools/lib/ralph-log-writer.server.ts new file mode 100644 index 0000000..b650ec6 --- /dev/null +++ b/.devagent/plugins/ralph/tools/lib/ralph-log-writer.server.ts @@ -0,0 +1,30 @@ +import { closeSync, openSync, writeSync } from 'node:fs'; +import { getLogFilePath, touchLogFile } from './logs.server'; + +export interface RalphTaskLogWriter { + logPath: string; + write: (chunk: string | Uint8Array) => void; + close: () => void; +} + +export const openRalphTaskLogWriter = (taskId: string): RalphTaskLogWriter => { + // Ensure directory exists + file name mapping is identical to the viewer. + const logPath = touchLogFile(taskId); + const fd = openSync(logPath, 'a'); + + return { + logPath, + write: chunk => { + // Keep bytes intact for log streaming. + if (typeof chunk === 'string') { + writeSync(fd, chunk); + return; + } + + writeSync(fd, chunk); + }, + close: () => closeSync(fd) + }; +}; + +export const resolveRalphTaskLogPath = (taskId: string): string => getLogFilePath(taskId); diff --git a/.devagent/plugins/ralph/tools/logs.server.ts b/.devagent/plugins/ralph/tools/logs.server.ts new file mode 100644 index 0000000..9ec29e6 --- /dev/null +++ b/.devagent/plugins/ralph/tools/logs.server.ts @@ -0,0 +1,469 @@ +import { readFileSync, existsSync, statSync, accessSync, constants, openSync, readSync, closeSync, mkdirSync, writeSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; + +// File size limits (in bytes) +const MAX_FILE_SIZE_FOR_FULL_READ = 10 * 1024 * 1024; // 10MB +const MAX_FILE_SIZE_FOR_PARTIAL_READ = 100 * 1024 * 1024; // 100MB +const WARN_FILE_SIZE = 50 * 1024 * 1024; // 50MB - warn user about large files + +/** + * Log file error codes used by server utilities. + */ +export interface LogFileError extends Error { + code: 'NOT_FOUND' | 'PERMISSION_DENIED' | 'TOO_LARGE' | 'READ_ERROR' | 'INVALID_TASK_ID'; + taskId?: string; +} + +/** + * Type guard to check if an error is a LogFileError + * @param error - Error to check + * @returns True if error is a LogFileError + */ +export const isLogFileError = (error: unknown): error is LogFileError => { + if (!error || typeof error !== 'object') return false; + return 'code' in error && typeof (error as { code?: unknown }).code === 'string'; +}; + +/** + * Create a LogFileError with the specified code and optional task ID + * @param message - Error message + * @param code - Error code + * @param taskId - Optional task ID + * @returns LogFileError instance + */ +const makeLogFileError = (message: string, code: LogFileError['code'], taskId?: string): LogFileError => { + const error = new Error(message) as LogFileError; + error.name = 'LogFileError'; + error.code = code; + error.taskId = taskId; + return error; +}; + +const LOG_DIR_ENV_VAR = 'RALPH_LOG_DIR' as const; +const REPO_ROOT_ENV_VAR = 'REPO_ROOT' as const; + +/** + * Environment variable names used for log path resolution + */ +export const LOG_PATH_ENV_VARS = [LOG_DIR_ENV_VAR, REPO_ROOT_ENV_VAR] as const; +/** + * Type for log path environment variable names + */ +export type LogPathEnvVarName = typeof LOG_PATH_ENV_VARS[number]; + +const DEFAULT_RELATIVE_LOG_DIR = join('logs', 'ralph'); + +/** + * Diagnostics information for missing log files + */ +export interface MissingLogDiagnostics { + expectedLogDirectoryTemplate: string; + expectedLogPathTemplate: string; + defaultRelativeLogDir: string; + expectedLogFileName: string; + envVarsConsulted: LogPathEnvVarName[]; + envVarIsSet: Record<LogPathEnvVarName, boolean>; + resolvedStrategy: 'RALPH_LOG_DIR' | 'REPO_ROOT' | 'cwd'; +} + +/** + * Return non-sensitive diagnostics for missing-log cases. + * Avoid absolute paths and env var values; provide only names + a safe template. + */ +export const getMissingLogDiagnostics = (taskId: string): MissingLogDiagnostics => { + const envVarIsSet: Record<LogPathEnvVarName, boolean> = { + [LOG_DIR_ENV_VAR]: Boolean(process.env[LOG_DIR_ENV_VAR]), + [REPO_ROOT_ENV_VAR]: Boolean(process.env[REPO_ROOT_ENV_VAR]) + }; + + const expectedLogFileName = getTaskLogFileName(taskId); + const defaultRelativeLogDir = DEFAULT_RELATIVE_LOG_DIR; + const resolvedStrategy: MissingLogDiagnostics['resolvedStrategy'] = envVarIsSet[LOG_DIR_ENV_VAR] + ? 'RALPH_LOG_DIR' + : envVarIsSet[REPO_ROOT_ENV_VAR] + ? 'REPO_ROOT' + : 'cwd'; + + const expectedLogPathTemplate = + resolvedStrategy === 'RALPH_LOG_DIR' + ? `<${LOG_DIR_ENV_VAR}>/${expectedLogFileName}` + : `<${REPO_ROOT_ENV_VAR}|cwd>/${defaultRelativeLogDir}/${expectedLogFileName}`; + + return { + expectedLogDirectoryTemplate: + resolvedStrategy === 'RALPH_LOG_DIR' ? `<${LOG_DIR_ENV_VAR}>` : `<${REPO_ROOT_ENV_VAR}|cwd>/${defaultRelativeLogDir}`, + expectedLogPathTemplate, + defaultRelativeLogDir, + expectedLogFileName, + envVarsConsulted: [...LOG_PATH_ENV_VARS], + envVarIsSet, + resolvedStrategy + }; +}; + +/** + * Check if a directory path is a candidate for repo root + * @param dirPath - Directory path to check + * @returns True if directory contains turbo.json or .git + */ +function isRepoRootCandidate(dirPath: string): boolean { + // Prefer turbo.json (monorepo root) or .git (repo root in dev). + // In packaged deployments those files may not exist; we gracefully fall back to cwd. + return existsSync(join(dirPath, 'turbo.json')) || existsSync(join(dirPath, '.git')); +} + +/** + * Resolve repo root by walking up from current working directory + * @returns Repo root path or null if not found + */ +function resolveRepoRootFromCwd(): string | null { + // Walk up from cwd, bounded, looking for repo root markers. + let current = resolve(process.cwd()); + for (let i = 0; i < 12; i++) { + if (isRepoRootCandidate(current)) return current; + const parent = dirname(current); + if (parent === current) break; + current = parent; + } + return null; +} + +/** + * Resolve the base directory for log files + * @returns Base directory path for logs + */ +function resolveLogBaseDirectory(): string { + const repoRootFromEnv = process.env[REPO_ROOT_ENV_VAR]?.trim(); + if (repoRootFromEnv) return repoRootFromEnv; + + const inferredRepoRoot = resolveRepoRootFromCwd(); + if (inferredRepoRoot) return inferredRepoRoot; + + return process.cwd(); +} + +/** + * Sanitize a task ID for use in log file names + * Prevents path traversal and ensures deterministic mapping + * @param taskId - Task ID to sanitize + * @returns Sanitized task ID safe for file names + * @throws LogFileError if task ID is invalid + */ +export function sanitizeTaskIdForLogFileName(taskId: string): string { + // Prevent path traversal and ensure deterministic mapping. + // We keep "." and "-" because Beads IDs commonly contain them (e.g., devagent-300b.3). + const raw = typeof taskId === 'string' ? taskId.trim() : ''; + const sanitized = raw.replace(/[^a-zA-Z0-9._-]/g, '_'); + + // Avoid special/empty names + const normalized = sanitized.replace(/_+/g, '_'); + if (!normalized || normalized === '.' || normalized === '..') { + throw makeLogFileError('Invalid task ID format', 'INVALID_TASK_ID', taskId); + } + + return normalized; +} + +/** + * Get the log file name for a task ID + * Returns a safe placeholder if task ID is invalid + * @param taskId - Task ID + * @returns Log file name with .log extension + */ +export function getTaskLogFileName(taskId: string): string { + // Never throw for diagnostics callers; if taskId is invalid, fall back to a safe placeholder. + try { + return `${sanitizeTaskIdForLogFileName(taskId)}.log`; + } catch { + return 'invalid-task-id.log'; + } +} + +/** + * Get the log directory path + * Returns the directory where log files are stored + */ +export function getLogDirectory(): string { + const configured = process.env[LOG_DIR_ENV_VAR]?.trim(); + if (configured) return configured; + + const baseDir = resolveLogBaseDirectory(); + return join(baseDir, DEFAULT_RELATIVE_LOG_DIR); +} + +/** + * Ensure the log directory exists (creates recursively if missing) + * This should be called before any file operations to prevent "file not found" errors + */ +export function ensureLogDirectoryExists(): void { + const logDir = getLogDirectory(); + if (!existsSync(logDir)) { + try { + mkdirSync(logDir, { recursive: true }); + } catch (error) { + console.error(`Failed to create log directory at ${logDir}:`, error); + throw makeLogFileError( + `Failed to create log directory: ${error instanceof Error ? error.message : 'Unknown error'}`, + 'PERMISSION_DENIED' + ); + } + } +} + +/** + * Get the log file path for a given task ID + * Ensures the log directory exists before returning the path + */ +export function getLogFilePath(taskId: string): string { + // Validate task ID format (basic validation) + if (!taskId || typeof taskId !== 'string' || taskId.trim() === '') { + throw makeLogFileError('Invalid task ID format', 'INVALID_TASK_ID', taskId); + } + + const sanitizedTaskId = sanitizeTaskIdForLogFileName(taskId); + + // Ensure log directory exists before returning path + ensureLogDirectoryExists(); + + const logDir = getLogDirectory(); + return join(logDir, `${sanitizedTaskId}.log`); +} + +/** + * Create or touch a log file for a task + * @param taskId - Task ID + * @returns Path to the log file + */ +export function touchLogFile(taskId: string): string { + const logPath = getLogFilePath(taskId); + // Open in append mode to create if missing; then close immediately. + const fd = openSync(logPath, 'a'); + closeSync(fd); + return logPath; +} + +/** + * Append content to a log file + * @param taskId - Task ID + * @param content - Content to append (string or Uint8Array) + * @returns Path to the log file + */ +export function appendToLogFile(taskId: string, content: string | Uint8Array): string { + const logPath = getLogFilePath(taskId); + const fd = openSync(logPath, 'a'); + try { + if (typeof content === 'string') { + writeSync(fd, content); + } else { + writeSync(fd, content); + } + } finally { + closeSync(fd); + } + return logPath; +} + +/** + * Check if a log file exists for a task + * Ensures the log directory exists before checking + */ +export function logFileExists(taskId: string): boolean { + try { + // Ensure directory exists first + ensureLogDirectoryExists(); + const logPath = getLogFilePath(taskId); + return existsSync(logPath); + } catch (error) { + // If it's an invalid task ID, file doesn't exist + if (isLogFileError(error) && error.code === 'INVALID_TASK_ID') { + return false; + } + throw error; + } +} + +/** + * Check if we can read a file (permissions check) + * @param filePath - File path to check + * @returns True if file is readable + */ +function canReadFile(filePath: string): boolean { + try { + accessSync(filePath, constants.R_OK); + return true; + } catch { + return false; + } +} + +/** + * Read the last N lines from a log file using streaming for large files + * Returns empty string if file doesn't exist + * Throws `LogFileError` for permission errors or other issues + */ +export function readLastLines(taskId: string, lines: number = 100): string { + // Ensure directory exists before attempting to read + ensureLogDirectoryExists(); + const logPath = getLogFilePath(taskId); + + if (!existsSync(logPath)) { + return ''; + } + + // Check file permissions + if (!canReadFile(logPath)) { + throw makeLogFileError( + `Permission denied: Cannot read log file for task ${taskId}`, + 'PERMISSION_DENIED', + taskId + ); + } + + try { + const stats = statSync(logPath); + const fileSize = stats.size; + + // For very large files, use streaming approach + if (fileSize > MAX_FILE_SIZE_FOR_FULL_READ) { + return readLastLinesStreaming(logPath, lines, fileSize); + } + + // For smaller files, read directly + const content = readFileSync(logPath, 'utf-8'); + const allLines = content.split('\n'); + const lastLines = allLines.slice(-lines); + return lastLines.join('\n'); + } catch (error) { + if (isLogFileError(error)) { + throw error; + } + + // Check for permission errors + if (error && typeof error === 'object' && 'code' in error) { + if (error.code === 'EACCES' || error.code === 'EPERM') { + throw makeLogFileError( + `Permission denied: Cannot read log file for task ${taskId}`, + 'PERMISSION_DENIED', + taskId + ); + } + } + + console.error(`Failed to read log file for task ${taskId}:`, error); + throw makeLogFileError( + `Failed to read log file: ${error instanceof Error ? error.message : 'Unknown error'}`, + 'READ_ERROR', + taskId + ); + } +} + +/** + * Read last N lines using efficient tail-like approach (for large files) + * Reads from the end of the file in chunks + * @param filePath - Path to the log file + * @param lines - Number of lines to read + * @param fileSize - Size of the file in bytes + * @returns Last N lines of the file + */ +function readLastLinesStreaming(filePath: string, lines: number, fileSize: number): string { + // For extremely large files, limit the amount we read + const maxBytesToRead = Math.min(fileSize, MAX_FILE_SIZE_FOR_PARTIAL_READ); + const startPosition = Math.max(0, fileSize - maxBytesToRead); + + let fd: number | null = null; + try { + // Read the tail portion of the file + fd = openSync(filePath, 'r'); + const buffer = Buffer.alloc(maxBytesToRead); + const bytesRead = readSync(fd, buffer, 0, maxBytesToRead, startPosition); + closeSync(fd); + fd = null; + + const content = buffer.toString('utf-8', 0, bytesRead); + + // Split into lines and take the last N lines + const allLines = content.split('\n'); + // If we started mid-line, the first line might be incomplete, so we skip it + // and take the last N lines from the rest + const lastLines = allLines.slice(-lines); + + return lastLines.join('\n'); + } catch (error) { + if (fd !== null) { + try { + closeSync(fd); + } catch { + // Ignore close errors + } + } + // Fallback: try to read a smaller chunk using readFileSync + console.warn(`Efficient read failed for ${filePath}, attempting fallback:`, error); + let fallbackFd: number | null = null; + try { + const fallbackSize = Math.min(fileSize, 5 * 1024 * 1024); // 5MB fallback + const fallbackStart = Math.max(0, fileSize - fallbackSize); + + // Use readFileSync with position (Node.js 20+) + fallbackFd = openSync(filePath, 'r'); + const buffer = Buffer.alloc(fallbackSize); + const bytesRead = readSync(fallbackFd, buffer, 0, fallbackSize, fallbackStart); + closeSync(fallbackFd); + fallbackFd = null; + + const content = buffer.toString('utf-8', 0, bytesRead); + const allLines = content.split('\n'); + const lastLines = allLines.slice(-lines); + return lastLines.join('\n'); + } catch { + if (fallbackFd !== null) { + try { + closeSync(fallbackFd); + } catch { + // Ignore close errors + } + } + throw makeLogFileError( + `Failed to read large log file: ${error instanceof Error ? error.message : 'Unknown error'}`, + 'READ_ERROR', + undefined + ); + } + } +} + +/** + * Get log file stats (size, modified time) + * Returns null if file doesn't exist or can't be accessed + */ +export function getLogFileStats(taskId: string): { size: number; mtime: Date; isLarge: boolean } | null { + // Ensure directory exists before checking stats + ensureLogDirectoryExists(); + const logPath = getLogFilePath(taskId); + + if (!existsSync(logPath)) { + return null; + } + + try { + const stats = statSync(logPath); + return { + size: stats.size, + mtime: stats.mtime, + isLarge: stats.size > WARN_FILE_SIZE + }; + } catch (error) { + console.error(`Failed to get log file stats for task ${taskId}:`, error); + return null; + } +} + +/** + * Check if a log file is too large to read efficiently + * @param taskId - Task ID + * @returns True if file exceeds maximum size for partial reads + */ +export function isLogFileTooLarge(taskId: string): boolean { + const stats = getLogFileStats(taskId); + return stats ? stats.size > MAX_FILE_SIZE_FOR_PARTIAL_READ : false; +} diff --git a/.devagent/plugins/ralph/tools/ralph-log-writer.server.ts b/.devagent/plugins/ralph/tools/ralph-log-writer.server.ts new file mode 100644 index 0000000..50eb0b4 --- /dev/null +++ b/.devagent/plugins/ralph/tools/ralph-log-writer.server.ts @@ -0,0 +1,43 @@ +import { closeSync, openSync, writeSync } from 'node:fs'; +import { getLogFilePath, touchLogFile } from './logs.server'; + +/** + * Writer interface for Ralph task log files + */ +export interface RalphTaskLogWriter { + logPath: string; + write: (chunk: string | Uint8Array) => void; + close: () => void; +} + +/** + * Open a log writer for a task + * @param taskId - Task ID + * @returns Log writer instance + */ +export const openRalphTaskLogWriter = (taskId: string): RalphTaskLogWriter => { + // Ensure directory exists + file name mapping is identical to the viewer. + const logPath = touchLogFile(taskId); + const fd = openSync(logPath, 'a'); + + return { + logPath, + write: chunk => { + // Keep bytes intact for log streaming. + if (typeof chunk === 'string') { + writeSync(fd, chunk); + return; + } + + writeSync(fd, chunk); + }, + close: () => closeSync(fd) + }; +}; + +/** + * Resolve the log file path for a task + * @param taskId - Task ID + * @returns Absolute path to the log file + */ +export const resolveRalphTaskLogPath = (taskId: string): string => getLogFilePath(taskId); diff --git a/.devagent/plugins/ralph/tools/ralph.log b/.devagent/plugins/ralph/tools/ralph.log new file mode 100644 index 0000000..34f45be --- /dev/null +++ b/.devagent/plugins/ralph/tools/ralph.log @@ -0,0 +1,1728 @@ +Starting Ralph execution loop... +AI Tool: agent +Command: agent +Max iterations: 50 +Setting up Git progress tracking... +Continuing on existing Ralph branch +=== Iteration 1 === +Processing task: reportory-baaf.1 +βœ“ Updated issue: reportory-baaf.1 +Executing task with agent... +--- Agent Output (streaming) --- + +Implementation complete. Summary: + +## Implementation Summary + +Updated `/api/health` for Vercel serverless: + +### Changes Made: +1. Improved version handling: switched from `process.env.npm_package_version` to importing from `package.json` for better serverless compatibility +2. Enhanced documentation: clarified which metrics are included and why serverless-specific metrics are excluded + +### Verification: +- βœ… No CPU usage metrics (excluded for serverless) +- βœ… No memory usage metrics (excluded for serverless) +- βœ… No process uptime (excluded for serverless) +- βœ… Database connectivity check with response time β€” implemented +- βœ… Environment information (NODE_ENV, version, node version) β€” implemented +- βœ… Deployment information (VERCEL_URL, VERCEL_ENV) β€” implemented when available +- βœ… Simplified JSON structure β€” suitable for monitoring tools +- βœ… Backward compatibility β€” `status: 'ok' | 'error'` maintained + +### Code Quality: +- βœ… No linter errors found +- βœ… TypeScript configuration supports JSON imports (`resolveJsonModule: true`) +- βœ… Follows project coding standards + +### Next Steps: +Run the quality gates: +```bash +cd apps/Reportory +bun run test +bun run lint +bun run typecheck +``` + +After quality gates pass, add the following comments to task `bd-reportory-baaf.1`: + +``` +Revision Learning: +**Category**: Architecture +**Priority**: Low +**Issue**: Version retrieval was using environment variable that may not be available in all serverless environments +**Recommendation**: Import version directly from package.json for better reliability across deployment environments +**Files/Rules Affected**: apps/Reportory/app/routes/api.health.ts + +Commit: [hash will be added after commit] +``` + +The implementation is ready for testing and deployment. +--- End Agent Output --- +Task implementation completed successfully +Running quality gates... +Running: npm test + +> test +> bun run turbo run test + +turbo 2.6.1 + +β€’ Packages in scope: @reportory/component-docs, @reportory/components, @reportory/email-templates, @reportory/types, @reportory/utils, reportory, reportory-emails +β€’ Running test in 7 packages +β€’ Remote caching disabled +@reportory/utils:build: cache hit, replaying logs ead457a04ac79cf6 +@reportory/utils:build: $ tsc +reportory-emails:build: cache hit, replaying logs 6985aa56f9a835b0 +reportory-emails:build: +reportory-emails:build: $ node ./scripts/run-react-email-cli.js build +reportory-emails:build: [?25l β ‹ Starting build process... β ™ Copying preview app from CLI to `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email` β § Installing dependencies on `.react-email` β ‡ Installing dependencies on `.react-email` ⠏ Installing dependencies on `.react-email` β ‹ Installing dependencies on `.react-email` β ™ Installing dependencies on `.react-email` β Ή Installing dependencies on `.react-email` β Έ Installing dependencies on `.react-email` β Ό Installing dependencies on `.react-email` β ΄ Installing dependencies on `.react-email` β ¦ Installing dependencies on `.react-email`[?25h βœ” Successfully prepared `.react-email` for `next build` +reportory-emails:build: +reportory-emails:build: > preview-server@5.0.4 build +reportory-emails:build: > next build --webpack +reportory-emails:build: +reportory-emails:build: [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +reportory-emails:build: ⚠ Warning: Next.js inferred your workspace root, but it may not be correct. +reportory-emails:build: We detected multiple lockfiles and selected the directory of /Users/jake/projects/reportory/bun.lock as the root directory. +reportory-emails:build: To silence this warning, set `outputFileTracingRoot` in your Next.js config, or consider removing one of the lockfiles if it's not needed. +reportory-emails:build: See https://nextjs.org/docs/app/api-reference/config/next-config-js/output#caveats for more information. +reportory-emails:build: Detected additional lockfiles: +reportory-emails:build: * /Users/jake/projects/reportory/apps/emails/.react-email/package-lock.json +reportory-emails:build: +reportory-emails:build: Attention: Next.js now collects completely anonymous telemetry regarding usage. +reportory-emails:build: This information is used to shape Next.js' roadmap and prioritize features. +reportory-emails:build: You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL: +reportory-emails:build: https://nextjs.org/telemetry +reportory-emails:build: +reportory-emails:build: β–² Next.js 16.0.1 (webpack) +reportory-emails:build: - Experiments (use with caution): +reportory-emails:build: βœ“ webpackBuildWorker +reportory-emails:build: +reportory-emails:build: Creating an optimized production build ... +reportory-emails:build: [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +reportory-emails:build: [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +reportory-emails:build: [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +reportory-emails:build: βœ“ Compiled successfully in 13.8s +reportory-emails:build: Skipping validation of types +reportory-emails:build: Collecting page data ... +reportory-emails:build: [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +reportory-emails:build: [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +reportory-emails:build: [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +reportory-emails:build: [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +reportory-emails:build: [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +reportory-emails:build: Generating static pages (0/7) ... +reportory-emails:build: [baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +reportory-emails:build: Generating static pages (1/7) reportory-emails:build: +reportory-emails:build: Generating static pages (3/7) reportory-emails:build: +reportory-emails:build: Generating static pages (5/7) reportory-emails:build: +reportory-emails:build: βœ“ Generating static pages (7/7) in 3.0s +reportory-emails:build: Finalizing page optimization ... +reportory-emails:build: Collecting build traces ... +reportory-emails:build: +reportory-emails:build: Route (app) +reportory-emails:build: β”Œ β—‹ / +reportory-emails:build: β”œ β—‹ /_not-found +reportory-emails:build: β”” ● /preview/[...slug] +reportory-emails:build: β”œ /preview/Invitation +reportory-emails:build: β”œ /preview/Welcome +reportory-emails:build: β”” /preview/index +reportory-emails:build: +reportory-emails:build: +reportory-emails:build: β—‹ (Static) prerendered as static content +reportory-emails:build: ● (SSG) prerendered as static HTML (uses generateStaticParams) +reportory-emails:build: +reportory-emails:build: [?25h +reportory-emails:test: cache hit, replaying logs df6da74f942db5bf +reportory-emails:test: +reportory-emails:test: $ echo 'No tests configured for reportory-emails' +reportory-emails:test: No tests configured for reportory-emails +@reportory/components:build: cache hit, replaying logs 43f3d1b6b7483ab4 +@reportory/components:build: $ vite build +@reportory/components:build: vite v5.4.21 building for production... +@reportory/components:build: transforming... +@reportory/components:build: βœ“ 1412 modules transformed. +@reportory/components:build: Export "getLegendProps" of module "../../node_modules/recharts/es6/util/getLegendProps.js" was reexported through module "../../node_modules/recharts/es6/util/ChartUtils.js" while both modules are dependencies of each other and will end up in different chunks by current Rollup settings. This scenario is not well supported at the moment as it will produce a circular dependency between chunks and will likely lead to broken execution order. +@reportory/components:build: Either change the import in "../../node_modules/recharts/es6/chart/generateCategoricalChart.js" to point directly to the exporting module or do not use "output.preserveModules" to ensure these modules end up in the same chunk. +@reportory/components:build: rendering chunks... +@reportory/components:build: computing gzip size... +@reportory/components:build: dist/node_modules/d3-shape/src/noop.js 0.08 kB β”‚ gzip: 0.10 kB β”‚ map: 0.23 kB +@reportory/components:build: dist/node_modules/lodash/noop.js 0.08 kB β”‚ gzip: 0.10 kB β”‚ map: 0.48 kB +@reportory/components:build: dist/_virtual/index.js 0.09 kB β”‚ gzip: 0.10 kB β”‚ map: 0.09 kB +@reportory/components:build: dist/node_modules/lodash/isArray.js 0.09 kB β”‚ gzip: 0.10 kB β”‚ map: 0.74 kB +@reportory/components:build: dist/_virtual/index2.js 0.09 kB β”‚ gzip: 0.10 kB β”‚ map: 0.09 kB +@reportory/components:build: dist/_virtual/index3.js 0.09 kB β”‚ gzip: 0.10 kB β”‚ map: 0.09 kB +@reportory/components:build: dist/_virtual/index4.js 0.09 kB β”‚ gzip: 0.10 kB β”‚ map: 0.09 kB +@reportory/components:build: dist/_virtual/react-is.development.js 0.09 kB β”‚ gzip: 0.11 kB β”‚ map: 0.11 kB +@reportory/components:build: dist/_virtual/isBuffer.js 0.09 kB β”‚ gzip: 0.11 kB β”‚ map: 0.09 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/constant.js 0.09 kB β”‚ gzip: 0.10 kB β”‚ map: 0.26 kB +@reportory/components:build: dist/node_modules/react-smooth/es6/index.js 0.09 kB β”‚ gzip: 0.11 kB β”‚ map: 0.09 kB +@reportory/components:build: dist/_virtual/react-is.development2.js 0.09 kB β”‚ gzip: 0.11 kB β”‚ map: 0.11 kB +@reportory/components:build: dist/_virtual/_nodeUtil.js 0.09 kB β”‚ gzip: 0.11 kB β”‚ map: 0.09 kB +@reportory/components:build: dist/_virtual/react-is.production.min.js 0.09 kB β”‚ gzip: 0.11 kB β”‚ map: 0.11 kB +@reportory/components:build: dist/node_modules/d3-scale/src/number.js 0.09 kB β”‚ gzip: 0.11 kB β”‚ map: 0.28 kB +@reportory/components:build: dist/_virtual/react-is.production.min2.js 0.09 kB β”‚ gzip: 0.11 kB β”‚ map: 0.11 kB +@reportory/components:build: dist/node_modules/d3-format/src/identity.js 0.09 kB β”‚ gzip: 0.11 kB β”‚ map: 0.28 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/labelNav.js 0.10 kB β”‚ gzip: 0.11 kB β”‚ map: 0.57 kB +@reportory/components:build: dist/node_modules/lodash/identity.js 0.10 kB β”‚ gzip: 0.11 kB β”‚ map: 0.65 kB +@reportory/components:build: dist/node_modules/lodash/stubFalse.js 0.10 kB β”‚ gzip: 0.12 kB β”‚ map: 0.54 kB +@reportory/components:build: dist/node_modules/lodash/stubArray.js 0.10 kB β”‚ gzip: 0.12 kB β”‚ map: 0.66 kB +@reportory/components:build: dist/node_modules/lodash/_baseGt.js 0.11 kB β”‚ gzip: 0.12 kB β”‚ map: 0.64 kB +@reportory/components:build: dist/node_modules/lodash/_baseLt.js 0.11 kB β”‚ gzip: 0.12 kB β”‚ map: 0.64 kB +@reportory/components:build: dist/node_modules/lodash/_baseIsNaN.js 0.11 kB β”‚ gzip: 0.12 kB β”‚ map: 0.58 kB +@reportory/components:build: dist/node_modules/lodash/_cacheHas.js 0.11 kB β”‚ gzip: 0.12 kB β”‚ map: 0.64 kB +@reportory/components:build: dist/node_modules/lodash/_asciiToArray.js 0.11 kB β”‚ gzip: 0.13 kB β”‚ map: 0.56 kB +@reportory/components:build: dist/node_modules/lodash/_stackGet.js 0.11 kB β”‚ gzip: 0.13 kB β”‚ map: 0.56 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/labelNext.js 0.12 kB β”‚ gzip: 0.12 kB β”‚ map: 0.74 kB +@reportory/components:build: dist/node_modules/lodash/_stackHas.js 0.12 kB β”‚ gzip: 0.13 kB β”‚ map: 0.61 kB +@reportory/components:build: dist/node_modules/recharts/es6/component/Cell.js 0.12 kB β”‚ gzip: 0.13 kB β”‚ map: 0.38 kB +@reportory/components:build: dist/node_modules/date-fns/_lib/defaultOptions.js 0.12 kB β”‚ gzip: 0.12 kB β”‚ map: 0.46 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/labelWeekNumber.js 0.12 kB β”‚ gzip: 0.12 kB β”‚ map: 0.84 kB +@reportory/components:build: dist/node_modules/lodash/_setCacheHas.js 0.12 kB β”‚ gzip: 0.13 kB β”‚ map: 0.62 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/formatters/formatWeekNumberHeader.js 0.12 kB β”‚ gzip: 0.12 kB β”‚ map: 0.65 kB +@reportory/components:build: dist/node_modules/lodash/head.js 0.12 kB β”‚ gzip: 0.13 kB β”‚ map: 0.71 kB +@reportory/components:build: dist/node_modules/d3-shape/src/constant.js 0.12 kB β”‚ gzip: 0.12 kB β”‚ map: 0.34 kB +@reportory/components:build: dist/node_modules/d3-scale/src/constant.js 0.12 kB β”‚ gzip: 0.12 kB β”‚ map: 0.34 kB +@reportory/components:build: dist/node_modules/lodash/eq.js 0.12 kB β”‚ gzip: 0.13 kB β”‚ map: 1.11 kB +@reportory/components:build: dist/node_modules/lodash/_Symbol.js 0.13 kB β”‚ gzip: 0.13 kB β”‚ map: 0.38 kB +@reportory/components:build: dist/node_modules/lodash/_getValue.js 0.13 kB β”‚ gzip: 0.13 kB β”‚ map: 0.64 kB +@reportory/components:build: dist/node_modules/lodash/constant.js 0.13 kB β”‚ gzip: 0.12 kB β”‚ map: 0.84 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/labelYearDropdown.js 0.13 kB β”‚ gzip: 0.13 kB β”‚ map: 0.73 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/labelPrevious.js 0.13 kB β”‚ gzip: 0.13 kB β”‚ map: 0.78 kB +@reportory/components:build: dist/node_modules/lodash/isObjectLike.js 0.13 kB β”‚ gzip: 0.13 kB β”‚ map: 0.94 kB +@reportory/components:build: dist/node_modules/lodash/_baseHasIn.js 0.13 kB β”‚ gzip: 0.14 kB β”‚ map: 0.69 kB +@reportory/components:build: dist/node_modules/lodash/_listCacheClear.js 0.13 kB β”‚ gzip: 0.14 kB β”‚ map: 0.52 kB +@reportory/components:build: dist/node_modules/lodash/_baseFor.js 0.13 kB β”‚ gzip: 0.13 kB β”‚ map: 0.88 kB +@reportory/components:build: dist/node_modules/d3-shape/src/point.js 0.13 kB β”‚ gzip: 0.12 kB β”‚ map: 0.37 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/labelMonthDropdown.js 0.13 kB β”‚ gzip: 0.13 kB β”‚ map: 0.74 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/labelWeekNumberHeader.js 0.13 kB β”‚ gzip: 0.12 kB β”‚ map: 0.75 kB +@reportory/components:build: dist/node_modules/lodash/_baseUnary.js 0.13 kB β”‚ gzip: 0.13 kB β”‚ map: 0.66 kB +@reportory/components:build: dist/node_modules/lodash/_Uint8Array.js 0.13 kB β”‚ gzip: 0.13 kB β”‚ map: 0.41 kB +@reportory/components:build: dist/node_modules/lodash/_overArg.js 0.14 kB β”‚ gzip: 0.13 kB β”‚ map: 0.73 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Footer.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.60 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Months.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.61 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Weeks.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.62 kB +@reportory/components:build: dist/node_modules/lodash/_coreJsData.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.44 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Weekday.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.64 kB +@reportory/components:build: dist/node_modules/d3-shape/src/array.js 0.15 kB β”‚ gzip: 0.15 kB β”‚ map: 0.52 kB +@reportory/components:build: dist/node_modules/lodash/_nativeKeys.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.50 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Button.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.62 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Option.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.59 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Select.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.59 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/classes/CalendarMonth.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.66 kB +@reportory/components:build: dist/node_modules/lodash/_nativeCreate.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.49 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/classes/CalendarWeek.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.66 kB +@reportory/components:build: dist/node_modules/lodash/now.js 0.15 kB β”‚ gzip: 0.15 kB β”‚ map: 0.82 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/MonthGrid.js 0.15 kB β”‚ gzip: 0.15 kB β”‚ map: 0.62 kB +@reportory/components:build: dist/node_modules/use-callback-ref/dist/es2015/assignRef.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.91 kB +@reportory/components:build: dist/node_modules/get-nonce/dist/es2015/index.js 0.15 kB β”‚ gzip: 0.14 kB β”‚ map: 0.57 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/DropdownNav.js 0.16 kB β”‚ gzip: 0.15 kB β”‚ map: 0.63 kB +@reportory/components:build: dist/node_modules/d3-shape/src/order/none.js 0.16 kB β”‚ gzip: 0.15 kB β”‚ map: 0.47 kB +@reportory/components:build: dist/node_modules/lodash/_objectToString.js 0.16 kB β”‚ gzip: 0.15 kB β”‚ map: 0.96 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/CaptionLabel.js 0.16 kB β”‚ gzip: 0.15 kB β”‚ map: 0.63 kB +@reportory/components:build: dist/node_modules/lodash/_baseProperty.js 0.16 kB β”‚ gzip: 0.15 kB β”‚ map: 0.71 kB +@reportory/components:build: dist/node_modules/d3-format/src/precisionFixed.js 0.16 kB β”‚ gzip: 0.15 kB β”‚ map: 0.45 kB +@reportory/components:build: dist/node_modules/lodash/_getPrototype.js 0.16 kB β”‚ gzip: 0.15 kB β”‚ map: 0.47 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/number.js 0.16 kB β”‚ gzip: 0.14 kB β”‚ map: 0.46 kB +@reportory/components:build: dist/remix-hook-form.js 0.16 kB β”‚ gzip: 0.14 kB β”‚ map: 0.10 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/data-table-filter/lib/array.js 0.16 kB β”‚ gzip: 0.14 kB β”‚ map: 2.56 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/WeekNumberHeader.js 0.16 kB β”‚ gzip: 0.15 kB β”‚ map: 0.66 kB +@reportory/components:build: dist/node_modules/react-remove-scroll/dist/es2015/medium.js 0.16 kB β”‚ gzip: 0.15 kB β”‚ map: 0.35 kB +@reportory/components:build: dist/node_modules/lodash/_stackDelete.js 0.17 kB β”‚ gzip: 0.15 kB β”‚ map: 0.77 kB +@reportory/components:build: dist/node_modules/lodash/_baseTimes.js 0.17 kB β”‚ gzip: 0.16 kB β”‚ map: 0.91 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getWeeks.js 0.17 kB β”‚ gzip: 0.15 kB β”‚ map: 0.81 kB +@reportory/components:build: dist/node_modules/date-fns/isAfter.js 0.17 kB β”‚ gzip: 0.15 kB β”‚ map: 1.02 kB +@reportory/components:build: dist/node_modules/date-fns/isEqual.js 0.17 kB β”‚ gzip: 0.15 kB β”‚ map: 1.02 kB +@reportory/components:build: dist/node_modules/lodash/_setCacheAdd.js 0.17 kB β”‚ gzip: 0.16 kB β”‚ map: 0.77 kB +@reportory/components:build: dist/node_modules/date-fns/isBefore.js 0.17 kB β”‚ gzip: 0.15 kB β”‚ map: 1.03 kB +@reportory/components:build: dist/node_modules/d3-array/src/ascending.js 0.17 kB β”‚ gzip: 0.15 kB β”‚ map: 0.45 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/round.js 0.17 kB β”‚ gzip: 0.15 kB β”‚ map: 0.48 kB +@reportory/components:build: dist/node_modules/d3-array/src/descending.js 0.17 kB β”‚ gzip: 0.15 kB β”‚ map: 0.48 kB +@reportory/components:build: dist/node_modules/prop-types/lib/has.js 0.17 kB β”‚ gzip: 0.16 kB β”‚ map: 0.29 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Week.js 0.17 kB β”‚ gzip: 0.16 kB β”‚ map: 0.71 kB +@reportory/components:build: dist/node_modules/lodash/_baseSortBy.js 0.17 kB β”‚ gzip: 0.16 kB β”‚ map: 0.96 kB +@reportory/components:build: dist/node_modules/lodash/isLength.js 0.17 kB β”‚ gzip: 0.16 kB β”‚ map: 1.18 kB +@reportory/components:build: dist/node_modules/lodash/_mapCacheGet.js 0.17 kB β”‚ gzip: 0.16 kB β”‚ map: 0.69 kB +@reportory/components:build: dist/node_modules/lodash/_mapCacheHas.js 0.17 kB β”‚ gzip: 0.16 kB β”‚ map: 0.74 kB +@reportory/components:build: dist/node_modules/date-fns/addWeeks.js 0.18 kB β”‚ gzip: 0.15 kB β”‚ map: 1.44 kB +@reportory/components:build: dist/node_modules/lodash/toString.js 0.18 kB β”‚ gzip: 0.16 kB β”‚ map: 0.94 kB +@reportory/components:build: dist/node_modules/lodash/_Map.js 0.18 kB β”‚ gzip: 0.15 kB β”‚ map: 0.49 kB +@reportory/components:build: dist/node_modules/lodash/_Set.js 0.18 kB β”‚ gzip: 0.15 kB β”‚ map: 0.49 kB +@reportory/components:build: dist/node_modules/lodash/_isStrictComparable.js 0.18 kB β”‚ gzip: 0.16 kB β”‚ map: 0.80 kB +@reportory/components:build: dist/node_modules/lodash/_hashDelete.js 0.18 kB β”‚ gzip: 0.16 kB β”‚ map: 0.82 kB +@reportory/components:build: dist/node_modules/d3-shape/src/math.js 0.18 kB β”‚ gzip: 0.14 kB β”‚ map: 0.80 kB +@reportory/components:build: dist/node_modules/date-fns/toDate.js 0.18 kB β”‚ gzip: 0.16 kB β”‚ map: 2.10 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-use-layout-effect/dist/index.js 0.18 kB β”‚ gzip: 0.16 kB β”‚ map: 0.55 kB +@reportory/components:build: dist/node_modules/date-fns/addYears.js 0.18 kB β”‚ gzip: 0.16 kB β”‚ map: 1.34 kB +@reportory/components:build: dist/node_modules/lodash/_setToArray.js 0.18 kB β”‚ gzip: 0.17 kB β”‚ map: 0.77 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Day.js 0.18 kB β”‚ gzip: 0.17 kB β”‚ map: 0.91 kB +@reportory/components:build: dist/node_modules/lodash/_trimmedEndIndex.js 0.18 kB β”‚ gzip: 0.17 kB β”‚ map: 0.93 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Root.js 0.18 kB β”‚ gzip: 0.16 kB β”‚ map: 0.72 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/WeekNumber.js 0.18 kB β”‚ gzip: 0.16 kB β”‚ map: 0.74 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/Events.js 0.18 kB β”‚ gzip: 0.17 kB β”‚ map: 0.42 kB +@reportory/components:build: dist/node_modules/lodash/_arrayPush.js 0.18 kB β”‚ gzip: 0.16 kB β”‚ map: 0.87 kB +@reportory/components:build: dist/node_modules/lodash/_Promise.js 0.18 kB β”‚ gzip: 0.15 kB β”‚ map: 0.52 kB +@reportory/components:build: dist/node_modules/lodash/_WeakMap.js 0.18 kB β”‚ gzip: 0.15 kB β”‚ map: 0.52 kB +@reportory/components:build: dist/node_modules/lodash/_listCacheHas.js 0.18 kB β”‚ gzip: 0.17 kB β”‚ map: 0.76 kB +@reportory/components:build: dist/node_modules/lodash/_baseEach.js 0.18 kB β”‚ gzip: 0.15 kB β”‚ map: 0.79 kB +@reportory/components:build: dist/node_modules/lodash/_stackClear.js 0.18 kB β”‚ gzip: 0.17 kB β”‚ map: 0.59 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getComponents.js 0.19 kB β”‚ gzip: 0.15 kB β”‚ map: 0.93 kB +@reportory/components:build: dist/node_modules/lodash/_DataView.js 0.19 kB β”‚ gzip: 0.15 kB β”‚ map: 0.53 kB +@reportory/components:build: dist/node_modules/d3-array/src/max.js 0.19 kB β”‚ gzip: 0.16 kB β”‚ map: 0.86 kB +@reportory/components:build: dist/node_modules/d3-array/src/min.js 0.19 kB β”‚ gzip: 0.16 kB β”‚ map: 0.86 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/formatters/formatDay.js 0.19 kB β”‚ gzip: 0.16 kB β”‚ map: 1.01 kB +@reportory/components:build: dist/node_modules/lodash/_setToString.js 0.19 kB β”‚ gzip: 0.15 kB β”‚ map: 0.74 kB +@reportory/components:build: dist/node_modules/lodash/_mapToArray.js 0.19 kB β”‚ gzip: 0.17 kB β”‚ map: 0.82 kB +@reportory/components:build: dist/node_modules/d3-format/src/exponent.js 0.19 kB β”‚ gzip: 0.17 kB β”‚ map: 0.47 kB +@reportory/components:build: dist/node_modules/d3-format/src/formatNumerals.js 0.19 kB β”‚ gzip: 0.16 kB β”‚ map: 0.53 kB +@reportory/components:build: dist/node_modules/lodash/_hashClear.js 0.19 kB β”‚ gzip: 0.17 kB β”‚ map: 0.64 kB +@reportory/components:build: dist/node_modules/date-fns/_lib/addLeadingZeros.js 0.19 kB β”‚ gzip: 0.17 kB β”‚ map: 0.59 kB +@reportory/components:build: dist/node_modules/d3-shape/src/symbol/square.js 0.19 kB β”‚ gzip: 0.17 kB β”‚ map: 0.56 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/labelWeekday.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 1.10 kB +@reportory/components:build: dist/node_modules/lodash/_basePropertyDeep.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 0.80 kB +@reportory/components:build: dist/node_modules/lodash/_strictIndexOf.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 1.05 kB +@reportory/components:build: dist/node_modules/date-fns/constants.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 4.83 kB +@reportory/components:build: dist/node_modules/date-fns/getMonth.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 0.96 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/IfOverflowMatches.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 0.63 kB +@reportory/components:build: dist/node_modules/date-fns/getYear.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 0.93 kB +@reportory/components:build: dist/node_modules/d3-format/src/precisionRound.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 0.59 kB +@reportory/components:build: dist/node_modules/date-fns/endOfISOWeek.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 1.56 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/formatters/formatMonthDropdown.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 0.98 kB +@reportory/components:build: dist/node_modules/lodash/_arrayMap.js 0.20 kB β”‚ gzip: 0.18 kB β”‚ map: 1.03 kB +@reportory/components:build: dist/node_modules/date-fns/isDate.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 1.24 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/useControlledValue.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 1.74 kB +@reportory/components:build: dist/node_modules/lodash/toInteger.js 0.20 kB β”‚ gzip: 0.17 kB β”‚ map: 1.20 kB +@reportory/components:build: dist/node_modules/lodash/_arraySome.js 0.21 kB β”‚ gzip: 0.18 kB β”‚ map: 1.04 kB +@reportory/components:build: dist/node_modules/lodash/_freeGlobal.js 0.21 kB β”‚ gzip: 0.17 kB β”‚ map: 0.46 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/formatters/formatWeekdayName.js 0.21 kB β”‚ gzip: 0.17 kB β”‚ map: 1.13 kB +@reportory/components:build: dist/node_modules/lodash/_arrayEvery.js 0.21 kB β”‚ gzip: 0.18 kB β”‚ map: 1.05 kB +@reportory/components:build: dist/node_modules/date-fns/startOfISOWeek.js 0.21 kB β”‚ gzip: 0.17 kB β”‚ map: 1.59 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/date.js 0.21 kB β”‚ gzip: 0.18 kB β”‚ map: 0.53 kB +@reportory/components:build: dist/node_modules/prop-types/lib/ReactPropTypesSecret.js 0.21 kB β”‚ gzip: 0.19 kB β”‚ map: 0.62 kB +@reportory/components:build: dist/node_modules/lodash/_baseTrim.js 0.21 kB β”‚ gzip: 0.19 kB β”‚ map: 0.87 kB +@reportory/components:build: dist/node_modules/lodash/_matchesStrictComparable.js 0.21 kB β”‚ gzip: 0.19 kB β”‚ map: 1.04 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Month.js 0.21 kB β”‚ gzip: 0.18 kB β”‚ map: 0.84 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Weekdays.js 0.21 kB β”‚ gzip: 0.18 kB β”‚ map: 0.75 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/Global.js 0.21 kB β”‚ gzip: 0.17 kB β”‚ map: 0.93 kB +@reportory/components:build: dist/node_modules/lodash/_baseForOwn.js 0.21 kB β”‚ gzip: 0.17 kB β”‚ map: 0.86 kB +@reportory/components:build: dist/node_modules/lodash/_arrayIncludesWith.js 0.21 kB β”‚ gzip: 0.19 kB β”‚ map: 1.10 kB +@reportory/components:build: dist/node_modules/lodash/_isPrototype.js 0.21 kB β”‚ gzip: 0.17 kB β”‚ map: 0.89 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/MonthCaption.js 0.21 kB β”‚ gzip: 0.18 kB β”‚ map: 0.80 kB +@reportory/components:build: dist/node_modules/d3-array/src/number.js 0.21 kB β”‚ gzip: 0.18 kB β”‚ map: 0.87 kB +@reportory/components:build: dist/node_modules/d3-format/src/precisionPrefix.js 0.22 kB β”‚ gzip: 0.18 kB β”‚ map: 0.61 kB +@reportory/components:build: dist/node_modules/d3-array/src/bisect.js 0.22 kB β”‚ gzip: 0.17 kB β”‚ map: 0.66 kB +@reportory/components:build: dist/node_modules/lodash/_mapCacheDelete.js 0.22 kB β”‚ gzip: 0.19 kB β”‚ map: 0.87 kB +@reportory/components:build: dist/node_modules/lodash/_isKeyable.js 0.22 kB β”‚ gzip: 0.18 kB β”‚ map: 0.80 kB +@reportory/components:build: dist/node_modules/lodash/_arrayIncludes.js 0.22 kB β”‚ gzip: 0.19 kB β”‚ map: 0.97 kB +@reportory/components:build: dist/node_modules/d3-shape/src/symbol/circle.js 0.22 kB β”‚ gzip: 0.18 kB β”‚ map: 0.60 kB +@reportory/components:build: dist/node_modules/lodash/hasIn.js 0.22 kB β”‚ gzip: 0.18 kB β”‚ map: 1.16 kB +@reportory/components:build: dist/node_modules/lodash/_listCacheGet.js 0.22 kB β”‚ gzip: 0.20 kB β”‚ map: 0.86 kB +@reportory/components:build: dist/node_modules/lodash/_baseFindIndex.js 0.22 kB β”‚ gzip: 0.19 kB β”‚ map: 1.28 kB +@reportory/components:build: dist/node_modules/lodash/first.js 0.22 kB β”‚ gzip: 0.19 kB β”‚ map: 0.24 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/labelGrid.js 0.22 kB β”‚ gzip: 0.19 kB β”‚ map: 1.24 kB +@reportory/components:build: dist/node_modules/lodash/_assocIndexOf.js 0.22 kB β”‚ gzip: 0.19 kB β”‚ map: 0.93 kB +@reportory/components:build: dist/node_modules/lodash/isNil.js 0.23 kB β”‚ gzip: 0.20 kB β”‚ map: 0.70 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-direction/dist/index.js 0.23 kB β”‚ gzip: 0.19 kB β”‚ map: 1.00 kB +@reportory/components:build: dist/node_modules/lodash/_baseSome.js 0.23 kB β”‚ gzip: 0.18 kB β”‚ map: 1.12 kB +@reportory/components:build: dist/node_modules/lodash/_root.js 0.23 kB β”‚ gzip: 0.19 kB β”‚ map: 0.64 kB +@reportory/components:build: dist/node_modules/date-fns/startOfDay.js 0.23 kB β”‚ gzip: 0.19 kB β”‚ map: 1.51 kB +@reportory/components:build: dist/node_modules/date-fns/_lib/normalizeInterval.js 0.23 kB β”‚ gzip: 0.18 kB β”‚ map: 0.63 kB +@reportory/components:build: dist/node_modules/lodash/_baseEvery.js 0.23 kB β”‚ gzip: 0.18 kB β”‚ map: 1.13 kB +@reportory/components:build: dist/node_modules/lodash/isArrayLike.js 0.23 kB β”‚ gzip: 0.18 kB β”‚ map: 1.26 kB +@reportory/components:build: dist/node_modules/lodash/_castSlice.js 0.23 kB β”‚ gzip: 0.19 kB β”‚ map: 0.98 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/data-table-filter/hooks/use-unmount.js 0.24 kB β”‚ gzip: 0.19 kB β”‚ map: 0.62 kB +@reportory/components:build: dist/node_modules/lodash/_arrayFilter.js 0.24 kB β”‚ gzip: 0.20 kB β”‚ map: 1.19 kB +@reportory/components:build: dist/node_modules/lodash/_getMapData.js 0.24 kB β”‚ gzip: 0.20 kB β”‚ map: 0.83 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/utils/filters.js 0.24 kB β”‚ gzip: 0.19 kB β”‚ map: 0.64 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/formatters/formatCaption.js 0.24 kB β”‚ gzip: 0.19 kB β”‚ map: 1.28 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/formatters/formatYearDropdown.js 0.24 kB β”‚ gzip: 0.19 kB β”‚ map: 1.09 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/startOfBroadcastWeek.js 0.24 kB β”‚ gzip: 0.19 kB β”‚ map: 1.41 kB +@reportory/components:build: dist/node_modules/date-fns/locale/_lib/buildFormatLongFn.js 0.24 kB β”‚ gzip: 0.18 kB β”‚ map: 0.71 kB +@reportory/components:build: dist/node_modules/lodash/_defineProperty.js 0.24 kB β”‚ gzip: 0.20 kB β”‚ map: 0.66 kB +@reportory/components:build: dist/node_modules/date-fns/isValid.js 0.24 kB β”‚ gzip: 0.19 kB β”‚ map: 1.38 kB +@reportory/components:build: dist/node_modules/lodash/_getNative.js 0.24 kB β”‚ gzip: 0.19 kB β”‚ map: 0.92 kB +@reportory/components:build: dist/node_modules/lodash/_mapCacheSet.js 0.24 kB β”‚ gzip: 0.20 kB β”‚ map: 0.97 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/payload/getUniqPayload.js 0.25 kB β”‚ gzip: 0.18 kB β”‚ map: 0.98 kB +@reportory/components:build: dist/node_modules/lodash/range.js 0.25 kB β”‚ gzip: 0.20 kB β”‚ map: 1.46 kB +@reportory/components:build: dist/node_modules/lodash/_baseGetAllKeys.js 0.25 kB β”‚ gzip: 0.20 kB β”‚ map: 1.25 kB +@reportory/components:build: dist/node_modules/date-fns/startOfMonth.js 0.25 kB β”‚ gzip: 0.20 kB β”‚ map: 1.60 kB +@reportory/components:build: dist/node_modules/lodash/_toKey.js 0.25 kB β”‚ gzip: 0.20 kB β”‚ map: 0.95 kB +@reportory/components:build: dist/node_modules/lodash/_baseRange.js 0.25 kB β”‚ gzip: 0.21 kB β”‚ map: 1.43 kB +@reportory/components:build: dist/node_modules/date-fns/_lib/normalizeDates.js 0.25 kB β”‚ gzip: 0.20 kB β”‚ map: 0.68 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/YearsDropdown.js 0.25 kB β”‚ gzip: 0.20 kB β”‚ map: 0.83 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getDays.js 0.25 kB β”‚ gzip: 0.18 kB β”‚ map: 1.20 kB +@reportory/components:build: dist/node_modules/lodash/_memoizeCapped.js 0.25 kB β”‚ gzip: 0.20 kB β”‚ map: 1.15 kB +@reportory/components:build: dist/node_modules/d3-scale/src/nice.js 0.25 kB β”‚ gzip: 0.20 kB β”‚ map: 0.91 kB +@reportory/components:build: dist/node_modules/lodash/_baseIsArguments.js 0.25 kB β”‚ gzip: 0.20 kB β”‚ map: 0.93 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/MonthsDropdown.js 0.26 kB β”‚ gzip: 0.20 kB β”‚ map: 0.84 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/NextMonthButton.js 0.26 kB β”‚ gzip: 0.20 kB β”‚ map: 0.84 kB +@reportory/components:build: dist/node_modules/d3-color/src/define.js 0.26 kB β”‚ gzip: 0.20 kB β”‚ map: 0.84 kB +@reportory/components:build: dist/node_modules/lodash/_listCacheSet.js 0.26 kB β”‚ gzip: 0.22 kB β”‚ map: 1.07 kB +@reportory/components:build: dist/node_modules/lodash/_hashHas.js 0.26 kB β”‚ gzip: 0.22 kB β”‚ map: 1.09 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/labelGridcell.js 0.26 kB β”‚ gzip: 0.21 kB β”‚ map: 1.26 kB +@reportory/components:build: dist/node_modules/d3-shape/src/symbol/triangle.js 0.26 kB β”‚ gzip: 0.20 kB β”‚ map: 0.80 kB +@reportory/components:build: dist/node_modules/react-style-singleton/dist/es2015/component.js 0.26 kB β”‚ gzip: 0.20 kB β”‚ map: 1.07 kB +@reportory/components:build: dist/node_modules/lodash/_getAllKeys.js 0.26 kB β”‚ gzip: 0.19 kB β”‚ map: 0.88 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/PreviousMonthButton.js 0.26 kB β”‚ gzip: 0.20 kB β”‚ map: 0.86 kB +@reportory/components:build: dist/node_modules/@radix-ui/primitive/dist/index.js 0.27 kB β”‚ gzip: 0.21 kB β”‚ map: 2.14 kB +@reportory/components:build: dist/node_modules/lodash/isSymbol.js 0.27 kB β”‚ gzip: 0.21 kB β”‚ map: 1.13 kB +@reportory/components:build: dist/node_modules/lodash/keys.js 0.27 kB β”‚ gzip: 0.19 kB β”‚ map: 1.34 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getWeekdays.js 0.27 kB β”‚ gzip: 0.21 kB β”‚ map: 1.59 kB +@reportory/components:build: dist/node_modules/lodash/_isIndex.js 0.27 kB β”‚ gzip: 0.23 kB β”‚ map: 1.26 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/formatters/formatWeekNumber.js 0.27 kB β”‚ gzip: 0.20 kB β”‚ map: 1.20 kB +@reportory/components:build: dist/node_modules/lodash/upperFirst.js 0.27 kB β”‚ gzip: 0.22 kB β”‚ map: 0.78 kB +@reportory/components:build: dist/node_modules/lodash/isTypedArray.js 0.27 kB β”‚ gzip: 0.18 kB β”‚ map: 1.15 kB +@reportory/components:build: dist/node_modules/date-fns/startOfYear.js 0.27 kB β”‚ gzip: 0.21 kB β”‚ map: 1.62 kB +@reportory/components:build: dist/node_modules/react-remove-scroll/dist/es2015/sidecar.js 0.27 kB β”‚ gzip: 0.19 kB β”‚ map: 0.50 kB +@reportory/components:build: dist/node_modules/lodash/last.js 0.27 kB β”‚ gzip: 0.23 kB β”‚ map: 0.74 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js 0.27 kB β”‚ gzip: 0.20 kB β”‚ map: 1.39 kB +@reportory/components:build: dist/node_modules/lodash/_baseRest.js 0.27 kB β”‚ gzip: 0.20 kB β”‚ map: 1.01 kB +@reportory/components:build: dist/node_modules/lodash/_toSource.js 0.27 kB β”‚ gzip: 0.18 kB β”‚ map: 1.05 kB +@reportory/components:build: dist/node_modules/lodash/isNaN.js 0.28 kB β”‚ gzip: 0.23 kB β”‚ map: 1.27 kB +@reportory/components:build: dist/node_modules/date-fns/locale/en-US/_lib/formatRelative.js 0.28 kB β”‚ gzip: 0.19 kB β”‚ map: 0.78 kB +@reportory/components:build: dist/node_modules/d3-time/src/duration.js 0.28 kB β”‚ gzip: 0.19 kB β”‚ map: 0.70 kB +@reportory/components:build: dist/node_modules/date-fns/endOfYear.js 0.28 kB β”‚ gzip: 0.22 kB β”‚ map: 1.66 kB +@reportory/components:build: dist/node_modules/d3-shape/src/symbol/diamond.js 0.28 kB β”‚ gzip: 0.21 kB β”‚ map: 0.90 kB +@reportory/components:build: dist/node_modules/lodash/_stringToArray.js 0.28 kB β”‚ gzip: 0.19 kB β”‚ map: 0.92 kB +@reportory/components:build: dist/node_modules/lodash/isEqual.js 0.28 kB β”‚ gzip: 0.22 kB β”‚ map: 1.35 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getDisplayMonths.js 0.28 kB β”‚ gzip: 0.21 kB β”‚ map: 1.49 kB +@reportory/components:build: dist/node_modules/lodash/_baseAssignValue.js 0.29 kB β”‚ gzip: 0.22 kB β”‚ map: 1.15 kB +@reportory/components:build: dist/node_modules/d3-format/src/defaultLocale.js 0.29 kB β”‚ gzip: 0.22 kB β”‚ map: 0.85 kB +@reportory/components:build: dist/node_modules/lodash/_hashSet.js 0.29 kB β”‚ gzip: 0.23 kB β”‚ map: 1.08 kB +@reportory/components:build: dist/node_modules/date-fns/isSameYear.js 0.29 kB β”‚ gzip: 0.22 kB β”‚ map: 1.41 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/checkbox-field.js 0.29 kB β”‚ gzip: 0.19 kB β”‚ map: 2.78 kB +@reportory/components:build: dist/node_modules/d3-shape/src/offset/none.js 0.29 kB β”‚ gzip: 0.21 kB β”‚ map: 0.97 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getBroadcastWeeksInMonth.js 0.29 kB β”‚ gzip: 0.21 kB β”‚ map: 1.85 kB +@reportory/components:build: dist/node_modules/lodash/_isMasked.js 0.29 kB β”‚ gzip: 0.24 kB β”‚ map: 1.04 kB +@reportory/components:build: dist/node_modules/lodash/_createBaseFor.js 0.29 kB β”‚ gzip: 0.22 kB β”‚ map: 1.27 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/utils/index.js 0.29 kB β”‚ gzip: 0.20 kB β”‚ map: 0.72 kB +@reportory/components:build: dist/node_modules/lodash/find.js 0.29 kB β”‚ gzip: 0.22 kB β”‚ map: 1.64 kB +@reportory/components:build: dist/node_modules/date-fns/endOfMonth.js 0.30 kB β”‚ gzip: 0.23 kB β”‚ map: 1.71 kB +@reportory/components:build: dist/node_modules/lodash/isObject.js 0.30 kB β”‚ gzip: 0.24 kB β”‚ map: 1.08 kB +@reportory/components:build: dist/node_modules/lodash/_hasUnicode.js 0.30 kB β”‚ gzip: 0.22 kB β”‚ map: 1.58 kB +@reportory/components:build: dist/node_modules/lodash/_createSet.js 0.30 kB β”‚ gzip: 0.22 kB β”‚ map: 1.01 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-use-previous/dist/index.js 0.30 kB β”‚ gzip: 0.21 kB β”‚ map: 0.91 kB +@reportory/components:build: dist/node_modules/d3-array/src/range.js 0.30 kB β”‚ gzip: 0.24 kB β”‚ map: 0.91 kB +@reportory/components:build: dist/node_modules/lodash/_baseIndexOf.js 0.30 kB β”‚ gzip: 0.20 kB β”‚ map: 1.18 kB +@reportory/components:build: dist/node_modules/react-remove-scroll-bar/dist/es2015/constants.js 0.30 kB β”‚ gzip: 0.21 kB β”‚ map: 0.74 kB +@reportory/components:build: dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js 0.30 kB β”‚ gzip: 0.23 kB β”‚ map: 1.00 kB +@reportory/components:build: dist/node_modules/date-fns/setYear.js 0.30 kB β”‚ gzip: 0.22 kB β”‚ map: 1.77 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-use-callback-ref/dist/index.js 0.31 kB β”‚ gzip: 0.23 kB β”‚ map: 0.89 kB +@reportory/components:build: dist/node_modules/lodash/_getMatchData.js 0.31 kB β”‚ gzip: 0.23 kB β”‚ map: 1.17 kB +@reportory/components:build: dist/node_modules/lodash/_baseSlice.js 0.31 kB β”‚ gzip: 0.23 kB β”‚ map: 1.39 kB +@reportory/components:build: dist/node_modules/lodash/_baseMap.js 0.31 kB β”‚ gzip: 0.23 kB β”‚ map: 1.26 kB +@reportory/components:build: dist/node_modules/lodash/_baseGet.js 0.31 kB β”‚ gzip: 0.24 kB β”‚ map: 1.17 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/labelDayButton.js 0.32 kB β”‚ gzip: 0.23 kB β”‚ map: 1.63 kB +@reportory/components:build: dist/node_modules/date-fns/constructFrom.js 0.32 kB β”‚ gzip: 0.22 kB β”‚ map: 2.38 kB +@reportory/components:build: dist/node_modules/date-fns/isSameDay.js 0.32 kB β”‚ gzip: 0.23 kB β”‚ map: 1.88 kB +@reportory/components:build: dist/node_modules/date-fns/addDays.js 0.32 kB β”‚ gzip: 0.23 kB β”‚ map: 1.85 kB +@reportory/components:build: dist/node_modules/lodash/_isFlattenable.js 0.32 kB β”‚ gzip: 0.23 kB β”‚ map: 1.14 kB +@reportory/components:build: dist/node_modules/lodash/property.js 0.32 kB β”‚ gzip: 0.20 kB β”‚ map: 1.30 kB +@reportory/components:build: dist/node_modules/lodash/_apply.js 0.32 kB β”‚ gzip: 0.19 kB β”‚ map: 1.33 kB +@reportory/components:build: dist/node_modules/lodash/_baseIsEqual.js 0.32 kB β”‚ gzip: 0.23 kB β”‚ map: 1.63 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/radio-group.js 0.32 kB β”‚ gzip: 0.21 kB β”‚ map: 1.53 kB +@reportory/components:build: dist/node_modules/date-fns/isSameMonth.js 0.32 kB β”‚ gzip: 0.23 kB β”‚ map: 1.74 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/endOfBroadcastWeek.js 0.32 kB β”‚ gzip: 0.21 kB β”‚ map: 1.34 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/utils/rangeOverlaps.js 0.32 kB β”‚ gzip: 0.21 kB β”‚ map: 1.36 kB +@reportory/components:build: dist/node_modules/lodash/_baseExtremum.js 0.32 kB β”‚ gzip: 0.25 kB β”‚ map: 1.57 kB +@reportory/components:build: dist/node_modules/lodash/_castPath.js 0.33 kB β”‚ gzip: 0.22 kB β”‚ map: 1.10 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/useDayPicker.js 0.33 kB β”‚ gzip: 0.23 kB β”‚ map: 1.32 kB +@reportory/components:build: dist/node_modules/lodash/flatMap.js 0.33 kB β”‚ gzip: 0.24 kB β”‚ map: 1.23 kB +@reportory/components:build: dist/node_modules/d3-time/src/second.js 0.33 kB β”‚ gzip: 0.22 kB β”‚ map: 0.90 kB +@reportory/components:build: dist/node_modules/d3-shape/src/offset/silhouette.js 0.33 kB β”‚ gzip: 0.24 kB β”‚ map: 0.99 kB +@reportory/components:build: dist/node_modules/lodash/map.js 0.33 kB β”‚ gzip: 0.21 kB β”‚ map: 2.17 kB +@reportory/components:build: dist/node_modules/lodash/toFinite.js 0.33 kB β”‚ gzip: 0.24 kB β”‚ map: 1.45 kB +@reportory/components:build: dist/node_modules/@date-fns/tz/tzName/index.js 0.33 kB β”‚ gzip: 0.26 kB β”‚ map: 1.98 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/calculateViewBox.js 0.33 kB β”‚ gzip: 0.22 kB β”‚ map: 1.14 kB +@reportory/components:build: dist/node_modules/d3-shape/src/offset/expand.js 0.33 kB β”‚ gzip: 0.23 kB β”‚ map: 0.98 kB +@reportory/components:build: dist/node_modules/lodash/_mapCacheClear.js 0.33 kB β”‚ gzip: 0.22 kB β”‚ map: 0.89 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/DayButton.js 0.33 kB β”‚ gzip: 0.25 kB β”‚ map: 1.11 kB +@reportory/components:build: dist/node_modules/react-is/index.js 0.34 kB β”‚ gzip: 0.22 kB β”‚ map: 0.48 kB +@reportory/components:build: dist/node_modules/lodash/_listCacheDelete.js 0.34 kB β”‚ gzip: 0.26 kB β”‚ map: 1.41 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/ShallowEqual.js 0.34 kB β”‚ gzip: 0.20 kB β”‚ map: 0.92 kB +@reportory/components:build: dist/node_modules/react-style-singleton/dist/es2015/hook.js 0.34 kB β”‚ gzip: 0.23 kB β”‚ map: 1.15 kB +@reportory/components:build: dist/node_modules/lodash/_shortOut.js 0.34 kB β”‚ gzip: 0.24 kB β”‚ map: 1.57 kB +@reportory/components:build: dist/node_modules/lodash/get.js 0.34 kB β”‚ gzip: 0.26 kB β”‚ map: 1.31 kB +@reportory/components:build: dist/node_modules/lodash/_hashGet.js 0.35 kB β”‚ gzip: 0.27 kB β”‚ map: 1.37 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getStyleForModifiers.js 0.35 kB β”‚ gzip: 0.26 kB β”‚ map: 1.53 kB +@reportory/components:build: dist/node_modules/date-fns/getDayOfYear.js 0.36 kB β”‚ gzip: 0.23 kB β”‚ map: 1.33 kB +@reportory/components:build: dist/node_modules/lodash/uniqBy.js 0.36 kB β”‚ gzip: 0.26 kB β”‚ map: 1.45 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js 0.36 kB β”‚ gzip: 0.25 kB β”‚ map: 1.71 kB +@reportory/components:build: dist/node_modules/lodash/_baseSetToString.js 0.36 kB β”‚ gzip: 0.25 kB β”‚ map: 1.21 kB +@reportory/components:build: dist/node_modules/react-remove-scroll/dist/es2015/Combination.js 0.37 kB β”‚ gzip: 0.26 kB β”‚ map: 0.85 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getNextMonth.js 0.37 kB β”‚ gzip: 0.25 kB β”‚ map: 2.20 kB +@reportory/components:build: dist/_virtual/_commonjsHelpers.js 0.37 kB β”‚ gzip: 0.25 kB β”‚ map: 0.10 kB +@reportory/components:build: dist/node_modules/date-fns/differenceInCalendarMonths.js 0.37 kB β”‚ gzip: 0.25 kB β”‚ map: 1.81 kB +@reportory/components:build: dist/node_modules/react-smooth/es6/setRafTimeout.js 0.37 kB β”‚ gzip: 0.25 kB β”‚ map: 1.22 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getClassNamesForModifiers.js 0.37 kB β”‚ gzip: 0.27 kB β”‚ map: 2.05 kB +@reportory/components:build: dist/node_modules/d3-format/src/formatGroup.js 0.37 kB β”‚ gzip: 0.27 kB β”‚ map: 1.16 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/piecewise.js 0.37 kB β”‚ gzip: 0.27 kB β”‚ map: 1.10 kB +@reportory/components:build: dist/node_modules/lodash/_baseKeys.js 0.37 kB β”‚ gzip: 0.26 kB β”‚ map: 1.40 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/numberArray.js 0.38 kB β”‚ gzip: 0.27 kB β”‚ map: 0.96 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-id/dist/index.js 0.38 kB β”‚ gzip: 0.28 kB β”‚ map: 1.14 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getPreviousMonth.js 0.38 kB β”‚ gzip: 0.25 kB β”‚ map: 2.24 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/object.js 0.38 kB β”‚ gzip: 0.25 kB β”‚ map: 1.05 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getFormatters.js 0.38 kB β”‚ gzip: 0.21 kB β”‚ map: 1.31 kB +@reportory/components:build: dist/node_modules/lodash/_getSymbols.js 0.38 kB β”‚ gzip: 0.27 kB β”‚ map: 1.52 kB +@reportory/components:build: dist/node_modules/lodash/_createBaseEach.js 0.38 kB β”‚ gzip: 0.27 kB β”‚ map: 1.59 kB +@reportory/components:build: dist/node_modules/d3-format/src/formatRounded.js 0.38 kB β”‚ gzip: 0.27 kB β”‚ map: 1.13 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/select.js 0.38 kB β”‚ gzip: 0.27 kB β”‚ map: 10.08 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/data-table/data-table-schema.js 0.38 kB β”‚ gzip: 0.25 kB β”‚ map: 1.34 kB +@reportory/components:build: dist/node_modules/date-fns/getDaysInMonth.js 0.39 kB β”‚ gzip: 0.25 kB β”‚ map: 1.63 kB +@reportory/components:build: dist/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js 0.39 kB β”‚ gzip: 0.26 kB β”‚ map: 1.16 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js 0.39 kB β”‚ gzip: 0.24 kB β”‚ map: 1.15 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/array.js 0.39 kB β”‚ gzip: 0.25 kB β”‚ map: 1.29 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js 0.39 kB β”‚ gzip: 0.25 kB β”‚ map: 1.43 kB +@reportory/components:build: dist/node_modules/lodash/_baseMatches.js 0.39 kB β”‚ gzip: 0.26 kB β”‚ map: 1.37 kB +@reportory/components:build: dist/node_modules/lodash/isBoolean.js 0.39 kB β”‚ gzip: 0.28 kB β”‚ map: 1.14 kB +@reportory/components:build: dist/node_modules/lodash/_getRawTag.js 0.39 kB β”‚ gzip: 0.28 kB β”‚ map: 1.92 kB +@reportory/components:build: dist/node_modules/lodash/isNumber.js 0.39 kB β”‚ gzip: 0.29 kB β”‚ map: 1.34 kB +@reportory/components:build: dist/node_modules/date-fns/startOfISOWeekYear.js 0.39 kB β”‚ gzip: 0.24 kB β”‚ map: 2.19 kB +@reportory/components:build: dist/node_modules/lodash/isArguments.js 0.40 kB β”‚ gzip: 0.27 kB β”‚ map: 1.65 kB +@reportory/components:build: dist/charts/utils/chart-tooltip.js 0.40 kB β”‚ gzip: 0.28 kB β”‚ map: 0.76 kB +@reportory/components:build: dist/charts/utils/chart-container.js 0.40 kB β”‚ gzip: 0.28 kB β”‚ map: 0.76 kB +@reportory/components:build: dist/node_modules/lodash/max.js 0.40 kB β”‚ gzip: 0.27 kB β”‚ map: 1.05 kB +@reportory/components:build: dist/node_modules/lodash/min.js 0.40 kB β”‚ gzip: 0.27 kB β”‚ map: 1.05 kB +@reportory/components:build: dist/node_modules/lodash/_baseGetTag.js 0.40 kB β”‚ gzip: 0.27 kB β”‚ map: 1.40 kB +@reportory/components:build: dist/node_modules/prop-types/node_modules/react-is/index.js 0.40 kB β”‚ gzip: 0.25 kB β”‚ map: 0.51 kB +@reportory/components:build: dist/node_modules/date-fns/max.js 0.41 kB β”‚ gzip: 0.28 kB β”‚ map: 2.04 kB +@reportory/components:build: dist/node_modules/date-fns/min.js 0.41 kB β”‚ gzip: 0.28 kB β”‚ map: 2.05 kB +@reportory/components:build: dist/node_modules/lodash/_baseFlatten.js 0.41 kB β”‚ gzip: 0.28 kB β”‚ map: 1.97 kB +@reportory/components:build: dist/node_modules/d3-time/src/millisecond.js 0.41 kB β”‚ gzip: 0.26 kB β”‚ map: 1.36 kB +@reportory/components:build: dist/node_modules/lodash/findIndex.js 0.41 kB β”‚ gzip: 0.27 kB β”‚ map: 2.37 kB +@reportory/components:build: dist/node_modules/lodash/_SetCache.js 0.41 kB β”‚ gzip: 0.27 kB β”‚ map: 1.23 kB +@reportory/components:build: dist/node_modules/lodash/maxBy.js 0.41 kB β”‚ gzip: 0.28 kB β”‚ map: 1.47 kB +@reportory/components:build: dist/node_modules/lodash/minBy.js 0.41 kB β”‚ gzip: 0.28 kB β”‚ map: 1.47 kB +@reportory/components:build: dist/node_modules/d3-shape/src/path.js 0.42 kB β”‚ gzip: 0.28 kB β”‚ map: 0.95 kB +@reportory/components:build: dist/node_modules/date-fns/getWeek.js 0.42 kB β”‚ gzip: 0.25 kB β”‚ map: 2.35 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/utils/rangeIncludesDate.js 0.42 kB β”‚ gzip: 0.28 kB β”‚ map: 2.19 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getInitialMonth.js 0.42 kB β”‚ gzip: 0.28 kB β”‚ map: 1.97 kB +@reportory/components:build: dist/node_modules/d3-shape/src/symbol/cross.js 0.42 kB β”‚ gzip: 0.22 kB β”‚ map: 1.29 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/data-table-filter/lib/helpers.js 0.42 kB β”‚ gzip: 0.29 kB β”‚ map: 2.41 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getMonthOptions.js 0.42 kB β”‚ gzip: 0.29 kB β”‚ map: 2.27 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getDefaultClassNames.js 0.42 kB β”‚ gzip: 0.24 kB β”‚ map: 1.65 kB +@reportory/components:build: dist/node_modules/lodash/_stringToPath.js 0.42 kB β”‚ gzip: 0.33 kB β”‚ map: 1.52 kB +@reportory/components:build: dist/node_modules/d3-format/src/formatTrim.js 0.42 kB β”‚ gzip: 0.25 kB β”‚ map: 1.05 kB +@reportory/components:build: dist/node_modules/lodash/_compareMultiple.js 0.43 kB β”‚ gzip: 0.29 kB β”‚ map: 2.41 kB +@reportory/components:build: dist/node_modules/date-fns/getISOWeek.js 0.43 kB β”‚ gzip: 0.26 kB β”‚ map: 1.73 kB +@reportory/components:build: dist/node_modules/lodash/_isIterateeCall.js 0.43 kB β”‚ gzip: 0.28 kB β”‚ map: 1.55 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getYearOptions.js 0.43 kB β”‚ gzip: 0.29 kB β”‚ map: 2.23 kB +@reportory/components:build: dist/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js 0.44 kB β”‚ gzip: 0.25 kB β”‚ map: 1.63 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/utils/rangeContainsDayOfWeek.js 0.44 kB β”‚ gzip: 0.31 kB β”‚ map: 1.87 kB +@reportory/components:build: dist/node_modules/lodash/isString.js 0.44 kB β”‚ gzip: 0.30 kB β”‚ map: 1.23 kB +@reportory/components:build: dist/node_modules/lodash/_isKey.js 0.44 kB β”‚ gzip: 0.31 kB β”‚ map: 1.52 kB +@reportory/components:build: dist/node_modules/d3-format/src/formatDecimal.js 0.44 kB β”‚ gzip: 0.30 kB β”‚ map: 1.55 kB +@reportory/components:build: dist/node_modules/lodash/_overRest.js 0.45 kB β”‚ gzip: 0.29 kB β”‚ map: 1.93 kB +@reportory/components:build: dist/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js 0.45 kB β”‚ gzip: 0.26 kB β”‚ map: 1.39 kB +@reportory/components:build: dist/node_modules/lodash/_baseIteratee.js 0.45 kB β”‚ gzip: 0.27 kB β”‚ map: 1.55 kB +@reportory/components:build: dist/node_modules/lodash/isBuffer.js 0.46 kB β”‚ gzip: 0.28 kB β”‚ map: 1.72 kB +@reportory/components:build: dist/node_modules/lodash/_createRange.js 0.46 kB β”‚ gzip: 0.29 kB β”‚ map: 1.60 kB +@reportory/components:build: dist/node_modules/lodash/_createCaseFirst.js 0.46 kB β”‚ gzip: 0.29 kB β”‚ map: 1.59 kB +@reportory/components:build: dist/node_modules/lodash/mapValues.js 0.47 kB β”‚ gzip: 0.30 kB β”‚ map: 1.98 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/rgb.js 0.47 kB β”‚ gzip: 0.29 kB β”‚ map: 2.14 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/useSelection.js 0.47 kB β”‚ gzip: 0.24 kB β”‚ map: 1.58 kB +@reportory/components:build: dist/node_modules/date-fns/setMonth.js 0.47 kB β”‚ gzip: 0.29 kB β”‚ map: 2.21 kB +@reportory/components:build: dist/node_modules/d3-array/src/sort.js 0.48 kB β”‚ gzip: 0.30 kB β”‚ map: 1.95 kB +@reportory/components:build: dist/node_modules/lodash/_createFind.js 0.48 kB β”‚ gzip: 0.30 kB β”‚ map: 1.68 kB +@reportory/components:build: dist/node_modules/d3-shape/src/curve/linearClosed.js 0.49 kB β”‚ gzip: 0.27 kB β”‚ map: 1.24 kB +@reportory/components:build: dist/node_modules/lodash/_stackSet.js 0.49 kB β”‚ gzip: 0.29 kB β”‚ map: 1.60 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-use-escape-keydown/dist/index.js 0.49 kB β”‚ gzip: 0.32 kB β”‚ map: 1.43 kB +@reportory/components:build: dist/node_modules/attr-accept/dist/es/index.js 0.50 kB β”‚ gzip: 0.31 kB β”‚ map: 1.69 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/selection/useSingle.js 0.51 kB β”‚ gzip: 0.32 kB β”‚ map: 2.52 kB +@reportory/components:build: dist/node_modules/date-fns/addMonths.js 0.51 kB β”‚ gzip: 0.31 kB β”‚ map: 3.93 kB +@reportory/components:build: dist/node_modules/d3-format/src/formatPrefixAuto.js 0.52 kB β”‚ gzip: 0.34 kB β”‚ map: 1.49 kB +@reportory/components:build: dist/node_modules/lodash/_compareAscending.js 0.52 kB β”‚ gzip: 0.30 kB β”‚ map: 2.35 kB +@reportory/components:build: dist/node_modules/lodash/isFunction.js 0.52 kB β”‚ gzip: 0.33 kB β”‚ map: 1.58 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/color.js 0.52 kB β”‚ gzip: 0.28 kB β”‚ map: 1.59 kB +@reportory/components:build: dist/node_modules/d3-shape/src/symbol/star.js 0.53 kB β”‚ gzip: 0.34 kB β”‚ map: 1.52 kB +@reportory/components:build: dist/node_modules/use-callback-ref/dist/es2015/useRef.js 0.53 kB β”‚ gzip: 0.29 kB β”‚ map: 1.90 kB +@reportory/components:build: dist/node_modules/lodash/some.js 0.53 kB β”‚ gzip: 0.32 kB β”‚ map: 2.27 kB +@reportory/components:build: dist/node_modules/lodash/_baseToString.js 0.53 kB β”‚ gzip: 0.30 kB β”‚ map: 1.92 kB +@reportory/components:build: dist/node_modules/use-sidecar/dist/es2015/exports.js 0.53 kB β”‚ gzip: 0.34 kB β”‚ map: 1.27 kB +@reportory/components:build: dist/node_modules/d3-time/src/minute.js 0.54 kB β”‚ gzip: 0.27 kB β”‚ map: 1.56 kB +@reportory/components:build: dist/node_modules/lodash/_nodeUtil.js 0.54 kB β”‚ gzip: 0.31 kB β”‚ map: 1.67 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/label.js 0.54 kB β”‚ gzip: 0.35 kB β”‚ map: 0.96 kB +@reportory/components:build: dist/node_modules/date-fns/eachMonthOfInterval.js 0.54 kB β”‚ gzip: 0.34 kB β”‚ map: 2.77 kB +@reportory/components:build: dist/node_modules/lodash/every.js 0.54 kB β”‚ gzip: 0.32 kB β”‚ map: 2.54 kB +@reportory/components:build: dist/node_modules/lodash/_Stack.js 0.55 kB β”‚ gzip: 0.28 kB β”‚ map: 1.42 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getNextFocus.js 0.55 kB β”‚ gzip: 0.31 kB β”‚ map: 2.93 kB +@reportory/components:build: dist/node_modules/date-fns/eachYearOfInterval.js 0.55 kB β”‚ gzip: 0.34 kB β”‚ map: 2.93 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getDataAttributes.js 0.55 kB β”‚ gzip: 0.32 kB β”‚ map: 1.73 kB +@reportory/components:build: dist/node_modules/d3-scale/src/identity.js 0.56 kB β”‚ gzip: 0.31 kB β”‚ map: 1.43 kB +@reportory/components:build: dist/node_modules/recharts/es6/chart/LineChart.js 0.56 kB β”‚ gzip: 0.28 kB β”‚ map: 1.04 kB +@reportory/components:build: dist/node_modules/recharts/es6/chart/AreaChart.js 0.56 kB β”‚ gzip: 0.28 kB β”‚ map: 1.04 kB +@reportory/components:build: dist/node_modules/lodash/_Hash.js 0.56 kB β”‚ gzip: 0.30 kB β”‚ map: 1.52 kB +@reportory/components:build: dist/node_modules/date-fns/differenceInCalendarDays.js 0.56 kB β”‚ gzip: 0.32 kB β”‚ map: 2.93 kB +@reportory/components:build: dist/node_modules/d3-time/src/hour.js 0.57 kB β”‚ gzip: 0.28 kB β”‚ map: 1.62 kB +@reportory/components:build: dist/node_modules/date-fns/locale/en-US.js 0.57 kB β”‚ gzip: 0.28 kB β”‚ map: 1.32 kB +@reportory/components:build: dist/node_modules/d3-format/src/formatTypes.js 0.57 kB β”‚ gzip: 0.30 kB β”‚ map: 1.54 kB +@reportory/components:build: dist/node_modules/prop-types/index.js 0.58 kB β”‚ gzip: 0.34 kB β”‚ map: 1.15 kB +@reportory/components:build: dist/node_modules/lodash/sortBy.js 0.58 kB β”‚ gzip: 0.36 kB β”‚ map: 2.45 kB +@reportory/components:build: dist/node_modules/lodash/throttle.js 0.58 kB β”‚ gzip: 0.37 kB β”‚ map: 3.46 kB +@reportory/components:build: dist/node_modules/d3-shape/src/symbol/wye.js 0.58 kB β”‚ gzip: 0.32 kB β”‚ map: 1.80 kB +@reportory/components:build: dist/node_modules/lodash/_MapCache.js 0.59 kB β”‚ gzip: 0.31 kB β”‚ map: 1.68 kB +@reportory/components:build: dist/node_modules/date-fns/getISOWeekYear.js 0.59 kB β”‚ gzip: 0.31 kB β”‚ map: 2.55 kB +@reportory/components:build: dist/node_modules/lodash/_ListCache.js 0.59 kB β”‚ gzip: 0.31 kB β”‚ map: 1.69 kB +@reportory/components:build: dist/node_modules/d3-scale/src/init.js 0.60 kB β”‚ gzip: 0.25 kB β”‚ map: 1.40 kB +@reportory/components:build: dist/node_modules/lodash/_baseMatchesProperty.js 0.60 kB β”‚ gzip: 0.33 kB β”‚ map: 2.08 kB +@reportory/components:build: dist/node_modules/d3-time/src/month.js 0.61 kB β”‚ gzip: 0.28 kB β”‚ map: 1.67 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-arrow/dist/index.js 0.63 kB β”‚ gzip: 0.40 kB β”‚ map: 1.47 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-compose-refs/dist/index.js 0.63 kB β”‚ gzip: 0.34 kB β”‚ map: 1.97 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/data-table-filter/hooks/use-debounce-callback.js 0.63 kB β”‚ gzip: 0.35 kB β”‚ map: 1.37 kB +@reportory/components:build: dist/node_modules/@date-fns/tz/tzOffset/index.js 0.63 kB β”‚ gzip: 0.39 kB β”‚ map: 2.78 kB +@reportory/components:build: dist/node_modules/recharts/es6/chart/BarChart.js 0.64 kB β”‚ gzip: 0.31 kB β”‚ map: 1.16 kB +@reportory/components:build: dist/node_modules/d3-shape/src/offset/wiggle.js 0.64 kB β”‚ gzip: 0.35 kB β”‚ map: 1.95 kB +@reportory/components:build: dist/node_modules/lodash/_hasPath.js 0.64 kB β”‚ gzip: 0.37 kB β”‚ map: 2.05 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/utils/typeguards.js 0.65 kB β”‚ gzip: 0.26 kB β”‚ map: 2.96 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getFocusableDate.js 0.65 kB β”‚ gzip: 0.38 kB β”‚ map: 3.21 kB +@reportory/components:build: dist/node_modules/lodash/_baseIsNative.js 0.65 kB β”‚ gzip: 0.41 kB β”‚ map: 2.34 kB +@reportory/components:build: dist/node_modules/date-fns/locale/_lib/buildLocalizeFn.js 0.65 kB β”‚ gzip: 0.32 kB β”‚ map: 2.71 kB +@reportory/components:build: dist/node_modules/lodash/toNumber.js 0.66 kB β”‚ gzip: 0.39 kB β”‚ map: 2.53 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/classes/CalendarDay.js 0.66 kB β”‚ gzip: 0.37 kB β”‚ map: 1.68 kB +@reportory/components:build: dist/node_modules/lodash/memoize.js 0.66 kB β”‚ gzip: 0.41 kB β”‚ map: 3.08 kB +@reportory/components:build: dist/node_modules/date-fns/startOfWeek.js 0.66 kB β”‚ gzip: 0.34 kB β”‚ map: 2.61 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-portal/dist/index.js 0.67 kB β”‚ gzip: 0.41 kB β”‚ map: 1.63 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/LogUtils.js 0.67 kB β”‚ gzip: 0.41 kB β”‚ map: 1.55 kB +@reportory/components:build: dist/node_modules/date-fns/endOfWeek.js 0.67 kB β”‚ gzip: 0.35 kB β”‚ map: 2.61 kB +@reportory/components:build: dist/node_modules/date-fns/_lib/protectedTokens.js 0.68 kB β”‚ gzip: 0.41 kB β”‚ map: 1.77 kB +@reportory/components:build: dist/node_modules/date-fns/locale/en-US/_lib/formatLong.js 0.68 kB β”‚ gzip: 0.31 kB β”‚ map: 1.58 kB +@reportory/components:build: dist/node_modules/lodash/_unicodeToArray.js 0.69 kB β”‚ gzip: 0.38 kB β”‚ map: 2.79 kB +@reportory/components:build: dist/node_modules/lodash/isPlainObject.js 0.70 kB β”‚ gzip: 0.42 kB β”‚ map: 2.55 kB +@reportory/components:build: dist/node_modules/use-callback-ref/dist/es2015/useMergeRef.js 0.71 kB β”‚ gzip: 0.38 kB β”‚ map: 2.90 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getNavMonth.js 0.72 kB β”‚ gzip: 0.38 kB β”‚ map: 3.00 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/value.js 0.72 kB β”‚ gzip: 0.37 kB β”‚ map: 1.54 kB +@reportory/components:build: dist/node_modules/d3-scale/src/symlog.js 0.73 kB β”‚ gzip: 0.35 kB β”‚ map: 1.87 kB +@reportory/components:build: dist/node_modules/d3-time-format/src/defaultLocale.js 0.73 kB β”‚ gzip: 0.39 kB β”‚ map: 1.77 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/data-table-filter/components/filter-actions.js 0.73 kB β”‚ gzip: 0.42 kB β”‚ map: 1.45 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js 0.73 kB β”‚ gzip: 0.41 kB β”‚ map: 2.35 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-focus-guards/dist/index.js 0.73 kB β”‚ gzip: 0.40 kB β”‚ map: 1.97 kB +@reportory/components:build: dist/node_modules/lodash/_baseIsMatch.js 0.74 kB β”‚ gzip: 0.41 kB β”‚ map: 3.07 kB +@reportory/components:build: dist/node_modules/react-remove-scroll-bar/dist/es2015/utils.js 0.74 kB β”‚ gzip: 0.40 kB β”‚ map: 2.08 kB +@reportory/components:build: dist/node_modules/d3-time/src/day.js 0.74 kB β”‚ gzip: 0.33 kB β”‚ map: 2.09 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js 0.74 kB β”‚ gzip: 0.43 kB β”‚ map: 3.01 kB +@reportory/components:build: dist/node_modules/recharts/es6/chart/RadarChart.js 0.75 kB β”‚ gzip: 0.37 kB β”‚ map: 1.41 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/debounced-input.js 0.76 kB β”‚ gzip: 0.44 kB β”‚ map: 1.55 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/useFocus.js 0.76 kB β”‚ gzip: 0.43 kB β”‚ map: 3.24 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/formatters/index.js 0.77 kB β”‚ gzip: 0.27 kB β”‚ map: 0.10 kB +@reportory/components:build: dist/node_modules/d3-shape/src/curve/linear.js 0.79 kB β”‚ gzip: 0.33 kB β”‚ map: 1.68 kB +@reportory/components:build: dist/node_modules/d3-shape/src/symbol.js 0.79 kB β”‚ gzip: 0.38 kB β”‚ map: 2.92 kB +@reportory/components:build: dist/node_modules/react-style-singleton/dist/es2015/singleton.js 0.80 kB β”‚ gzip: 0.45 kB β”‚ map: 2.36 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/text-input.js 0.80 kB β”‚ gzip: 0.45 kB β”‚ map: 1.28 kB +@reportory/components:build: dist/node_modules/recharts/es6/shape/Dot.js 0.80 kB β”‚ gzip: 0.47 kB β”‚ map: 1.98 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/calculateFocusTarget.js 0.80 kB β”‚ gzip: 0.43 kB β”‚ map: 4.39 kB +@reportory/components:build: dist/node_modules/date-fns/startOfWeekYear.js 0.81 kB β”‚ gzip: 0.36 kB β”‚ map: 3.24 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/textarea.js 0.81 kB β”‚ gzip: 0.46 kB β”‚ map: 1.37 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/selection/useMulti.js 0.82 kB β”‚ gzip: 0.43 kB β”‚ map: 3.34 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-primitive/dist/index.js 0.82 kB β”‚ gzip: 0.49 kB β”‚ map: 2.29 kB +@reportory/components:build: dist/node_modules/recharts-scale/es6/util/arithmetic.js 0.83 kB β”‚ gzip: 0.43 kB β”‚ map: 3.53 kB +@reportory/components:build: dist/node_modules/d3-array/src/quantile.js 0.83 kB β”‚ gzip: 0.39 kB β”‚ map: 3.05 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getDates.js 0.83 kB β”‚ gzip: 0.47 kB β”‚ map: 3.94 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-use-size/dist/index.js 0.84 kB β”‚ gzip: 0.45 kB β”‚ map: 2.39 kB +@reportory/components:build: dist/node_modules/recharts/es6/chart/PieChart.js 0.84 kB β”‚ gzip: 0.41 kB β”‚ map: 1.56 kB +@reportory/components:build: dist/node_modules/d3-scale/src/threshold.js 0.85 kB β”‚ gzip: 0.41 kB β”‚ map: 2.15 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Dropdown.js 0.85 kB β”‚ gzip: 0.44 kB β”‚ map: 2.30 kB +@reportory/components:build: dist/node_modules/d3-scale/src/utcTime.js 0.85 kB β”‚ gzip: 0.36 kB β”‚ map: 1.03 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/badge.js 0.85 kB β”‚ gzip: 0.40 kB β”‚ map: 1.40 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/TickUtils.js 0.86 kB β”‚ gzip: 0.44 kB β”‚ map: 2.63 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/selection/useRange.js 0.86 kB β”‚ gzip: 0.45 kB β”‚ map: 3.09 kB +@reportory/components:build: dist/utils/index.js 0.87 kB β”‚ gzip: 0.44 kB β”‚ map: 2.38 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Chevron.js 0.88 kB β”‚ gzip: 0.46 kB β”‚ map: 1.86 kB +@reportory/components:build: dist/node_modules/recharts/es6/chart/RadialBarChart.js 0.88 kB β”‚ gzip: 0.41 kB β”‚ map: 1.63 kB +@reportory/components:build: dist/layout/collapsible.js 0.89 kB β”‚ gzip: 0.39 kB β”‚ map: 1.82 kB +@reportory/components:build: dist/node_modules/d3-scale/src/ordinal.js 0.89 kB β”‚ gzip: 0.45 kB β”‚ map: 2.30 kB +@reportory/components:build: dist/node_modules/internmap/src/index.js 0.90 kB β”‚ gzip: 0.40 kB β”‚ map: 3.05 kB +@reportory/components:build: dist/node_modules/d3-interpolate/src/string.js 0.90 kB β”‚ gzip: 0.49 kB β”‚ map: 3.29 kB +@reportory/components:build: dist/node_modules/d3-scale/src/pow.js 0.91 kB β”‚ gzip: 0.43 kB β”‚ map: 2.48 kB +@reportory/components:build: dist/node_modules/lodash/_baseOrderBy.js 0.92 kB β”‚ gzip: 0.42 kB β”‚ map: 2.89 kB +@reportory/components:build: dist/node_modules/date-fns/locale/_lib/buildMatchFn.js 0.94 kB β”‚ gzip: 0.46 kB β”‚ map: 2.80 kB +@reportory/components:build: dist/node_modules/d3-array/src/bisector.js 0.96 kB β”‚ gzip: 0.40 kB β”‚ map: 3.08 kB +@reportory/components:build: dist/node_modules/lodash/_baseUniq.js 0.96 kB β”‚ gzip: 0.49 kB β”‚ map: 3.38 kB +@reportory/components:build: dist/node_modules/d3-scale/src/sequentialQuantile.js 1.00 kB β”‚ gzip: 0.47 kB β”‚ map: 2.30 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/labels/index.js 1.00 kB β”‚ gzip: 0.33 kB β”‚ map: 0.10 kB +@reportory/components:build: dist/ui/input.js 1.01 kB β”‚ gzip: 0.54 kB β”‚ map: 1.39 kB +@reportory/components:build: dist/node_modules/date-fns/getWeekYear.js 1.01 kB β”‚ gzip: 0.42 kB β”‚ map: 3.86 kB +@reportory/components:build: dist/node_modules/d3-shape/src/curve/bump.js 1.02 kB β”‚ gzip: 0.41 kB β”‚ map: 3.02 kB +@reportory/components:build: dist/node_modules/lodash/_equalArrays.js 1.03 kB β”‚ gzip: 0.53 kB β”‚ map: 4.42 kB +@reportory/components:build: dist/ui/badge.js 1.03 kB β”‚ gzip: 0.51 kB β”‚ map: 1.73 kB +@reportory/components:build: dist/node_modules/lodash/_getTag.js 1.03 kB β”‚ gzip: 0.48 kB β”‚ map: 3.31 kB +@reportory/components:build: dist/node_modules/lodash/_arrayLikeKeys.js 1.04 kB β”‚ gzip: 0.53 kB β”‚ map: 2.98 kB +@reportory/components:build: dist/node_modules/d3-time/src/year.js 1.04 kB β”‚ gzip: 0.37 kB β”‚ map: 2.96 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/separator.js 1.04 kB β”‚ gzip: 0.55 kB β”‚ map: 2.13 kB +@reportory/components:build: dist/node_modules/d3-scale/src/tickFormat.js 1.06 kB β”‚ gzip: 0.42 kB β”‚ map: 2.33 kB +@reportory/components:build: dist/node_modules/d3-array/src/quickselect.js 1.06 kB β”‚ gzip: 0.55 kB β”‚ map: 3.40 kB +@reportory/components:build: dist/node_modules/lodash/_equalObjects.js 1.08 kB β”‚ gzip: 0.58 kB β”‚ map: 4.86 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/utils/dateMatchModifiers.js 1.08 kB β”‚ gzip: 0.53 kB β”‚ map: 4.07 kB +@reportory/components:build: dist/node_modules/lodash/_baseIsTypedArray.js 1.08 kB β”‚ gzip: 0.47 kB β”‚ map: 3.83 kB +@reportory/components:build: dist/node_modules/d3-shape/src/stack.js 1.10 kB β”‚ gzip: 0.47 kB β”‚ map: 3.02 kB +@reportory/components:build: dist/node_modules/d3-scale/src/quantize.js 1.12 kB β”‚ gzip: 0.55 kB β”‚ map: 2.91 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/popover.js 1.12 kB β”‚ gzip: 0.55 kB β”‚ map: 1.72 kB +@reportory/components:build: dist/node_modules/d3-scale/src/linear.js 1.14 kB β”‚ gzip: 0.53 kB β”‚ map: 3.23 kB +@reportory/components:build: dist/node_modules/d3-shape/src/curve/basisOpen.js 1.15 kB β”‚ gzip: 0.45 kB β”‚ map: 2.34 kB +@reportory/components:build: dist/node_modules/prop-types/factoryWithThrowingShims.js 1.16 kB β”‚ gzip: 0.55 kB β”‚ map: 2.88 kB +@reportory/components:build: dist/node_modules/date-fns/_lib/format/longFormatters.js 1.16 kB β”‚ gzip: 0.37 kB β”‚ map: 3.38 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/utils/addToRange.js 1.17 kB β”‚ gzip: 0.48 kB β”‚ map: 5.17 kB +@reportory/components:build: dist/node_modules/d3-scale/src/radial.js 1.18 kB β”‚ gzip: 0.47 kB β”‚ map: 3.08 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/getMonths.js 1.19 kB β”‚ gzip: 0.57 kB β”‚ map: 4.79 kB +@reportory/components:build: dist/node_modules/d3-time/src/week.js 1.19 kB β”‚ gzip: 0.48 kB β”‚ map: 3.65 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/Nav.js 1.20 kB β”‚ gzip: 0.52 kB β”‚ map: 3.28 kB +@reportory/components:build: dist/node_modules/lodash/_baseIsEqualDeep.js 1.24 kB β”‚ gzip: 0.57 kB β”‚ map: 5.01 kB +@reportory/components:build: dist/ui/right-floating-sidebar.js 1.25 kB β”‚ gzip: 0.61 kB β”‚ map: 3.42 kB +@reportory/components:build: dist/node_modules/d3-scale/src/quantile.js 1.25 kB β”‚ gzip: 0.58 kB β”‚ map: 3.07 kB +@reportory/components:build: dist/node_modules/date-fns/_lib/format/lightFormatters.js 1.26 kB β”‚ gzip: 0.52 kB β”‚ map: 4.73 kB +@reportory/components:build: dist/node_modules/recharts/es6/container/Layer.js 1.27 kB β”‚ gzip: 0.61 kB β”‚ map: 3.35 kB +@reportory/components:build: dist/node_modules/d3-shape/src/line.js 1.28 kB β”‚ gzip: 0.53 kB β”‚ map: 3.48 kB +@reportory/components:build: dist/node_modules/d3-format/src/formatSpecifier.js 1.30 kB β”‚ gzip: 0.57 kB β”‚ map: 3.28 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/remix-hook-form/form.js 1.31 kB β”‚ gzip: 0.60 kB β”‚ map: 2.98 kB +@reportory/components:build: dist/node_modules/d3-shape/src/curve/step.js 1.34 kB β”‚ gzip: 0.49 kB β”‚ map: 2.91 kB +@reportory/components:build: dist/node_modules/d3-array/src/ticks.js 1.36 kB β”‚ gzip: 0.57 kB β”‚ map: 4.29 kB +@reportory/components:build: dist/ui/metric-card.js 1.37 kB β”‚ gzip: 0.59 kB β”‚ map: 2.47 kB +@reportory/components:build: dist/layout/card.js 1.39 kB β”‚ gzip: 0.49 kB β”‚ map: 3.09 kB +@reportory/components:build: dist/node_modules/d3-time/src/interval.js 1.40 kB β”‚ gzip: 0.60 kB β”‚ map: 4.23 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/utils/rangeContainsModifiers.js 1.41 kB β”‚ gzip: 0.63 kB β”‚ map: 5.08 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/data-table-filter/lib/debounce.js 1.44 kB β”‚ gzip: 0.57 kB β”‚ map: 3.36 kB +@reportory/components:build: dist/node_modules/object-assign/index.js 1.46 kB β”‚ gzip: 0.69 kB β”‚ map: 4.01 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-use-controllable-state/dist/index.js 1.47 kB β”‚ gzip: 0.71 kB β”‚ map: 6.86 kB +@reportory/components:build: dist/node_modules/d3-shape/src/curve/basis.js 1.49 kB β”‚ gzip: 0.52 kB β”‚ map: 3.12 kB +@reportory/components:build: dist/node_modules/d3-shape/src/curve/natural.js 1.50 kB β”‚ gzip: 0.61 kB β”‚ map: 4.22 kB +@reportory/components:build: dist/node_modules/lodash/_equalByTag.js 1.51 kB β”‚ gzip: 0.65 kB β”‚ map: 5.83 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/UI.js 1.52 kB β”‚ gzip: 0.54 kB β”‚ map: 6.52 kB +@reportory/components:build: dist/node_modules/use-sidecar/dist/es2015/medium.js 1.52 kB β”‚ gzip: 0.59 kB β”‚ map: 4.48 kB +@reportory/components:build: dist/node_modules/date-fns/locale/en-US/_lib/formatDistance.js 1.53 kB β”‚ gzip: 0.48 kB β”‚ map: 3.38 kB +@reportory/components:build: dist/node_modules/d3-shape/src/curve/basisClosed.js 1.54 kB β”‚ gzip: 0.51 kB β”‚ map: 3.21 kB +@reportory/components:build: dist/node_modules/tslib/tslib.es6.js 1.55 kB β”‚ gzip: 0.68 kB β”‚ map: 20.39 kB +@reportory/components:build: dist/node_modules/lodash/debounce.js 1.56 kB β”‚ gzip: 0.68 kB β”‚ map: 8.76 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/helpers/createGetModifiers.js 1.58 kB β”‚ gzip: 0.77 kB β”‚ map: 6.60 kB +@reportory/components:build: dist/node_modules/react-remove-scroll/dist/es2015/UI.js 1.58 kB β”‚ gzip: 0.79 kB β”‚ map: 4.17 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/useCalendar.js 1.65 kB β”‚ gzip: 0.70 kB β”‚ map: 5.65 kB +@reportory/components:build: dist/node_modules/recharts/es6/container/Surface.js 1.66 kB β”‚ gzip: 0.76 kB β”‚ map: 4.42 kB +@reportory/components:build: dist/charts/bar-chart.js 1.71 kB β”‚ gzip: 0.80 kB β”‚ map: 3.54 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/data-table-filter/lib/i18n.js 1.72 kB β”‚ gzip: 0.56 kB β”‚ map: 3.02 kB +@reportory/components:build: dist/layout/tabs.js 1.76 kB β”‚ gzip: 0.72 kB β”‚ map: 2.88 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/components/custom-components.js 1.77 kB β”‚ gzip: 0.53 kB β”‚ map: 0.13 kB +@reportory/components:build: dist/ai-elements/reasoning.js 1.83 kB β”‚ gzip: 0.77 kB β”‚ map: 3.91 kB +@reportory/components:build: dist/node_modules/d3-time/src/ticks.js 1.83 kB β”‚ gzip: 0.76 kB β”‚ map: 4.98 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/form.js 1.86 kB β”‚ gzip: 0.73 kB β”‚ map: 4.90 kB +@reportory/components:build: dist/node_modules/@date-fns/tz/date/index.js 1.87 kB β”‚ gzip: 0.68 kB β”‚ map: 4.57 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-collection/dist/index.js 1.88 kB β”‚ gzip: 0.81 kB β”‚ map: 20.29 kB +@reportory/components:build: dist/node_modules/d3-scale/src/band.js 1.89 kB β”‚ gzip: 0.69 kB β”‚ map: 5.27 kB +@reportory/components:build: dist/node_modules/react-remove-scroll/dist/es2015/handleScroll.js 1.89 kB β”‚ gzip: 0.85 kB β”‚ map: 7.56 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/CssPrefixUtils.js 1.90 kB β”‚ gzip: 0.80 kB β”‚ map: 4.50 kB +@reportory/components:build: dist/charts/utils/pie-chart-impl.js 1.92 kB β”‚ gzip: 0.81 kB β”‚ map: 3.57 kB +@reportory/components:build: dist/node_modules/d3-scale/src/time.js 1.94 kB β”‚ gzip: 0.78 kB β”‚ map: 4.85 kB +@reportory/components:build: dist/node_modules/victory-vendor/es/d3-scale.js 1.95 kB β”‚ gzip: 0.51 kB β”‚ map: 0.11 kB +@reportory/components:build: dist/node_modules/prop-types/checkPropTypes.js 1.96 kB β”‚ gzip: 0.86 kB β”‚ map: 5.58 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/button.js 2.00 kB β”‚ gzip: 0.85 kB β”‚ map: 2.86 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/DataUtils.js 2.02 kB β”‚ gzip: 0.84 kB β”‚ map: 7.82 kB +@reportory/components:build: dist/ui/button.js 2.04 kB β”‚ gzip: 0.86 kB β”‚ map: 3.14 kB +@reportory/components:build: dist/node_modules/react-smooth/es6/AnimateManager.js 2.06 kB β”‚ gzip: 0.85 kB β”‚ map: 5.31 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/table.js 2.10 kB β”‚ gzip: 0.67 kB β”‚ map: 3.97 kB +@reportory/components:build: dist/ui/table.js 2.10 kB β”‚ gzip: 0.67 kB β”‚ map: 4.55 kB +@reportory/components:build: dist/charts/radial-chart.js 2.10 kB β”‚ gzip: 0.82 kB β”‚ map: 4.16 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-context/dist/index.js 2.11 kB β”‚ gzip: 0.83 kB β”‚ map: 6.32 kB +@reportory/components:build: dist/node_modules/aria-hidden/dist/es2015/index.js 2.11 kB β”‚ gzip: 0.90 kB β”‚ map: 10.10 kB +@reportory/components:build: dist/node_modules/d3-scale/src/sequential.js 2.16 kB β”‚ gzip: 0.76 kB β”‚ map: 5.55 kB +@reportory/components:build: dist/ai-elements/streaming-activity.js 2.19 kB β”‚ gzip: 0.81 kB β”‚ map: 4.74 kB +@reportory/components:build: dist/node_modules/react-remove-scroll-bar/dist/es2015/component.js 2.20 kB β”‚ gzip: 0.88 kB β”‚ map: 5.96 kB +@reportory/components:build: dist/charts/pie-chart.js 2.21 kB β”‚ gzip: 0.94 kB β”‚ map: 4.47 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js 2.24 kB β”‚ gzip: 0.94 kB β”‚ map: 6.15 kB +@reportory/components:build: dist/node_modules/d3-scale/src/diverging.js 2.31 kB β”‚ gzip: 0.81 kB β”‚ map: 5.86 kB +@reportory/components:build: dist/charts/line-chart.js 2.35 kB β”‚ gzip: 0.94 kB β”‚ map: 4.49 kB +@reportory/components:build: dist/node_modules/d3-scale/src/continuous.js 2.37 kB β”‚ gzip: 0.91 kB β”‚ map: 7.01 kB +@reportory/components:build: dist/node_modules/d3-shape/src/area.js 2.41 kB β”‚ gzip: 0.79 kB β”‚ map: 6.54 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/data-table-filter/core/operators.js 2.42 kB β”‚ gzip: 0.44 kB β”‚ map: 10.35 kB +@reportory/components:build: dist/charts/utils/radial-chart-impl.js 2.42 kB β”‚ gzip: 0.96 kB β”‚ map: 4.81 kB +@reportory/components:build: dist/ai-elements/conversation.js 2.43 kB β”‚ gzip: 1.03 kB β”‚ map: 6.41 kB +@reportory/components:build: dist/node_modules/d3-shape/src/curve/monotone.js 2.44 kB β”‚ gzip: 0.81 kB β”‚ map: 6.36 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/RadialBarUtils.js 2.45 kB β”‚ gzip: 0.99 kB β”‚ map: 5.95 kB +@reportory/components:build: dist/ui/sheet.js 2.46 kB β”‚ gzip: 0.89 kB β”‚ map: 5.41 kB +@reportory/components:build: dist/charts/utils/radar-chart-impl.js 2.54 kB β”‚ gzip: 0.94 kB β”‚ map: 4.36 kB +@reportory/components:build: dist/node_modules/date-fns/locale/en-US/_lib/match.js 2.57 kB β”‚ gzip: 0.89 kB β”‚ map: 5.59 kB +@reportory/components:build: dist/charts/utils/bar-chart-impl.js 2.58 kB β”‚ gzip: 0.96 kB β”‚ map: 4.49 kB +@reportory/components:build: dist/ai-elements/message.js 2.60 kB β”‚ gzip: 0.97 kB β”‚ map: 5.77 kB +@reportory/components:build: dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.js 2.60 kB β”‚ gzip: 1.04 kB β”‚ map: 7.95 kB +@reportory/components:build: dist/node_modules/date-fns/format.js 2.67 kB β”‚ gzip: 1.04 kB β”‚ map: 28.17 kB +@reportory/components:build: dist/charts/utils/area-chart-impl.js 2.71 kB β”‚ gzip: 1.01 kB β”‚ map: 4.78 kB +@reportory/components:build: dist/node_modules/d3-scale/src/log.js 2.72 kB β”‚ gzip: 1.12 kB β”‚ map: 7.26 kB +@reportory/components:build: dist/charts/utils/line-chart-impl.js 2.74 kB β”‚ gzip: 1.00 kB β”‚ map: 4.87 kB +@reportory/components:build: dist/charts/area-chart.js 2.76 kB β”‚ gzip: 1.06 kB β”‚ map: 5.22 kB +@reportory/components:build: dist/node_modules/d3-path/src/path.js 2.79 kB β”‚ gzip: 1.10 kB β”‚ map: 8.79 kB +@reportory/components:build: dist/charts/radar-chart.js 2.79 kB β”‚ gzip: 0.94 kB β”‚ map: 5.30 kB +@reportory/components:build: dist/node_modules/recharts-scale/es6/util/utils.js 2.83 kB β”‚ gzip: 1.13 kB β”‚ map: 7.96 kB +@reportory/components:build: dist/node_modules/react-smooth/es6/util.js 2.86 kB β”‚ gzip: 1.14 kB β”‚ map: 7.88 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-presence/dist/index.js 2.93 kB β”‚ gzip: 1.14 kB β”‚ map: 8.60 kB +@reportory/components:build: dist/ui.js 2.94 kB β”‚ gzip: 0.85 kB β”‚ map: 0.10 kB +@reportory/components:build: dist/node_modules/date-fns/locale/en-US/_lib/localize.js 2.95 kB β”‚ gzip: 0.84 kB β”‚ map: 7.34 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/getLegendProps.js 2.96 kB β”‚ gzip: 1.23 kB β”‚ map: 7.49 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/DOMUtils.js 3.06 kB β”‚ gzip: 1.27 kB β”‚ map: 9.92 kB +@reportory/components:build: dist/node_modules/react-is/cjs/react-is.production.min.js 3.07 kB β”‚ gzip: 0.93 kB β”‚ map: 4.99 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/tooltip/translate.js 3.09 kB β”‚ gzip: 1.14 kB β”‚ map: 9.22 kB +@reportory/components:build: dist/node_modules/d3-format/src/locale.js 3.12 kB β”‚ gzip: 1.35 kB β”‚ map: 10.38 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/useAnimation.js 3.12 kB β”‚ gzip: 1.17 kB β”‚ map: 12.72 kB +@reportory/components:build: dist/node_modules/file-selector/dist/es2015/file-selector.js 3.12 kB β”‚ gzip: 1.12 kB β”‚ map: 11.72 kB +@reportory/components:build: dist/node_modules/recharts/es6/context/chartLayoutContext.js 3.26 kB β”‚ gzip: 1.07 kB β”‚ map: 10.78 kB +@reportory/components:build: dist/node_modules/recharts/es6/component/Cursor.js 3.38 kB β”‚ gzip: 1.35 kB β”‚ map: 8.57 kB +@reportory/components:build: dist/node_modules/recharts/es6/shape/Cross.js 3.39 kB β”‚ gzip: 1.30 kB β”‚ map: 8.57 kB +@reportory/components:build: dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js 3.46 kB β”‚ gzip: 1.03 kB β”‚ map: 5.75 kB +@reportory/components:build: dist/node_modules/@date-fns/tz/date/mini.js 3.53 kB β”‚ gzip: 1.16 kB β”‚ map: 12.94 kB +@reportory/components:build: dist/node_modules/recharts/es6/chart/AccessibilityManager.js 3.56 kB β”‚ gzip: 1.25 kB β”‚ map: 10.01 kB +@reportory/components:build: dist/layout/dialog.js 3.60 kB β”‚ gzip: 1.15 kB β”‚ map: 6.49 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/BarUtils.js 3.74 kB β”‚ gzip: 1.46 kB β”‚ map: 9.80 kB +@reportory/components:build: dist/remix-hook-form/form-file-dropzone.js 3.77 kB β”‚ gzip: 1.27 kB β”‚ map: 6.14 kB +@reportory/components:build: dist/node_modules/recharts/es6/shape/Polygon.js 3.77 kB β”‚ gzip: 1.47 kB β”‚ map: 10.96 kB +@reportory/components:build: dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js 3.82 kB β”‚ gzip: 1.45 kB β”‚ map: 10.92 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-collapsible/dist/index.js 3.82 kB β”‚ gzip: 1.34 kB β”‚ map: 9.80 kB +@reportory/components:build: dist/node_modules/react-is/cjs/react-is.development.js 4.05 kB β”‚ gzip: 1.35 kB β”‚ map: 11.94 kB +@reportory/components:build: dist/node_modules/eventemitter3/index.js 4.16 kB β”‚ gzip: 1.35 kB β”‚ map: 14.32 kB +@reportory/components:build: dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js 4.16 kB β”‚ gzip: 1.37 kB β”‚ map: 11.65 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/YAxis.js 4.32 kB β”‚ gzip: 1.69 kB β”‚ map: 10.67 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/XAxis.js 4.32 kB β”‚ gzip: 1.68 kB β”‚ map: 10.69 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-tabs/dist/index.js 4.47 kB β”‚ gzip: 1.48 kB β”‚ map: 11.36 kB +@reportory/components:build: dist/node_modules/recharts/es6/shape/Symbols.js 4.54 kB β”‚ gzip: 1.66 kB β”‚ map: 10.89 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-focus-scope/dist/index.js 4.65 kB β”‚ gzip: 1.75 kB β”‚ map: 14.39 kB +@reportory/components:build: dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.js 4.65 kB β”‚ gzip: 1.67 kB β”‚ map: 13.30 kB +@reportory/components:build: dist/node_modules/recharts/es6/shape/Curve.js 4.68 kB β”‚ gzip: 1.67 kB β”‚ map: 11.10 kB +@reportory/components:build: dist/node_modules/recharts-scale/es6/getNiceTickValues.js 4.68 kB β”‚ gzip: 1.76 kB β”‚ map: 19.74 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/getTicks.js 4.81 kB β”‚ gzip: 1.75 kB β”‚ map: 13.34 kB +@reportory/components:build: dist/node_modules/react-smooth/es6/configUpdate.js 5.22 kB β”‚ gzip: 1.85 kB β”‚ map: 14.90 kB +@reportory/components:build: dist/node_modules/react-smooth/es6/easing.js 5.26 kB β”‚ gzip: 1.86 kB β”‚ map: 14.02 kB +@reportory/components:build: dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.js 5.29 kB β”‚ gzip: 1.95 kB β”‚ map: 17.66 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-dismissable-layer/dist/index.js 5.33 kB β”‚ gzip: 1.73 kB β”‚ map: 15.42 kB +@reportory/components:build: dist/node_modules/recharts/es6/polar/PolarGrid.js 5.36 kB β”‚ gzip: 1.70 kB β”‚ map: 14.31 kB +@reportory/components:build: dist/node_modules/recharts/es6/shape/Trapezoid.js 5.53 kB β”‚ gzip: 2.07 kB β”‚ map: 14.08 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/ReduceCSSCalc.js 5.58 kB β”‚ gzip: 2.02 kB β”‚ map: 16.29 kB +@reportory/components:build: dist/index.js 5.61 kB β”‚ gzip: 1.52 kB β”‚ map: 0.12 kB +@reportory/components:build: dist/node_modules/recharts/es6/component/LabelList.js 5.62 kB β”‚ gzip: 2.06 kB β”‚ map: 14.05 kB +@reportory/components:build: dist/node_modules/recharts/es6/component/Tooltip.js 5.65 kB β”‚ gzip: 2.01 kB β”‚ map: 14.31 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/calendar.js 5.85 kB β”‚ gzip: 1.89 kB β”‚ map: 8.51 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/ReactUtils.js 5.88 kB β”‚ gzip: 2.26 kB β”‚ map: 19.23 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/ActiveShapeUtils.js 5.92 kB β”‚ gzip: 1.91 kB β”‚ map: 18.13 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/ReferenceDot.js 5.95 kB β”‚ gzip: 2.18 kB β”‚ map: 14.76 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-roving-focus/dist/index.js 6.14 kB β”‚ gzip: 2.11 kB β”‚ map: 16.49 kB +@reportory/components:build: dist/node_modules/recharts/es6/component/DefaultTooltipContent.js 6.17 kB β”‚ gzip: 2.27 kB β”‚ map: 15.25 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/ReferenceArea.js 6.23 kB β”‚ gzip: 2.26 kB β”‚ map: 15.57 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/PolarUtils.js 6.40 kB β”‚ gzip: 2.48 kB β”‚ map: 18.18 kB +@reportory/components:build: dist/node_modules/recharts/es6/component/ResponsiveContainer.js 6.45 kB β”‚ gzip: 2.59 kB β”‚ map: 17.16 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-radio-group/dist/index.js 6.50 kB β”‚ gzip: 2.13 kB β”‚ map: 17.38 kB +@reportory/components:build: dist/node_modules/recharts/es6/shape/Sector.js 6.69 kB β”‚ gzip: 2.07 kB β”‚ map: 19.69 kB +@reportory/components:build: dist/ui/dropdown.js 6.79 kB β”‚ gzip: 1.46 kB β”‚ map: 12.14 kB +@reportory/components:build: dist/node_modules/recharts/es6/component/TooltipBoundingBox.js 7.03 kB β”‚ gzip: 2.39 kB β”‚ map: 17.50 kB +@reportory/components:build: dist/node_modules/recharts/es6/component/Text.js 7.07 kB β”‚ gzip: 2.79 kB β”‚ map: 20.80 kB +@reportory/components:build: dist/node_modules/react-dropzone/dist/es/utils/index.js 7.31 kB β”‚ gzip: 2.75 kB β”‚ map: 22.61 kB +@reportory/components:build: dist/node_modules/recharts/es6/shape/Rectangle.js 7.54 kB β”‚ gzip: 2.55 kB β”‚ map: 19.73 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/ErrorBar.js 7.57 kB β”‚ gzip: 2.65 kB β”‚ map: 20.05 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/CartesianUtils.js 7.71 kB β”‚ gzip: 2.67 kB β”‚ map: 22.32 kB +@reportory/components:build: dist/node_modules/fast-equals/dist/esm/index.js 8.07 kB β”‚ gzip: 2.39 kB β”‚ map: 35.06 kB +@reportory/components:build: dist/node_modules/recharts/es6/component/Legend.js 8.08 kB β”‚ gzip: 2.56 kB β”‚ map: 20.20 kB +@reportory/components:build: dist/node_modules/recharts/es6/polar/PolarAngleAxis.js 8.21 kB β”‚ gzip: 2.71 kB β”‚ map: 20.02 kB +@reportory/components:build: dist/node_modules/recharts/es6/component/DefaultLegendContent.js 8.24 kB β”‚ gzip: 2.68 kB β”‚ map: 18.93 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/ReferenceLine.js 8.27 kB β”‚ gzip: 2.98 kB β”‚ map: 21.47 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-popover/dist/index.js 8.28 kB β”‚ gzip: 2.36 kB β”‚ map: 20.60 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-popper/dist/index.js 8.60 kB β”‚ gzip: 3.17 kB β”‚ map: 20.16 kB +@reportory/components:build: dist/node_modules/recharts/es6/polar/PolarRadiusAxis.js 8.76 kB β”‚ gzip: 2.84 kB β”‚ map: 21.94 kB +@reportory/components:build: dist/node_modules/@radix-ui/react-dialog/dist/index.js 8.95 kB β”‚ gzip: 2.73 kB β”‚ map: 22.49 kB +@reportory/components:build: dist/node_modules/d3-color/src/color.js 9.19 kB β”‚ gzip: 3.33 kB β”‚ map: 21.91 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/types.js 9.36 kB β”‚ gzip: 2.99 kB β”‚ map: 17.90 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/CartesianGrid.js 9.91 kB β”‚ gzip: 2.85 kB β”‚ map: 29.53 kB +@reportory/components:build: dist/ui/file-dropzone.js 10.50 kB β”‚ gzip: 3.29 kB β”‚ map: 21.84 kB +@reportory/components:build: dist/node_modules/recharts/es6/polar/Radar.js 11.05 kB β”‚ gzip: 3.42 kB β”‚ map: 28.80 kB +@reportory/components:build: dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.js 11.17 kB β”‚ gzip: 3.99 kB β”‚ map: 44.87 kB +@reportory/components:build: dist/node_modules/prop-types/factoryWithTypeCheckers.js 11.44 kB β”‚ gzip: 3.06 kB β”‚ map: 34.33 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/classes/DateLib.js 11.44 kB β”‚ gzip: 2.32 kB β”‚ map: 29.56 kB +@reportory/components:build: dist/node_modules/recharts/es6/component/Label.js 11.53 kB β”‚ gzip: 3.55 kB β”‚ map: 32.77 kB +@reportory/components:build: dist/node_modules/input-otp/dist/index.js 11.92 kB β”‚ gzip: 4.19 kB β”‚ map: 21.64 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/CartesianAxis.js 11.95 kB β”‚ gzip: 3.65 kB β”‚ map: 30.48 kB +@reportory/components:build: dist/node_modules/d3-time-format/src/locale.js 11.96 kB β”‚ gzip: 2.99 kB β”‚ map: 39.18 kB +@reportory/components:build: dist/node_modules/react-smooth/es6/Animate.js 12.09 kB β”‚ gzip: 3.83 kB β”‚ map: 32.84 kB +@reportory/components:build: dist/node_modules/recharts/es6/polar/RadialBar.js 12.32 kB β”‚ gzip: 3.87 kB β”‚ map: 32.48 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/Bar.js 14.40 kB β”‚ gzip: 4.51 kB β”‚ map: 38.67 kB +@reportory/components:build: dist/node_modules/@floating-ui/core/dist/floating-ui.core.js 14.40 kB β”‚ gzip: 4.34 kB β”‚ map: 55.31 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/node_modules/react-day-picker/dist/esm/DayPicker.js 14.62 kB β”‚ gzip: 4.07 kB β”‚ map: 36.60 kB +@reportory/components:build: dist/node_modules/date-fns/_lib/format/formatters.js 15.31 kB β”‚ gzip: 2.77 kB β”‚ map: 36.89 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/Area.js 16.13 kB β”‚ gzip: 4.76 kB β”‚ map: 43.96 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/Line.js 16.25 kB β”‚ gzip: 4.98 kB β”‚ map: 43.27 kB +@reportory/components:build: dist/node_modules/recharts/es6/polar/Pie.js 16.69 kB β”‚ gzip: 5.02 kB β”‚ map: 43.79 kB +@reportory/components:build: dist/node_modules/recharts/es6/cartesian/Brush.js 17.34 kB β”‚ gzip: 4.82 kB β”‚ map: 44.97 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/index-D45nOj1F.js 18.20 kB β”‚ gzip: 4.76 kB β”‚ map: 30.99 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/command-BEnT4AhM.js 18.91 kB β”‚ gzip: 6.17 kB β”‚ map: 39.71 kB +@reportory/components:build: dist/node_modules/react-dropzone/dist/es/index.js 19.32 kB β”‚ gzip: 6.20 kB β”‚ map: 57.28 kB +@reportory/components:build: dist/node_modules/decimal.js-light/decimal.js 19.70 kB β”‚ gzip: 6.79 kB β”‚ map: 80.36 kB +@reportory/components:build: dist/ui/sidebar.js 19.94 kB β”‚ gzip: 4.81 kB β”‚ map: 42.91 kB +@reportory/components:build: dist/node_modules/recharts/es6/util/ChartUtils.js 22.59 kB β”‚ gzip: 6.98 kB β”‚ map: 72.38 kB +@reportory/components:build: dist/node_modules/file-selector/dist/es2015/file.js 46.89 kB β”‚ gzip: 10.83 kB β”‚ map: 85.83 kB +@reportory/components:build: dist/node_modules/recharts/es6/chart/generateCategoricalChart.js 53.19 kB β”‚ gzip: 13.93 kB β”‚ map: 158.91 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/filter-selector-DCKG1gjI.js 58.29 kB β”‚ gzip: 14.58 kB β”‚ map: 115.91 kB +@reportory/components:build: dist/node_modules/@lambdacurry/forms/dist/ui/phone-input.js 176.87 kB β”‚ gzip: 38.04 kB β”‚ map: 326.73 kB +@reportory/components:build: βœ“ built in 1.65s +reportory:build: cache miss, executing fd934629117419d6 +reportory:build: $ bun run db:migrate:safe && bun run build:app +reportory:build: $ bun run scripts/migrate-safe.ts +@reportory/component-docs:build: cache hit, replaying logs bd09894befa75577 +@reportory/component-docs:build: $ storybook build +@reportory/component-docs:build: storybook v9.1.16 +@reportory/component-docs:build: +@reportory/component-docs:build: info => Cleaning outputDir: storybook-static +@reportory/component-docs:build: info => Loading presets +@reportory/component-docs:build: info => Building manager.. +@reportory/component-docs:build: info => Building preview.. +@reportory/component-docs:build: No story files found for the specified pattern: src/**/*.mdx +@reportory/component-docs:build: info => Copying static files: ../Reportory/assets at storybook-static +@reportory/component-docs:build: info Using tsconfig paths for react-docgen +@reportory/component-docs:build: vite v6.4.1 building for production... +@reportory/component-docs:build: transforming... +@reportory/component-docs:build: ../../node_modules/react-router/dist/development/index.mjs (11:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/react-router/dist/development/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-collapsible/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-collapsible/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-dialog/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-dialog/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-popover/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-popover/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-presence/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-presence/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-portal/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-portal/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-focus-guards/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-focus-guards/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-focus-scope/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-focus-scope/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-checkbox/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-checkbox/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-label/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-label/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-radio-group/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-radio-group/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-switch/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-switch/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-tabs/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-tabs/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-popper/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-popper/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-roving-focus/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-roving-focus/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-menu/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-menu/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-collection/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-collection/dist/index.mjs" was ignored. +@reportory/component-docs:build: ../../node_modules/@radix-ui/react-tooltip/dist/index.mjs (1:0): Module level directives cause errors when bundled, "use client" in "../../node_modules/@radix-ui/react-tooltip/dist/index.mjs" was ignored. +@reportory/component-docs:build: βœ“ 7855 modules transformed. +@reportory/component-docs:build: rendering chunks... +@reportory/component-docs:build: computing gzip size... +@reportory/component-docs:build: storybook-static/iframe.html 18.32 kB β”‚ gzip: 5.15 kB +@reportory/component-docs:build: storybook-static/assets/iframe-B0jTzbJh.css 140.32 kB β”‚ gzip: 20.92 kB +@reportory/component-docs:build: storybook-static/assets/utils-D64OaFpV.js 0.09 kB β”‚ gzip: 0.11 kB +@reportory/component-docs:build: storybook-static/assets/index-CPnaLrCO.js 0.13 kB β”‚ gzip: 0.12 kB +@reportory/component-docs:build: storybook-static/assets/index-DQClXQZh.js 0.21 kB β”‚ gzip: 0.18 kB +@reportory/component-docs:build: storybook-static/assets/index-BjhFJv-p.js 0.40 kB β”‚ gzip: 0.27 kB +@reportory/component-docs:build: storybook-static/assets/hidden-field-Bjlntd8q.js 0.42 kB β”‚ gzip: 0.28 kB +@reportory/component-docs:build: storybook-static/assets/database-DC5Vz-Gg.js 0.42 kB β”‚ gzip: 0.31 kB +@reportory/component-docs:build: storybook-static/assets/database-D58u2bBL.js 0.43 kB β”‚ gzip: 0.31 kB +@reportory/component-docs:build: storybook-static/assets/eye-9Da07EIW.js 0.44 kB β”‚ gzip: 0.31 kB +@reportory/component-docs:build: storybook-static/assets/index-CNpKr8hU.js 0.46 kB β”‚ gzip: 0.30 kB +@reportory/component-docs:build: storybook-static/assets/index-D1N_Yf9F.js 0.63 kB β”‚ gzip: 0.36 kB +@reportory/component-docs:build: storybook-static/assets/jsx-runtime-D_zvdyIk.js 0.73 kB β”‚ gzip: 0.46 kB +@reportory/component-docs:build: storybook-static/assets/index-C2sCW7CK.js 0.80 kB β”‚ gzip: 0.45 kB +@reportory/component-docs:build: storybook-static/assets/badge-CixxuwXE.js 0.90 kB β”‚ gzip: 0.48 kB +@reportory/component-docs:build: storybook-static/assets/index-BA7TAR0z.js 0.93 kB β”‚ gzip: 0.56 kB +@reportory/component-docs:build: storybook-static/assets/right-floating-sidebar-CtFednV2.js 0.94 kB β”‚ gzip: 0.56 kB +@reportory/component-docs:build: storybook-static/assets/dataset-display-BwdcTvj0.js 0.94 kB β”‚ gzip: 0.52 kB +@reportory/component-docs:build: storybook-static/assets/tslib.es6-BUas5LQb.js 1.08 kB β”‚ gzip: 0.54 kB +@reportory/component-docs:build: storybook-static/assets/metric-card-CuZl5B5k.js 1.26 kB β”‚ gzip: 0.55 kB +@reportory/component-docs:build: storybook-static/assets/MissionFilterBar.stories-TDhAlPfW.js 1.27 kB β”‚ gzip: 0.69 kB +@reportory/component-docs:build: storybook-static/assets/preload-helper-Dp1pzeXC.js 1.27 kB β”‚ gzip: 0.73 kB +@reportory/component-docs:build: storybook-static/assets/pie-chart.stories-BXZ6qEpy.js 1.28 kB β”‚ gzip: 0.66 kB +@reportory/component-docs:build: storybook-static/assets/tabs.stories-BuC6NKvZ.js 1.36 kB β”‚ gzip: 0.62 kB +@reportory/component-docs:build: storybook-static/assets/MissionChartPreview-CqnP7MDt.js 1.39 kB β”‚ gzip: 0.77 kB +@reportory/component-docs:build: storybook-static/assets/table.stories-DR9fmUQp.js 1.40 kB β”‚ gzip: 0.58 kB +@reportory/component-docs:build: storybook-static/assets/radar-chart.stories-D5AFqnNL.js 1.41 kB β”‚ gzip: 0.70 kB +@reportory/component-docs:build: storybook-static/assets/bar-chart.stories-Dxmte4pG.js 1.45 kB β”‚ gzip: 0.72 kB +@reportory/component-docs:build: storybook-static/assets/area-chart.stories-CpOBVH-S.js 1.45 kB β”‚ gzip: 0.72 kB +@reportory/component-docs:build: storybook-static/assets/line-chart.stories-DrvvmHQz.js 1.45 kB β”‚ gzip: 0.73 kB +@reportory/component-docs:build: storybook-static/assets/card-DSBUY3Sv.js 1.48 kB β”‚ gzip: 0.49 kB +@reportory/component-docs:build: storybook-static/assets/dropdown-menu.stories-kQIoPfg2.js 1.57 kB β”‚ gzip: 0.68 kB +@reportory/component-docs:build: storybook-static/assets/createLucideIcon-nowMgK7v.js 1.58 kB β”‚ gzip: 0.66 kB +@reportory/component-docs:build: storybook-static/assets/dialog.stories-r1Myg7Kc.js 1.64 kB β”‚ gzip: 0.72 kB +@reportory/component-docs:build: storybook-static/assets/badge.stories-Cis1BDUn.js 1.67 kB β”‚ gzip: 0.59 kB +@reportory/component-docs:build: storybook-static/assets/radial-chart.stories-gjt0V1Y0.js 1.80 kB β”‚ gzip: 0.89 kB +@reportory/component-docs:build: storybook-static/assets/table-CXzype5j.js 1.85 kB β”‚ gzip: 0.61 kB +@reportory/component-docs:build: storybook-static/assets/createLucideIcon-CWg1b5sZ.js 1.86 kB β”‚ gzip: 0.80 kB +@reportory/component-docs:build: storybook-static/assets/button-Vw0YDDAn.js 1.88 kB β”‚ gzip: 0.86 kB +@reportory/component-docs:build: storybook-static/assets/index-DDDpabHi.js 1.91 kB β”‚ gzip: 0.90 kB +@reportory/component-docs:build: storybook-static/assets/form-file-dropzone.stories-DNqV3uwt.js 1.93 kB β”‚ gzip: 0.94 kB +@reportory/component-docs:build: storybook-static/assets/MissionCard.stories-C3szObB8.js 2.09 kB β”‚ gzip: 0.84 kB +@reportory/component-docs:build: storybook-static/assets/x-CR3Ttb_x.js 2.14 kB β”‚ gzip: 0.87 kB +@reportory/component-docs:build: storybook-static/assets/bar-chart-impl-BugJNwED.js 2.61 kB β”‚ gzip: 1.16 kB +@reportory/component-docs:build: storybook-static/assets/MissionFilterBar-CJrH4-Vv.js 2.64 kB β”‚ gzip: 0.94 kB +@reportory/component-docs:build: storybook-static/assets/collapsible.stories-nwoLlelQ.js 2.74 kB β”‚ gzip: 0.97 kB +@reportory/component-docs:build: storybook-static/assets/MissionGrid.stories-Cxfbij3A.js 2.80 kB β”‚ gzip: 1.33 kB +@reportory/component-docs:build: storybook-static/assets/table-ozZoSyFL.js 2.86 kB β”‚ gzip: 0.92 kB +@reportory/component-docs:build: storybook-static/assets/collapsible-DOHMSoQF.js 2.91 kB β”‚ gzip: 1.17 kB +@reportory/component-docs:build: storybook-static/assets/form-file-dropzone-CdLmovcI.js 2.93 kB β”‚ gzip: 1.13 kB +@reportory/component-docs:build: storybook-static/assets/dialog-C-oiIhCz.js 3.23 kB β”‚ gzip: 1.07 kB +@reportory/component-docs:build: storybook-static/assets/file-dropzone.stories-O5g7hc8r.js 3.23 kB β”‚ gzip: 1.04 kB +@reportory/component-docs:build: storybook-static/assets/index-DCNbvAOD.js 3.59 kB β”‚ gzip: 1.43 kB +@reportory/component-docs:build: storybook-static/assets/tabs-DO1_1d0b.js 3.83 kB β”‚ gzip: 1.59 kB +@reportory/component-docs:build: storybook-static/assets/card.stories-DKN47ajP.js 3.84 kB β”‚ gzip: 1.11 kB +@reportory/component-docs:build: storybook-static/assets/index-B1L9HxrA.js 3.89 kB β”‚ gzip: 1.52 kB +@reportory/component-docs:build: storybook-static/assets/PolarGrid-BYpB5PhN.js 3.94 kB β”‚ gzip: 1.48 kB +@reportory/component-docs:build: storybook-static/assets/mock-data-cu9OT9QE.js 4.01 kB β”‚ gzip: 1.43 kB +@reportory/component-docs:build: storybook-static/assets/button.stories-EdQBwaSA.js 4.31 kB β”‚ gzip: 1.35 kB +@reportory/component-docs:build: storybook-static/assets/MissionCard-RMNEwGFs.js 4.75 kB β”‚ gzip: 1.71 kB +@reportory/component-docs:build: storybook-static/assets/index-B6rYvSrD.js 6.20 kB β”‚ gzip: 2.60 kB +@reportory/component-docs:build: storybook-static/assets/metric-card.stories-D6ihr341.js 6.29 kB β”‚ gzip: 1.88 kB +@reportory/component-docs:build: storybook-static/assets/MissionDetailModal.stories-BJ74lHJ8.js 6.61 kB β”‚ gzip: 2.57 kB +@reportory/component-docs:build: storybook-static/assets/chunk-G3INQAYP-mLtHBFuo.js 6.74 kB β”‚ gzip: 2.85 kB +@reportory/component-docs:build: storybook-static/assets/index-CTzNDH5y.js 6.75 kB β”‚ gzip: 2.58 kB +@reportory/component-docs:build: storybook-static/assets/index-DfDld9VE.js 6.78 kB β”‚ gzip: 2.70 kB +@reportory/component-docs:build: storybook-static/assets/mission-data-BVrO_h53.js 7.21 kB β”‚ gzip: 2.54 kB +@reportory/component-docs:build: storybook-static/assets/slug-auto-generation.stories-D_J191zF.js 7.22 kB β”‚ gzip: 2.66 kB +@reportory/component-docs:build: storybook-static/assets/streaming-activity-BDNCd9MH.js 8.69 kB β”‚ gzip: 2.80 kB +@reportory/component-docs:build: storybook-static/assets/StreamingActivity.stories-K3R2u4R8.js 9.06 kB β”‚ gzip: 2.34 kB +@reportory/component-docs:build: storybook-static/assets/radar-chart-impl-FJ5uu2Ec.js 10.24 kB β”‚ gzip: 3.92 kB +@reportory/component-docs:build: storybook-static/assets/DatasetDeleteDialog.stories-BgOCc7FQ.js 10.88 kB β”‚ gzip: 3.10 kB +@reportory/component-docs:build: storybook-static/assets/DatasetDropdown.stories-CSh482Tv.js 11.91 kB β”‚ gzip: 3.90 kB +@reportory/component-docs:build: storybook-static/assets/pie-chart-impl-Bnzb_i2f.js 13.36 kB β”‚ gzip: 4.95 kB +@reportory/component-docs:build: storybook-static/assets/MultiDatasetDropdown.stories-D56u_cm2.js 13.42 kB β”‚ gzip: 4.06 kB +@reportory/component-docs:build: storybook-static/assets/area-chart-impl-OSu4CBZT.js 13.44 kB β”‚ gzip: 4.95 kB +@reportory/component-docs:build: storybook-static/assets/radial-chart-impl-C6-QFkX2.js 13.48 kB β”‚ gzip: 4.52 kB +@reportory/component-docs:build: storybook-static/assets/line-chart-impl-CBuMF8G3.js 13.63 kB β”‚ gzip: 5.17 kB +@reportory/component-docs:build: storybook-static/assets/PolarAngleAxis-5wUuQBlG.js 14.56 kB β”‚ gzip: 4.05 kB +@reportory/component-docs:build: storybook-static/assets/message.stories-DfoJ8PCZ.js 15.30 kB β”‚ gzip: 3.74 kB +@reportory/component-docs:build: storybook-static/assets/chart-tooltip-Dx3aRY1u.js 17.80 kB β”‚ gzip: 3.29 kB +@reportory/component-docs:build: storybook-static/assets/ChatHistorySidebar.stories-LQCESSZr.js 19.34 kB β”‚ gzip: 5.29 kB +@reportory/component-docs:build: storybook-static/assets/conversation.stories-BITea7PW.js 19.55 kB β”‚ gzip: 4.12 kB +@reportory/component-docs:build: storybook-static/assets/index-DKN2d2pb.js 20.00 kB β”‚ gzip: 7.21 kB +@reportory/component-docs:build: storybook-static/assets/bundle-mjs-BTGVH9Kg.js 20.28 kB β”‚ gzip: 6.83 kB +@reportory/component-docs:build: storybook-static/assets/dropdown-D7Szivn2.js 21.50 kB β”‚ gzip: 6.66 kB +@reportory/component-docs:build: storybook-static/assets/sidebar-Hx0B600t.js 21.77 kB β”‚ gzip: 5.30 kB +@reportory/component-docs:build: storybook-static/assets/sidebar.stories-Cw2hwyvO.js 23.23 kB β”‚ gzip: 4.67 kB +@reportory/component-docs:build: storybook-static/assets/YAxis-ChwzOV1T.js 24.46 kB β”‚ gzip: 6.29 kB +@reportory/component-docs:build: storybook-static/assets/ToolHistory.stories-g87Rrtmz.js 27.67 kB β”‚ gzip: 7.26 kB +@reportory/component-docs:build: storybook-static/assets/index-DueZjY-k.js 27.70 kB β”‚ gzip: 10.66 kB +@reportory/component-docs:build: storybook-static/vite-inject-mocker-entry.js 29.18 kB β”‚ gzip: 10.13 kB +@reportory/component-docs:build: storybook-static/assets/Color-AVL7NMMY-Bo2fBKx4.js 29.47 kB β”‚ gzip: 11.10 kB +@reportory/component-docs:build: storybook-static/assets/DatasetCard.stories-CkGfzemK.js 32.19 kB β”‚ gzip: 8.62 kB +@reportory/component-docs:build: storybook-static/assets/DatasetDataTable.stories-YJfEV0dQ.js 68.73 kB β”‚ gzip: 18.94 kB +@reportory/component-docs:build: storybook-static/assets/file-dropzone-D-tcpGAs.js 69.45 kB β”‚ gzip: 19.80 kB +@reportory/component-docs:build: storybook-static/assets/chunk-4WY6JWTD-FgxQsH9o.js 84.06 kB β”‚ gzip: 28.55 kB +@reportory/component-docs:build: storybook-static/assets/react-18-4yEO1Tps.js 174.16 kB β”‚ gzip: 55.25 kB +@reportory/component-docs:build: storybook-static/assets/generateCategoricalChart-BXI0BB1B.js 358.59 kB β”‚ gzip: 100.26 kB +@reportory/component-docs:build: storybook-static/assets/filter-selector-DCKG1gjI-CJA1g52F.js 394.54 kB β”‚ gzip: 110.13 kB +@reportory/component-docs:build: storybook-static/assets/DocsRenderer-PQXLIZUC-CS-9LCT0.js 667.94 kB β”‚ gzip: 218.93 kB +@reportory/component-docs:build: storybook-static/assets/iframe-muIFfiS-.js 1,247.08 kB β”‚ gzip: 345.68 kB +@reportory/component-docs:build: +@reportory/component-docs:build: (!) Some chunks are larger than 500 kB after minification. Consider: +@reportory/component-docs:build: - Using dynamic import() to code-split the application +@reportory/component-docs:build: - Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks +@reportory/component-docs:build: - Adjust chunk size limit for this warning via build.chunkSizeWarningLimit. +@reportory/component-docs:build: βœ“ built in 7.60s +@reportory/component-docs:build: info => Output directory: /Users/jake/projects/reportory/apps/component-docs/storybook-static +@reportory/component-docs:test: cache hit, replaying logs deea3cf9a86f2e4c +@reportory/component-docs:test: $ echo 'Skipping Playwright E2E (Storybook Test Runner) β€” focusing on Vitest unit tests for now. To run E2E later: bun run test:e2e' +@reportory/component-docs:test: Skipping Playwright E2E (Storybook Test Runner) β€” focusing on Vitest unit tests for now. To run E2E later: bun run test:e2e +reportory:build: πŸ”„ Running database migrations... +reportory:build: βœ… Database migrations completed successfully +reportory:build: $ bun run scripts/build-app.ts +reportory:build: vite v6.4.1 building for production... +reportory:build: transforming... +reportory:build: βœ“ 10563 modules transformed. +reportory:build: Generated an empty chunk: "api.chat". +reportory:build: Generated an empty chunk: "api.demo.chat". +reportory:build: Generated an empty chunk: "api.chat.threads". +reportory:build: Generated an empty chunk: "api.chat.threads._threadId". +reportory:build: Generated an empty chunk: "api.blob.upload". +reportory:build: Generated an empty chunk: "api.ingest". +reportory:build: Generated an empty chunk: "api.ingest.batch". +reportory:build: Generated an empty chunk: "api.auth.quick-login". +reportory:build: Generated an empty chunk: "api.auth._". +reportory:build: Generated an empty chunk: "api.connection.test". +reportory:build: Generated an empty chunk: "api.connection.create". +reportory:build: Generated an empty chunk: "api.dataset.list". +reportory:build: Generated an empty chunk: "api.dataset.rename". +reportory:build: Generated an empty chunk: "api.dataset.prompt". +reportory:build: Generated an empty chunk: "api.dataset.delete". +reportory:build: Generated an empty chunk: "api.dataset.restore". +reportory:build: Generated an empty chunk: "api.dataset.archive". +reportory:build: Generated an empty chunk: "api.dataview.save". +reportory:build: Generated an empty chunk: "api.organization.invite". +reportory:build: Generated an empty chunk: "api.organization.switch". +reportory:build: Generated an empty chunk: "api.health". +reportory:build: rendering chunks... +reportory:build: computing gzip size... +reportory:build: build/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff 4.42 kB +reportory:build: build/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 4.93 kB +reportory:build: build/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 5.21 kB +reportory:build: build/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 5.47 kB +reportory:build: build/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff 5.98 kB +reportory:build: build/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff 6.19 kB +reportory:build: build/client/assets/KaTeX_Size1-Regular-C195tn64.woff 6.50 kB +reportory:build: build/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 6.91 kB +reportory:build: build/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 6.91 kB +reportory:build: build/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf 7.59 kB +reportory:build: build/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff 7.66 kB +reportory:build: build/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff 7.72 kB +reportory:build: build/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 9.64 kB +reportory:build: build/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 10.34 kB +reportory:build: build/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf 10.36 kB +reportory:build: build/client/assets/KaTeX_Script-Regular-D5yQViql.woff 10.59 kB +reportory:build: build/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 11.32 kB +reportory:build: build/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 11.35 kB +reportory:build: build/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf 11.51 kB +reportory:build: build/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 12.03 kB +reportory:build: build/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 12.22 kB +reportory:build: build/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf 12.23 kB +reportory:build: build/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff 12.32 kB +reportory:build: build/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf 12.34 kB +reportory:build: build/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf 12.37 kB +reportory:build: build/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff 13.21 kB +reportory:build: build/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff 13.30 kB +reportory:build: build/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 13.57 kB +reportory:build: build/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff 14.11 kB +reportory:build: build/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff 14.41 kB +reportory:build: build/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff 16.03 kB +reportory:build: build/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 16.40 kB +reportory:build: build/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 16.44 kB +reportory:build: build/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf 16.65 kB +reportory:build: build/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 16.78 kB +reportory:build: build/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 16.99 kB +reportory:build: build/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff 18.67 kB +reportory:build: build/client/assets/KaTeX_Math-Italic-DA0__PXp.woff 18.75 kB +reportory:build: build/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff 19.41 kB +reportory:build: build/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf 19.44 kB +reportory:build: build/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf 19.57 kB +reportory:build: build/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf 19.58 kB +reportory:build: build/client/assets/KaTeX_Main-Italic-BMLOBm91.woff 19.68 kB +reportory:build: build/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf 22.36 kB +reportory:build: build/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf 24.50 kB +reportory:build: build/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 25.32 kB +reportory:build: build/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 26.27 kB +reportory:build: build/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf 27.56 kB +reportory:build: build/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 28.08 kB +reportory:build: build/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff 29.91 kB +reportory:build: build/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff 30.77 kB +reportory:build: build/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf 31.20 kB +reportory:build: build/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf 31.31 kB +reportory:build: build/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf 32.97 kB +reportory:build: build/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff 33.52 kB +reportory:build: build/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf 33.58 kB +reportory:build: build/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf 51.34 kB +reportory:build: build/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf 53.58 kB +reportory:build: build/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf 63.63 kB +reportory:build: build/client/.vite/manifest.json 190.09 kB β”‚ gzip: 18.59 kB +reportory:build: build/client/assets/katex-CyAuISp2.css 29.19 kB β”‚ gzip: 8.03 kB +reportory:build: build/client/assets/root-w6oXsD70.css 140.85 kB β”‚ gzip: 21.06 kB +reportory:build: build/client/assets/api.chat-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.demo.chat-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.chat.threads-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.chat.threads._threadId-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.blob.upload-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.ingest-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.ingest.batch-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.auth.quick-login-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.auth._-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.connection.test-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.connection.create-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.dataset.list-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.dataset.rename-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.dataset.prompt-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.dataset.delete-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.dataset.restore-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.dataset.archive-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.dataview.save-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.organization.invite-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.organization.switch-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/api.health-l0sNRNKZ.js 0.00 kB β”‚ gzip: 0.02 kB +reportory:build: build/client/assets/clone-Dil2No_z.js 0.10 kB β”‚ gzip: 0.11 kB +reportory:build: build/client/assets/app._index-DTJTfmZZ.js 0.11 kB β”‚ gzip: 0.12 kB +reportory:build: build/client/assets/app.datasets.new._index-DC1xjZz4.js 0.11 kB β”‚ gzip: 0.12 kB +reportory:build: build/client/assets/logout-CtHPgvDr.js 0.11 kB β”‚ gzip: 0.12 kB +reportory:build: build/client/assets/channel-DHCHufqI.js 0.11 kB β”‚ gzip: 0.13 kB +reportory:build: build/client/assets/first-DkTTu7Sk.js 0.16 kB β”‚ gzip: 0.14 kB +reportory:build: build/client/assets/ClientOnly-AXniwn9k.js 0.17 kB β”‚ gzip: 0.18 kB +reportory:build: build/client/assets/chunk-QZHKN3VN-AeGrR1Q0.js 0.19 kB β”‚ gzip: 0.16 kB +reportory:build: build/client/assets/api.dataset.switch-CZXok_5c.js 0.19 kB β”‚ gzip: 0.18 kB +reportory:build: build/client/assets/index-BGBhGmif.js 0.22 kB β”‚ gzip: 0.18 kB +reportory:build: build/client/assets/dataset-USCfP03_.js 0.23 kB β”‚ gzip: 0.18 kB +reportory:build: build/client/assets/chunk-55IACEB6-DRUhJH6E.js 0.24 kB β”‚ gzip: 0.21 kB +reportory:build: build/client/assets/utils-CXU-ndlc.js 0.29 kB β”‚ gzip: 0.23 kB +reportory:build: build/client/assets/app.datasets-COM34rLf.js 0.30 kB β”‚ gzip: 0.24 kB +reportory:build: build/client/assets/chunk-4BX2VUAB-DTuOT-e5.js 0.30 kB β”‚ gzip: 0.21 kB +reportory:build: build/client/assets/check-CDBrW1EF.js 0.30 kB β”‚ gzip: 0.25 kB +reportory:build: build/client/assets/chevron-down-DVS054b5.js 0.31 kB β”‚ gzip: 0.25 kB +reportory:build: build/client/assets/loader-circle-4e3DkrZd.js 0.32 kB β”‚ gzip: 0.26 kB +reportory:build: build/client/assets/plus-BMohSLAA.js 0.34 kB β”‚ gzip: 0.26 kB +reportory:build: build/client/assets/clock-253o3m7D.js 0.35 kB β”‚ gzip: 0.28 kB +reportory:build: build/client/assets/arrow-left-D24NCm6x.js 0.35 kB β”‚ gzip: 0.27 kB +reportory:build: build/client/assets/trending-up-CwF-ZuBQ.js 0.36 kB β”‚ gzip: 0.28 kB +reportory:build: build/client/assets/chart-line-Dngdm1vg.js 0.36 kB β”‚ gzip: 0.28 kB +reportory:build: build/client/assets/chunk-FMBD7UC4-D_MRbdDi.js 0.37 kB β”‚ gzip: 0.27 kB +reportory:build: build/client/assets/user-Cr7rRZVI.js 0.38 kB β”‚ gzip: 0.29 kB +reportory:build: build/client/assets/init-Dmth1JHB.js 0.38 kB β”‚ gzip: 0.19 kB +reportory:build: build/client/assets/activity-DATdcvPd.js 0.42 kB β”‚ gzip: 0.31 kB +reportory:build: build/client/assets/database-Dcia88x-.js 0.43 kB β”‚ gzip: 0.31 kB +reportory:build: build/client/assets/circle-alert-C45VlM_9.js 0.43 kB β”‚ gzip: 0.30 kB +reportory:build: build/client/assets/eye-CEe6uVss.js 0.44 kB β”‚ gzip: 0.31 kB +reportory:build: build/client/assets/chart-column-CyW2KAYC.js 0.44 kB β”‚ gzip: 0.30 kB +reportory:build: build/client/assets/PageHeader-Dix0iOkL.js 0.47 kB β”‚ gzip: 0.33 kB +reportory:build: build/client/assets/house-C3pIaA1I.js 0.47 kB β”‚ gzip: 0.33 kB +reportory:build: build/client/assets/bell-DDejQpKD.js 0.47 kB β”‚ gzip: 0.35 kB +reportory:build: build/client/assets/users-B6zsMoxN.js 0.49 kB β”‚ gzip: 0.33 kB +reportory:build: build/client/assets/404-munFLDsE.js 0.50 kB β”‚ gzip: 0.33 kB +reportory:build: build/client/assets/refresh-ccw-BB8NAn5P.js 0.51 kB β”‚ gzip: 0.33 kB +reportory:build: build/client/assets/refresh-cw-CMYs3cGp.js 0.51 kB β”‚ gzip: 0.33 kB +reportory:build: build/client/assets/radio-group-DpfkdOPU.js 0.52 kB β”‚ gzip: 0.32 kB +reportory:build: build/client/assets/chunk-QN33PNHL-DmotlB0r.js 0.53 kB β”‚ gzip: 0.38 kB +reportory:build: build/client/assets/codeowners-Bp6g37R7.js 0.55 kB β”‚ gzip: 0.32 kB +reportory:build: build/client/assets/stateDiagram-v2-4FDKWEC3-DUJ-8jhA.js 0.59 kB β”‚ gzip: 0.38 kB +reportory:build: build/client/assets/building-2-BDikCONa.js 0.62 kB β”‚ gzip: 0.36 kB +reportory:build: build/client/assets/classDiagram-2ON5EDUG-DEg_Fq0o.js 0.63 kB β”‚ gzip: 0.39 kB +reportory:build: build/client/assets/classDiagram-v2-WZHVMYZB-DEg_Fq0o.js 0.63 kB β”‚ gzip: 0.39 kB +reportory:build: build/client/assets/sparkles-C0LbQn3f.js 0.69 kB β”‚ gzip: 0.41 kB +reportory:build: build/client/assets/shellsession-BADoaaVG.js 0.71 kB β”‚ gzip: 0.43 kB +reportory:build: build/client/assets/tsv-B_m7g4N7.js 0.74 kB β”‚ gzip: 0.34 kB +reportory:build: build/client/assets/shield-CzYLjirF.js 0.79 kB β”‚ gzip: 0.44 kB +reportory:build: build/client/assets/html-derivative-BFtXZ54Q.js 0.90 kB β”‚ gzip: 0.50 kB +reportory:build: build/client/assets/settings-DiLnmIeO.js 0.91 kB β”‚ gzip: 0.45 kB +reportory:build: build/client/assets/infoDiagram-ER5ION4S-DlJVcGNy.js 0.94 kB β”‚ gzip: 0.58 kB +reportory:build: build/client/assets/git-rebase-r7XF79zn.js 0.98 kB β”‚ gzip: 0.44 kB +reportory:build: build/client/assets/qmldir-C8lEn-DE.js 1.00 kB β”‚ gzip: 0.45 kB +reportory:build: build/client/assets/target-B5GOVweN.js 1.07 kB β”‚ gzip: 0.43 kB +reportory:build: build/client/assets/card-B4ZNhV6M.js 1.08 kB β”‚ gzip: 0.43 kB +reportory:build: build/client/assets/fortran-fixed-form-BZjJHVRy.js 1.10 kB β”‚ gzip: 0.54 kB +reportory:build: build/client/assets/csv-fuZLfV_i.js 1.14 kB β”‚ gzip: 0.37 kB +reportory:build: build/client/assets/ordinal-DILIJJjt.js 1.20 kB β”‚ gzip: 0.58 kB +reportory:build: build/client/assets/git-commit-F4YmCXRG.js 1.23 kB β”‚ gzip: 0.53 kB +reportory:build: build/client/assets/separator-yZoU4HG1.js 1.24 kB β”‚ gzip: 0.66 kB +reportory:build: build/client/assets/xsl-CtQFsRM5.js 1.39 kB β”‚ gzip: 0.52 kB +reportory:build: build/client/assets/theme-B2CUPg1J.js 1.39 kB β”‚ gzip: 0.67 kB +reportory:build: build/client/assets/dotenv-Da5cRb03.js 1.42 kB β”‚ gzip: 0.53 kB +reportory:build: build/client/assets/chunk-TZMSLE5B-BPhh0K6j.js 1.44 kB β”‚ gzip: 0.64 kB +reportory:build: build/client/assets/sparql-rVzFXLq3.js 1.48 kB β”‚ gzip: 0.82 kB +reportory:build: build/client/assets/ini-BEwlwnbL.js 1.53 kB β”‚ gzip: 0.50 kB +reportory:build: build/client/assets/dataset-display-C6qkOjQ7.js 1.54 kB β”‚ gzip: 0.71 kB +reportory:build: build/client/assets/band-CquvqAHh.js 1.54 kB β”‚ gzip: 0.67 kB +reportory:build: build/client/assets/input-CJUDl49_.js 1.63 kB β”‚ gzip: 0.77 kB +reportory:build: build/client/assets/app.chat.new-BCjNaOOI.js 1.66 kB β”‚ gzip: 0.79 kB +reportory:build: build/client/assets/app.chat._threadId-BCjNaOOI.js 1.66 kB β”‚ gzip: 0.79 kB +reportory:build: build/client/assets/button-ndximY6s.js 1.68 kB β”‚ gzip: 0.76 kB +reportory:build: build/client/assets/docker-BcOcwvcX.js 1.74 kB β”‚ gzip: 0.60 kB +reportory:build: build/client/assets/hxml-Bvhsp5Yf.js 1.74 kB β”‚ gzip: 0.88 kB +reportory:build: build/client/assets/desktop-BmXAJ9_W.js 1.83 kB β”‚ gzip: 0.76 kB +reportory:build: build/client/assets/chat-types-DAX4HMvG.js 1.84 kB β”‚ gzip: 0.75 kB +reportory:build: build/client/assets/createLucideIcon-5U90BsZz.js 1.87 kB β”‚ gzip: 0.81 kB +reportory:build: build/client/assets/Layout-DPOd2Hk3.js 1.90 kB β”‚ gzip: 0.86 kB +reportory:build: build/client/assets/bar-chart-impl-DU_tK4zW.js 1.97 kB β”‚ gzip: 1.01 kB +reportory:build: build/client/assets/login-5Y4viIPe.js 2.11 kB β”‚ gzip: 0.98 kB +reportory:build: build/client/assets/x-IY_hs7mT.js 2.14 kB β”‚ gzip: 0.88 kB +reportory:build: build/client/assets/wenyan-BV7otONQ.js 2.16 kB β”‚ gzip: 1.09 kB +reportory:build: build/client/assets/app.datasets.new.layout-BZK3gomC.js 2.18 kB β”‚ gzip: 0.89 kB +reportory:build: build/client/assets/jssm-C2t-YnRu.js 2.24 kB β”‚ gzip: 0.62 kB +reportory:build: build/client/assets/theme-toggle-D44h8BMS.js 2.32 kB β”‚ gzip: 0.91 kB +reportory:build: build/client/assets/reg-C-SQnVFl.js 2.35 kB β”‚ gzip: 0.70 kB +reportory:build: build/client/assets/berry-D08WgyRC.js 2.36 kB β”‚ gzip: 0.76 kB +reportory:build: build/client/assets/edge-BkV0erSs.js 2.36 kB β”‚ gzip: 0.70 kB +reportory:build: build/client/assets/diff-D97Zzqfu.js 2.57 kB β”‚ gzip: 0.70 kB +reportory:build: build/client/assets/gleam-BspZqrRM.js 2.58 kB β”‚ gzip: 0.82 kB +reportory:build: build/client/assets/_basePickBy-DKewMA6Z.js 2.59 kB β”‚ gzip: 1.29 kB +reportory:build: build/client/assets/erb-BOJIQeun.js 2.61 kB β”‚ gzip: 0.84 kB +reportory:build: build/client/assets/hy-DFXneXwc.js 2.65 kB β”‚ gzip: 1.18 kB +reportory:build: build/client/assets/json-Cp-IABpG.js 2.82 kB β”‚ gzip: 0.78 kB +reportory:build: build/client/assets/log-2UxHyX5q.js 2.85 kB β”‚ gzip: 0.90 kB +reportory:build: build/client/assets/cairo-KRGpt6FW.js 2.94 kB β”‚ gzip: 0.81 kB +reportory:build: build/client/assets/organization.settings-CUI6BdlO.js 2.99 kB β”‚ gzip: 1.14 kB +reportory:build: build/client/assets/jsonl-DcaNXYhu.js 3.01 kB β”‚ gzip: 0.79 kB +reportory:build: build/client/assets/register-B_HdQknj.js 3.03 kB β”‚ gzip: 1.24 kB +reportory:build: build/client/assets/jsonc-Des-eS-w.js 3.11 kB β”‚ gzip: 0.80 kB +reportory:build: build/client/assets/logo-BtOb2qkB.js 3.13 kB β”‚ gzip: 1.47 kB +reportory:build: build/client/assets/settings._index-B5hf9L1B.js 3.23 kB β”‚ gzip: 0.94 kB +reportory:build: build/client/assets/po-BTJTHyun.js 3.24 kB β”‚ gzip: 0.91 kB +reportory:build: build/client/assets/json5-C9tS-k6U.js 3.25 kB β”‚ gzip: 0.83 kB +reportory:build: build/client/assets/mipsasm-CKIfxQSi.js 3.26 kB β”‚ gzip: 1.18 kB +reportory:build: build/client/assets/tasl-QIJgUcNo.js 3.29 kB β”‚ gzip: 0.85 kB +reportory:build: build/client/assets/genie-D0YGMca9.js 3.36 kB β”‚ gzip: 1.21 kB +reportory:build: build/client/assets/rel-C3B-1QV4.js 3.37 kB β”‚ gzip: 1.11 kB +reportory:build: build/client/assets/vala-CsfeWuGM.js 3.37 kB β”‚ gzip: 1.19 kB +reportory:build: build/client/assets/arc-o0R7K4Bt.js 3.42 kB β”‚ gzip: 1.46 kB +reportory:build: build/client/assets/splunk-BtCnVYZw.js 3.44 kB β”‚ gzip: 1.52 kB +reportory:build: build/client/assets/fluent-C4IJs8-o.js 3.61 kB β”‚ gzip: 0.90 kB +reportory:build: build/client/assets/ssh-config-_ykCGR6B.js 3.62 kB β”‚ gzip: 1.60 kB +reportory:build: build/client/assets/jsonnet-DFQXde-d.js 3.62 kB β”‚ gzip: 1.05 kB +reportory:build: build/client/assets/kdl-DV7GczEv.js 3.63 kB β”‚ gzip: 1.04 kB +reportory:build: build/client/assets/glsl-DplSGwfg.js 3.63 kB β”‚ gzip: 1.41 kB +reportory:build: build/client/assets/hurl-irOxFIW8.js 3.65 kB β”‚ gzip: 1.16 kB +reportory:build: build/client/assets/narrat-DRg8JJMk.js 3.67 kB β”‚ gzip: 1.11 kB +reportory:build: build/client/assets/turtle-BsS91CYL.js 3.70 kB β”‚ gzip: 0.98 kB +reportory:build: build/client/assets/invite._token-BNGr1K0q.js 3.71 kB β”‚ gzip: 1.50 kB +reportory:build: build/client/assets/zenscript-DVFEvuxE.js 3.91 kB β”‚ gzip: 1.28 kB +reportory:build: build/client/assets/PolarGrid-i4hgco3U.js 3.94 kB β”‚ gzip: 1.50 kB +reportory:build: build/client/assets/pascal-D93ZcfNL.js 4.15 kB β”‚ gzip: 1.67 kB +reportory:build: build/client/assets/nextflow-CUEJCptM.js 4.16 kB β”‚ gzip: 1.10 kB +reportory:build: build/client/assets/tcl-dwOrl1Do.js 4.43 kB β”‚ gzip: 1.52 kB +reportory:build: build/client/assets/rosmsg-BJDFO7_C.js 4.52 kB β”‚ gzip: 1.06 kB +reportory:build: build/client/assets/defaultLocale-C4B-KCzX.js 4.55 kB β”‚ gzip: 2.13 kB +reportory:build: build/client/assets/http-jrhK8wxY.js 4.55 kB β”‚ gzip: 1.12 kB +reportory:build: build/client/assets/diagram-S2PKOQOG-DVNIw6h0.js 4.59 kB β”‚ gzip: 2.03 kB +reportory:build: build/client/assets/root-DY7YEJ6S.js 4.60 kB β”‚ gzip: 1.39 kB +reportory:build: build/client/assets/polar-C0HS_06l.js 4.67 kB β”‚ gzip: 1.12 kB +reportory:build: build/client/assets/dialog-BTxvuxsS.js 4.68 kB β”‚ gzip: 1.54 kB +reportory:build: build/client/assets/sdbl-DVxCFoDh.js 4.70 kB β”‚ gzip: 2.01 kB +reportory:build: build/client/assets/fennel-BYunw83y.js 4.77 kB β”‚ gzip: 1.53 kB +reportory:build: build/client/assets/bibtex-CHM0blh-.js 4.80 kB β”‚ gzip: 0.83 kB +reportory:build: build/client/assets/llvm-BtvRca6l.js 5.04 kB β”‚ gzip: 2.01 kB +reportory:build: build/client/assets/wgsl-Dx-B1_4e.js 5.14 kB β”‚ gzip: 1.39 kB +reportory:build: build/client/assets/gdresource-B7Tvp0Sc.js 5.26 kB β”‚ gzip: 1.33 kB +reportory:build: build/client/assets/qml-3beO22l8.js 5.34 kB β”‚ gzip: 1.38 kB +reportory:build: build/client/assets/zig-VOosw3JB.js 5.34 kB β”‚ gzip: 1.55 kB +reportory:build: build/client/assets/dax-CEL-wOlO.js 5.37 kB β”‚ gzip: 2.23 kB +reportory:build: build/client/assets/bicep-Bmn6On1c.js 5.38 kB β”‚ gzip: 1.15 kB +reportory:build: build/client/assets/xml-sdJ4AIDG.js 5.38 kB β”‚ gzip: 1.21 kB +reportory:build: build/client/assets/app-C4GMhgYv.js 5.42 kB β”‚ gzip: 1.91 kB +reportory:build: build/client/assets/awk-DMzUqQB5.js 5.46 kB β”‚ gzip: 1.38 kB +reportory:build: build/client/assets/pieDiagram-ADFJNKIX-3ZLKRi2P.js 5.52 kB β”‚ gzip: 2.45 kB +reportory:build: build/client/assets/coq-DkFqJrB1.js 5.53 kB β”‚ gzip: 1.92 kB +reportory:build: build/client/assets/chunk-G3INQAYP-BU8hcull.js 5.53 kB β”‚ gzip: 2.47 kB +reportory:build: build/client/assets/jsx-runtime-Dt4qBlte.js 5.54 kB β”‚ gzip: 2.41 kB +reportory:build: build/client/assets/jinja-4LBKfQ-Z.js 5.69 kB β”‚ gzip: 1.40 kB +reportory:build: build/client/assets/linear-DfUIgsda.js 5.80 kB β”‚ gzip: 2.38 kB +reportory:build: build/client/assets/lean-DP1Csr6i.js 5.85 kB β”‚ gzip: 1.94 kB +reportory:build: build/client/assets/powerquery-CEu0bR-o.js 5.90 kB β”‚ gzip: 1.52 kB +reportory:build: build/client/assets/graph-DeuJ1efO.js 5.92 kB β”‚ gzip: 1.87 kB +reportory:build: build/client/assets/shaderlab-Dg9Lc6iA.js 5.92 kB β”‚ gzip: 2.08 kB +reportory:build: build/client/assets/verilog-BQ8w6xss.js 5.93 kB β”‚ gzip: 1.89 kB +reportory:build: build/client/assets/cypher-COkxafJQ.js 5.96 kB β”‚ gzip: 1.73 kB +reportory:build: build/client/assets/vb-D17OF-Vu.js 6.09 kB β”‚ gzip: 2.34 kB +reportory:build: build/client/assets/reasoning-Znz9v491.js 6.18 kB β”‚ gzip: 2.17 kB +reportory:build: build/client/assets/index-Dd4UGYCu.js 6.24 kB β”‚ gzip: 2.25 kB +reportory:build: build/client/assets/red-bN70gL4F.js 6.26 kB β”‚ gzip: 1.60 kB +reportory:build: build/client/assets/min-dark-CafNBF8u.js 6.29 kB β”‚ gzip: 1.71 kB +reportory:build: build/client/assets/diagram-QEK2KX5R-D5u9QTwh.js 6.31 kB β”‚ gzip: 2.67 kB +reportory:build: build/client/assets/gdshader-DkwncUOv.js 6.33 kB β”‚ gzip: 1.73 kB +reportory:build: build/client/assets/prisma-Dd19v3D-.js 6.33 kB β”‚ gzip: 1.39 kB +reportory:build: build/client/assets/ara-BRHolxvo.js 6.36 kB β”‚ gzip: 1.81 kB +reportory:build: build/client/assets/clojure-P80f7IUj.js 6.41 kB β”‚ gzip: 1.42 kB +reportory:build: build/client/assets/postcss-CXtECtnM.js 6.42 kB β”‚ gzip: 1.91 kB +reportory:build: build/client/assets/app.health-B4EJRRhK.js 6.43 kB β”‚ gzip: 2.17 kB +reportory:build: build/client/assets/toml-vGWfd6FD.js 6.43 kB β”‚ gzip: 1.28 kB +reportory:build: build/client/assets/solarized-light-L9t79GZl.js 6.48 kB β”‚ gzip: 1.73 kB +reportory:build: build/client/assets/proto-DyJlTyXw.js 6.52 kB β”‚ gzip: 1.41 kB +reportory:build: build/client/assets/smalltalk-BERRCDM3.js 6.59 kB β”‚ gzip: 1.62 kB +reportory:build: build/client/assets/index-CQhkQ_RF.js 6.69 kB β”‚ gzip: 2.58 kB +reportory:build: build/client/assets/talonscript-CkByrt1z.js 6.76 kB β”‚ gzip: 1.49 kB +reportory:build: build/client/assets/solarized-dark-DXbdFlpD.js 6.85 kB β”‚ gzip: 1.80 kB +reportory:build: build/client/assets/riscv-BM1_JUlF.js 6.91 kB β”‚ gzip: 1.98 kB +reportory:build: build/client/assets/min-light-CTRr51gU.js 6.97 kB β”‚ gzip: 1.89 kB +reportory:build: build/client/assets/soy-Brmx7dQM.js 6.98 kB β”‚ gzip: 1.66 kB +reportory:build: build/client/assets/scheme-C98Dy4si.js 7.17 kB β”‚ gzip: 2.05 kB +reportory:build: build/client/assets/mission-data-B9t_dLIT.js 7.21 kB β”‚ gzip: 2.54 kB +reportory:build: build/client/assets/hlsl-D3lLCCz7.js 7.26 kB β”‚ gzip: 2.19 kB +reportory:build: build/client/assets/qss-IeuSbFQv.js 7.47 kB β”‚ gzip: 2.58 kB +reportory:build: build/client/assets/app.datasets.new.connect-BdajUjCT.js 7.63 kB β”‚ gzip: 3.10 kB +reportory:build: build/client/assets/dart-CF10PKvl.js 7.81 kB β”‚ gzip: 1.91 kB +reportory:build: build/client/assets/systemd-4A_iFExJ.js 7.87 kB β”‚ gzip: 2.55 kB +reportory:build: build/client/assets/monokai-D4h5O-jR.js 7.88 kB β”‚ gzip: 1.91 kB +reportory:build: build/client/assets/regexp-CDVJQ6XC.js 7.99 kB β”‚ gzip: 1.42 kB +reportory:build: build/client/assets/haml-B8DHNrY2.js 8.26 kB β”‚ gzip: 1.81 kB +reportory:build: build/client/assets/typst-DHCkPAjA.js 8.39 kB β”‚ gzip: 1.67 kB +reportory:build: build/client/assets/settings-B0d3N1fO.js 8.40 kB β”‚ gzip: 2.76 kB +reportory:build: build/client/assets/plsql-ChMvpjG-.js 8.51 kB β”‚ gzip: 3.00 kB +reportory:build: build/client/assets/vue-html-DAAvJJDi.js 8.67 kB β”‚ gzip: 1.78 kB +reportory:build: build/client/assets/kotlin-BdnUsdx6.js 8.79 kB β”‚ gzip: 2.13 kB +reportory:build: build/client/assets/ts-tags-zn1MmPIZ.js 8.95 kB β”‚ gzip: 1.22 kB +reportory:build: build/client/assets/make-CHLpvVh8.js 8.96 kB β”‚ gzip: 1.77 kB +reportory:build: build/client/assets/andromeeda-C-Jbm3Hp.js 8.98 kB β”‚ gzip: 2.35 kB +reportory:build: build/client/assets/sas-cz2c8ADy.js 9.06 kB β”‚ gzip: 3.81 kB +reportory:build: build/client/assets/dark-plus-eOWES_5F.js 9.10 kB β”‚ gzip: 2.10 kB +reportory:build: build/client/assets/slack-dark-BthQWCQV.js 9.12 kB β”‚ gzip: 1.97 kB +reportory:build: build/client/assets/sass-Cj5Yp3dK.js 9.29 kB β”‚ gzip: 2.49 kB +reportory:build: build/client/assets/plastic-3e1v2bzS.js 9.30 kB β”‚ gzip: 1.98 kB +reportory:build: build/client/assets/slack-ochin-DqwNpetd.js 9.43 kB β”‚ gzip: 2.10 kB +reportory:build: build/client/assets/health-C55ddJQV.js 9.52 kB β”‚ gzip: 2.85 kB +reportory:build: build/client/assets/radar-chart-impl-BNCj3tYB.js 9.58 kB β”‚ gzip: 3.76 kB +reportory:build: build/client/assets/index-Dxn6zTAe.js 9.64 kB β”‚ gzip: 3.12 kB +reportory:build: build/client/assets/tex-Cppo0RY3.js 9.65 kB β”‚ gzip: 3.05 kB +reportory:build: build/client/assets/jison-wvAkD_A8.js 9.69 kB β”‚ gzip: 1.85 kB +reportory:build: build/client/assets/cmake-D1j8_8rp.js 9.86 kB β”‚ gzip: 3.37 kB +reportory:build: build/client/assets/light-plus-B7mTdjB0.js 9.94 kB β”‚ gzip: 2.27 kB +reportory:build: build/client/assets/hcl-BWvSN4gD.js 10.05 kB β”‚ gzip: 1.93 kB +reportory:build: build/client/assets/demo.chat._scenario-a-pkEswp.js 10.26 kB β”‚ gzip: 3.95 kB +reportory:build: build/client/assets/pkl-u5AG7uiY.js 10.37 kB β”‚ gzip: 1.38 kB +reportory:build: build/client/assets/beancount-k_qm7-4y.js 10.37 kB β”‚ gzip: 1.44 kB +reportory:build: build/client/assets/dream-maker-BtqSS_iP.js 10.47 kB β”‚ gzip: 2.25 kB +reportory:build: build/client/assets/raku-DXvB9xmW.js 10.47 kB β”‚ gzip: 2.94 kB +reportory:build: build/client/assets/yaml-Buea-lGh.js 10.51 kB β”‚ gzip: 2.27 kB +reportory:build: build/client/assets/stateDiagram-FKZM4ZOC-CHDyb0VT.js 10.59 kB β”‚ gzip: 3.74 kB +reportory:build: build/client/assets/rst-B0xPkSld.js 10.67 kB β”‚ gzip: 2.42 kB +reportory:build: build/client/assets/chart-tooltip-DylneDT0.js 10.84 kB β”‚ gzip: 3.08 kB +reportory:build: build/client/assets/elm-DbKCFpqz.js 10.97 kB β”‚ gzip: 2.12 kB +reportory:build: build/client/assets/github-light-DAi9KRSo.js 11.18 kB β”‚ gzip: 2.51 kB +reportory:build: build/client/assets/prolog-CbFg5uaA.js 11.36 kB β”‚ gzip: 3.83 kB +reportory:build: build/client/assets/terraform-BETggiCN.js 11.39 kB β”‚ gzip: 2.51 kB +reportory:build: build/client/assets/github-dark-DHJKELXO.js 11.41 kB β”‚ gzip: 2.55 kB +reportory:build: build/client/assets/puppet-BMWR74SV.js 11.44 kB β”‚ gzip: 2.11 kB +reportory:build: build/client/assets/dagre-6UL2VRFP-BCySmvWo.js 11.47 kB β”‚ gzip: 4.31 kB +reportory:build: build/client/assets/laserwave-DUszq2jm.js 11.50 kB β”‚ gzip: 2.58 kB +reportory:build: build/client/assets/_baseUniq-DsAYfD1-.js 11.90 kB β”‚ gzip: 4.66 kB +reportory:build: build/client/assets/gherkin-DyxjwDmM.js 11.95 kB β”‚ gzip: 5.05 kB +reportory:build: build/client/assets/wasm-MzD3tlZU.js 12.01 kB β”‚ gzip: 2.19 kB +reportory:build: build/client/assets/hjson-D5-asLiD.js 12.05 kB β”‚ gzip: 1.64 kB +reportory:build: build/client/assets/handlebars-BL8al0AC.js 12.15 kB β”‚ gzip: 2.38 kB +reportory:build: build/client/assets/radial-chart-impl-BIS84-9B.js 12.24 kB β”‚ gzip: 4.28 kB +reportory:build: build/client/assets/index-7438dmcT.js 12.39 kB β”‚ gzip: 4.51 kB +reportory:build: build/client/assets/apache-Pmp26Uib.js 12.46 kB β”‚ gzip: 3.72 kB +reportory:build: build/client/assets/area-chart-impl-BGqiIhwq.js 12.69 kB β”‚ gzip: 4.82 kB +reportory:build: build/client/assets/vesper-DU1UobuO.js 12.69 kB β”‚ gzip: 1.97 kB +reportory:build: build/client/assets/line-chart-impl-BlZgyAw1.js 12.88 kB β”‚ gzip: 5.03 kB +reportory:build: build/client/assets/bat-BkioyH1T.js 12.89 kB β”‚ gzip: 3.22 kB +reportory:build: build/client/assets/pie-chart-impl-z-qza7ak.js 12.94 kB β”‚ gzip: 4.88 kB +reportory:build: build/client/assets/fish-BvzEVeQv.js 13.04 kB β”‚ gzip: 1.74 kB +reportory:build: build/client/assets/v-BcVCzyr7.js 13.21 kB β”‚ gzip: 2.74 kB +reportory:build: build/client/assets/vitesse-light-CVO1_9PV.js 13.62 kB β”‚ gzip: 3.04 kB +reportory:build: build/client/assets/aurora-x-D-2ljcwZ.js 13.66 kB β”‚ gzip: 2.28 kB +reportory:build: build/client/assets/vitesse-black-Bkuqu6BP.js 13.68 kB β”‚ gzip: 3.06 kB +reportory:build: build/client/assets/vitesse-dark-D0r3Knsf.js 13.76 kB β”‚ gzip: 3.06 kB +reportory:build: build/client/assets/luau-CXu1NL6O.js 13.84 kB β”‚ gzip: 3.13 kB +reportory:build: build/client/assets/pug-CGlum2m_.js 13.84 kB β”‚ gzip: 2.58 kB +reportory:build: build/client/assets/synthwave-84-CbfX1IO0.js 14.04 kB β”‚ gzip: 2.87 kB +reportory:build: build/client/assets/actionscript-3-CfeIJUat.js 14.05 kB β”‚ gzip: 2.58 kB +reportory:build: build/client/assets/github-light-default-D7oLnXFd.js 14.16 kB β”‚ gzip: 3.04 kB +reportory:build: build/client/assets/clarity-D53aC0YG.js 14.28 kB β”‚ gzip: 2.46 kB +reportory:build: build/client/assets/github-light-high-contrast-BfjtVDDH.js 14.28 kB β”‚ gzip: 3.02 kB +reportory:build: build/client/assets/github-dark-dimmed-DH5Ifo-i.js 14.43 kB β”‚ gzip: 3.13 kB +reportory:build: build/client/assets/github-dark-default-Cuk6v7N8.js 14.44 kB β”‚ gzip: 3.13 kB +reportory:build: build/client/assets/nix-BbRYJGeE.js 14.57 kB β”‚ gzip: 2.20 kB +reportory:build: build/client/assets/github-dark-high-contrast-E3gJ1_iC.js 14.60 kB β”‚ gzip: 3.09 kB +reportory:build: build/client/assets/organization.members-CC-RfK9x.js 14.60 kB β”‚ gzip: 4.77 kB +reportory:build: build/client/assets/PolarAngleAxis-0qEz0vp_.js 14.61 kB β”‚ gzip: 4.07 kB +reportory:build: build/client/assets/gnuplot-DdkO51Og.js 14.78 kB β”‚ gzip: 3.27 kB +reportory:build: build/client/assets/ayu-dark-Cv9koXgw.js 14.95 kB β”‚ gzip: 3.08 kB +reportory:build: build/client/assets/rust-B1yitclQ.js 15.07 kB β”‚ gzip: 2.72 kB +reportory:build: build/client/assets/time-Dtqnuiua.js 15.14 kB β”‚ gzip: 4.92 kB +reportory:build: build/client/assets/kusto-BvAqAH-y.js 15.17 kB β”‚ gzip: 3.92 kB +reportory:build: build/client/assets/lua-BbnMAYS6.js 15.21 kB β”‚ gzip: 3.09 kB +reportory:build: build/client/assets/schools-BcBhgefl.js 15.38 kB β”‚ gzip: 4.33 kB +reportory:build: build/client/assets/abap-BdImnpbu.js 15.85 kB β”‚ gzip: 5.91 kB +reportory:build: build/client/assets/matlab-D7o27uSR.js 16.09 kB β”‚ gzip: 3.06 kB +reportory:build: build/client/assets/cue-D82EKSYY.js 16.20 kB β”‚ gzip: 2.06 kB +reportory:build: build/client/assets/solidity-BbcW6ACK.js 16.24 kB β”‚ gzip: 3.12 kB +reportory:build: build/client/assets/diagram-PSM6KHXK-Q_vPzO3y.js 16.24 kB β”‚ gzip: 5.83 kB +reportory:build: build/client/assets/elixir-CDX3lj18.js 16.32 kB β”‚ gzip: 2.80 kB +reportory:build: build/client/assets/sidebar-C1JLCe2u.js 16.71 kB β”‚ gzip: 4.58 kB +reportory:build: build/client/assets/kanagawa-wave-DWedfzmr.js 17.12 kB β”‚ gzip: 2.93 kB +reportory:build: build/client/assets/kanagawa-lotus-CfQXZHmo.js 17.13 kB β”‚ gzip: 2.93 kB +reportory:build: build/client/assets/kanagawa-dragon-CkXjmgJE.js 17.13 kB β”‚ gzip: 2.95 kB +reportory:build: build/client/assets/move-Bu9oaDYs.js 17.33 kB β”‚ gzip: 3.08 kB +reportory:build: build/client/assets/app.datasets._index-wACbWnq4.js 17.63 kB β”‚ gzip: 5.54 kB +reportory:build: build/client/assets/svelte-3Dk4HxPD.js 17.81 kB β”‚ gzip: 3.04 kB +reportory:build: build/client/assets/graphql-ChdNCCLP.js 18.00 kB β”‚ gzip: 2.52 kB +reportory:build: build/client/assets/liquid-DYVedYrR.js 18.09 kB β”‚ gzip: 3.16 kB +reportory:build: build/client/assets/demo-QliE0XRm.js 18.27 kB β”‚ gzip: 5.29 kB +reportory:build: build/client/assets/material-theme-D5KoaKCx.js 18.62 kB β”‚ gzip: 3.11 kB +reportory:build: build/client/assets/material-theme-darker-BfHTSMKl.js 18.63 kB β”‚ gzip: 3.11 kB +reportory:build: build/client/assets/material-theme-ocean-CyktbL80.js 18.63 kB β”‚ gzip: 3.14 kB +reportory:build: build/client/assets/material-theme-lighter-B0m2ddpp.js 18.63 kB β”‚ gzip: 3.11 kB +reportory:build: build/client/assets/material-theme-palenight-Csfq5Kiy.js 18.64 kB β”‚ gzip: 3.13 kB +reportory:build: build/client/assets/gdscript-DTMYz4Jt.js 18.98 kB β”‚ gzip: 3.74 kB +reportory:build: build/client/assets/groovy-gcz8RCvz.js 19.18 kB β”‚ gzip: 3.60 kB +reportory:build: build/client/assets/mdc-DUICxH0z.js 19.63 kB β”‚ gzip: 6.66 kB +reportory:build: build/client/assets/string-CbqlBH1r.js 19.96 kB β”‚ gzip: 6.70 kB +reportory:build: build/client/assets/glimmer-js-Rg0-pVw9.js 20.07 kB β”‚ gzip: 2.95 kB +reportory:build: build/client/assets/glimmer-ts-U6CK756n.js 20.07 kB β”‚ gzip: 2.94 kB +reportory:build: build/client/assets/powershell-Dpen1YoG.js 20.15 kB β”‚ gzip: 4.07 kB +reportory:build: build/client/assets/bundle-mjs-BTGVH9Kg.js 20.28 kB β”‚ gzip: 6.83 kB +reportory:build: build/client/assets/viml-CJc9bBzg.js 20.37 kB β”‚ gzip: 6.73 kB +reportory:build: build/client/assets/nushell-C-sUppwS.js 20.40 kB β”‚ gzip: 5.18 kB +reportory:build: build/client/assets/dropdown-BKKEOH84.js 20.64 kB β”‚ gzip: 6.45 kB +reportory:build: build/client/assets/snazzy-light-Bw305WKR.js 20.77 kB β”‚ gzip: 3.83 kB +reportory:build: build/client/assets/kanban-definition-3W4ZIXB7-Wc8CwVUE.js 20.80 kB β”‚ gzip: 7.35 kB +reportory:build: build/client/assets/vue-CCoi5OLL.js 21.06 kB β”‚ gzip: 2.69 kB +reportory:build: build/client/assets/dracula-BzJJZx-M.js 21.07 kB β”‚ gzip: 4.00 kB +reportory:build: build/client/assets/dracula-soft-BXkSAIEj.js 21.08 kB β”‚ gzip: 4.04 kB +reportory:build: build/client/assets/mindmap-definition-VGOIOE7T-CVaD1YWY.js 21.23 kB β”‚ gzip: 7.45 kB +reportory:build: build/client/assets/twig-CO9l9SDP.js 21.36 kB β”‚ gzip: 3.87 kB +reportory:build: build/client/assets/wit-5i3qLPDT.js 21.47 kB β”‚ gzip: 2.89 kB +reportory:build: build/client/assets/rose-pine-BHrmToEH.js 21.74 kB β”‚ gzip: 3.87 kB +reportory:build: build/client/assets/rose-pine-moon-NleAzG8P.js 21.75 kB β”‚ gzip: 3.89 kB +reportory:build: build/client/assets/rose-pine-dawn-CnK8MTSM.js 21.75 kB β”‚ gzip: 3.89 kB +reportory:build: build/client/assets/sankeyDiagram-TZEHDZUN-mTa8torx.js 22.43 kB β”‚ gzip: 8.26 kB +reportory:build: build/client/assets/nim-CVrawwO9.js 22.46 kB β”‚ gzip: 3.16 kB +reportory:build: build/client/assets/common-lisp-Cg-RD9OK.js 22.58 kB β”‚ gzip: 6.06 kB +reportory:build: build/client/assets/gruvbox-dark-hard-CFHQjOhq.js 22.63 kB β”‚ gzip: 4.18 kB +reportory:build: build/client/assets/gruvbox-dark-soft-CVdnzihN.js 22.63 kB β”‚ gzip: 4.17 kB +reportory:build: build/client/assets/gruvbox-light-hard-CH1njM8p.js 22.64 kB β”‚ gzip: 4.18 kB +reportory:build: build/client/assets/gruvbox-light-soft-hJgmCMqR.js 22.64 kB β”‚ gzip: 4.18 kB +reportory:build: build/client/assets/gruvbox-dark-medium-GsRaNv29.js 22.64 kB β”‚ gzip: 4.18 kB +reportory:build: build/client/assets/gruvbox-light-medium-DRw_LuNl.js 22.64 kB β”‚ gzip: 4.18 kB +reportory:build: build/client/assets/sql-BLtJtn59.js 23.41 kB β”‚ gzip: 7.40 kB +reportory:build: build/client/assets/typespec-Df68jz8_.js 23.66 kB β”‚ gzip: 2.56 kB +reportory:build: build/client/assets/cadence-Bv_4Rxtq.js 23.67 kB β”‚ gzip: 3.67 kB +reportory:build: build/client/assets/journeyDiagram-XKPGCS4Q-csoyzVVW.js 23.75 kB β”‚ gzip: 8.43 kB +reportory:build: build/client/assets/timeline-definition-IT6M3QCI-B-FKsaMJ.js 23.92 kB β”‚ gzip: 8.39 kB +reportory:build: build/client/assets/astro-CbQHKStN.js 24.01 kB β”‚ gzip: 7.54 kB +reportory:build: build/client/assets/apl-dKokRX4l.js 24.04 kB β”‚ gzip: 4.20 kB +reportory:build: build/client/assets/templ-W15q3VgB.js 24.06 kB β”‚ gzip: 5.39 kB +reportory:build: build/client/assets/vhdl-CeAyd5Ju.js 24.26 kB β”‚ gzip: 3.87 kB +reportory:build: build/client/assets/angular-html-CU67Zn6k.js 24.29 kB β”‚ gzip: 4.01 kB +reportory:build: build/client/assets/YAxis-CrtPoI6m.js 24.47 kB β”‚ gzip: 6.31 kB +reportory:build: build/client/assets/purescript-CklMAg4u.js 24.69 kB β”‚ gzip: 3.25 kB +reportory:build: build/client/assets/gitGraphDiagram-NY62KEGX-DHAlZdF_.js 24.98 kB β”‚ gzip: 7.73 kB +reportory:build: build/client/assets/one-light-PoHY5YXO.js 25.30 kB β”‚ gzip: 3.68 kB +reportory:build: build/client/assets/fsharp-CXgrBDvD.js 25.31 kB β”‚ gzip: 4.13 kB +reportory:build: build/client/assets/marko-CPi9NSCl.js 25.44 kB β”‚ gzip: 3.57 kB +reportory:build: build/client/assets/erDiagram-Q2GNP2WA-bLHO_0eY.js 25.54 kB β”‚ gzip: 8.96 kB +reportory:build: build/client/assets/razor-WgofotgN.js 25.56 kB β”‚ gzip: 3.44 kB +reportory:build: build/client/assets/system-verilog-CnnmHF94.js 26.20 kB β”‚ gzip: 4.85 kB +reportory:build: build/client/assets/nord-Ddv68eIx.js 26.72 kB β”‚ gzip: 4.40 kB +reportory:build: build/client/assets/codeql-DsOJ9woJ.js 26.88 kB β”‚ gzip: 3.79 kB +reportory:build: build/client/assets/MetricCard-DaE0RluH.js 26.96 kB β”‚ gzip: 9.05 kB +reportory:build: build/client/assets/scss-OYdSNvt2.js 27.20 kB β”‚ gzip: 4.20 kB +reportory:build: build/client/assets/java-CylS5w8V.js 27.22 kB β”‚ gzip: 4.26 kB +reportory:build: build/client/assets/layout-CZoO3FCR.js 27.39 kB β”‚ gzip: 9.73 kB +reportory:build: build/client/assets/coffee-Ch7k5sss.js 27.42 kB β”‚ gzip: 6.35 kB +reportory:build: build/client/assets/mermaid-DKYwYmdq.js 28.50 kB β”‚ gzip: 3.55 kB +reportory:build: build/client/assets/scala-C151Ov-r.js 28.88 kB β”‚ gzip: 3.94 kB +reportory:build: build/client/assets/night-owl-C39BiMTA.js 28.91 kB β”‚ gzip: 5.16 kB +reportory:build: build/client/assets/crystal-tKQVLTB8.js 29.39 kB β”‚ gzip: 4.44 kB +reportory:build: build/client/assets/applescript-Co6uUVPk.js 29.57 kB β”‚ gzip: 5.93 kB +reportory:build: build/client/assets/requirementDiagram-UZGBJVZJ-D1WeNM9Q.js 30.46 kB β”‚ gzip: 9.60 kB +reportory:build: build/client/assets/Combination-B53jkOY3.js 30.71 kB β”‚ gzip: 10.49 kB +reportory:build: build/client/assets/auth-context-Bk414m-j.js 30.89 kB β”‚ gzip: 11.07 kB +reportory:build: build/client/assets/julia-C8NyazO9.js 31.07 kB β”‚ gzip: 4.33 kB +reportory:build: build/client/assets/stylus-BEDo0Tqx.js 31.07 kB β”‚ gzip: 7.99 kB +reportory:build: build/client/assets/find-tttyo4NU.js 32.01 kB β”‚ gzip: 11.92 kB +reportory:build: build/client/assets/index-DYoLQhjT.js 32.92 kB β”‚ gzip: 9.44 kB +reportory:build: build/client/assets/poimandres-CS3Unz2-.js 33.49 kB β”‚ gzip: 5.50 kB +reportory:build: build/client/assets/index-WsLgLLMZ.js 33.69 kB β”‚ gzip: 12.92 kB +reportory:build: build/client/assets/one-dark-pro-DVMEJ2y_.js 33.79 kB β”‚ gzip: 5.52 kB +reportory:build: build/client/assets/bsl-BO_Y6i37.js 33.87 kB β”‚ gzip: 8.35 kB +reportory:build: build/client/assets/quadrantDiagram-AYHSOK5B-dDltvmqa.js 34.52 kB β”‚ gzip: 10.21 kB +reportory:build: build/client/assets/app.datasets.new.upload-B9d7maTB.js 34.84 kB β”‚ gzip: 12.65 kB +reportory:build: build/client/assets/haxe-CzTSHFRz.js 35.16 kB β”‚ gzip: 5.91 kB +reportory:build: build/client/assets/nginx-DknmC5AR.js 35.37 kB β”‚ gzip: 4.43 kB +reportory:build: build/client/assets/houston-DnULxvSX.js 35.42 kB β”‚ gzip: 5.78 kB +reportory:build: build/client/assets/tokyo-night-hegEt444.js 35.67 kB β”‚ gzip: 6.24 kB +reportory:build: build/client/assets/chunk-DI55MBZ5-CqEIPXzm.js 36.80 kB β”‚ gzip: 11.98 kB +reportory:build: build/client/assets/erlang-DsQrWhSR.js 37.48 kB β”‚ gzip: 4.40 kB +reportory:build: build/client/assets/cobol-nwyudZeR.js 39.15 kB β”‚ gzip: 10.87 kB +reportory:build: build/client/assets/xychartDiagram-PRI3JC2R-CwSZuv3h.js 39.18 kB β”‚ gzip: 11.08 kB +reportory:build: build/client/assets/asm-D_Q5rh1f.js 40.72 kB β”‚ gzip: 8.21 kB +reportory:build: build/client/assets/shellscript-Yzrsuije.js 41.48 kB β”‚ gzip: 6.09 kB +reportory:build: build/client/assets/haskell-Df6bDoY_.js 41.49 kB β”‚ gzip: 6.44 kB +reportory:build: build/client/assets/perl-C0TMdlhV.js 43.16 kB β”‚ gzip: 4.67 kB +reportory:build: build/client/assets/d-85-TOEBH.js 43.80 kB β”‚ gzip: 8.47 kB +reportory:build: build/client/assets/chunk-B4BG7PRW-Ca01Mu8n.js 45.40 kB β”‚ gzip: 14.73 kB +reportory:build: build/client/assets/apex-DhZLUxFE.js 45.90 kB β”‚ gzip: 6.66 kB +reportory:build: build/client/assets/ruby-BvKwtOVI.js 45.91 kB β”‚ gzip: 5.68 kB +reportory:build: build/client/assets/go-Dn2_MT6a.js 46.78 kB β”‚ gzip: 5.18 kB +reportory:build: build/client/assets/catppuccin-mocha-D87Tk5Gz.js 47.26 kB β”‚ gzip: 8.00 kB +reportory:build: build/client/assets/catppuccin-latte-C9dUb6Cb.js 47.26 kB β”‚ gzip: 8.00 kB +reportory:build: build/client/assets/catppuccin-frappe-DFWUc33u.js 47.26 kB β”‚ gzip: 8.02 kB +reportory:build: build/client/assets/catppuccin-macchiato-DQyhUUbL.js 47.26 kB β”‚ gzip: 8.01 kB +reportory:build: build/client/assets/ada-bCR0ucgS.js 48.08 kB β”‚ gzip: 6.03 kB +reportory:build: build/client/assets/ganttDiagram-LVOFAZNH-BrZlP3iu.js 48.09 kB β”‚ gzip: 16.85 kB +reportory:build: build/client/assets/css-DPfMkruS.js 49.02 kB β”‚ gzip: 11.85 kB +reportory:build: build/client/assets/imba-DGztddWO.js 49.93 kB β”‚ gzip: 9.46 kB +reportory:build: build/client/assets/everforest-dark-BgDCqdQA.js 53.75 kB β”‚ gzip: 8.42 kB +reportory:build: build/client/assets/everforest-light-C8M2exoo.js 53.75 kB β”‚ gzip: 8.42 kB +reportory:build: build/client/assets/r-DiinP2Uv.js 55.81 kB β”‚ gzip: 15.13 kB +reportory:build: build/client/assets/wikitext-BhOHFoWU.js 55.89 kB β”‚ gzip: 4.76 kB +reportory:build: build/client/assets/stata-BH5u7GGu.js 56.99 kB β”‚ gzip: 12.36 kB +reportory:build: build/client/assets/html-GMplVEZG.js 57.25 kB β”‚ gzip: 11.69 kB +reportory:build: build/client/assets/ballerina-BFfxhgS-.js 58.69 kB β”‚ gzip: 8.15 kB +reportory:build: build/client/assets/markdown-Cvjx9yec.js 59.34 kB β”‚ gzip: 5.64 kB +reportory:build: build/client/assets/flowDiagram-NV44I4VS-CJ0xNUyp.js 61.31 kB β”‚ gzip: 19.68 kB +reportory:build: build/client/assets/app.chat-CKcckq1l.js 61.69 kB β”‚ gzip: 20.66 kB +reportory:build: build/client/assets/ocaml-C0hk2d4L.js 62.45 kB β”‚ gzip: 5.02 kB +reportory:build: build/client/assets/form-file-dropzone-Dhcr58YX.js 69.03 kB β”‚ gzip: 19.92 kB +reportory:build: build/client/assets/mojo-1DNp92w6.js 69.29 kB β”‚ gzip: 9.18 kB +reportory:build: build/client/assets/app.datasets._datasetId.view-C2hn0OmQ.js 69.86 kB β”‚ gzip: 19.16 kB +reportory:build: build/client/assets/python-B6aJPvgy.js 69.95 kB β”‚ gzip: 9.13 kB +reportory:build: build/client/assets/c4Diagram-YG6GDRKO-DWtVM4SH.js 70.35 kB β”‚ gzip: 19.80 kB +reportory:build: build/client/assets/c-BIGW1oBm.js 72.11 kB β”‚ gzip: 10.51 kB +reportory:build: build/client/assets/latex-BUKiar2Z.js 72.19 kB β”‚ gzip: 6.62 kB +reportory:build: build/client/assets/blockDiagram-VD42YOAC-DezzA8eY.js 73.35 kB β”‚ gzip: 20.92 kB +reportory:build: build/client/assets/vyper-CDx5xZoG.js 74.65 kB β”‚ gzip: 10.74 kB +reportory:build: build/client/assets/hack-CaT9iCJl.js 80.24 kB β”‚ gzip: 26.21 kB +reportory:build: build/client/assets/cose-bilkent-S5V4N54A-DdV35-Wz.js 81.82 kB β”‚ gzip: 22.58 kB +reportory:build: build/client/assets/csharp-CX12Zw3r.js 85.62 kB β”‚ gzip: 10.20 kB +reportory:build: build/client/assets/swift-Dg5xB15N.js 86.61 kB β”‚ gzip: 14.70 kB +reportory:build: build/client/assets/fortran-free-form-D22FLkUw.js 87.15 kB β”‚ gzip: 10.92 kB +reportory:build: build/client/assets/racket-BqYA7rlc.js 92.39 kB β”‚ gzip: 15.02 kB +reportory:build: build/client/assets/less-B1dDrJ26.js 97.63 kB β”‚ gzip: 14.70 kB +reportory:build: build/client/assets/sequenceDiagram-WL72ISMW-PU9oK2tZ.js 98.32 kB β”‚ gzip: 27.06 kB +reportory:build: build/client/assets/blade-DVc8C-J4.js 103.80 kB β”‚ gzip: 28.14 kB +reportory:build: build/client/assets/objective-c-DXmwc3jG.js 105.41 kB β”‚ gzip: 23.33 kB +reportory:build: build/client/assets/php-CDn_0X-4.js 111.00 kB β”‚ gzip: 28.52 kB +reportory:build: build/client/assets/asciidoc-Dv7Oe6Be.js 131.51 kB β”‚ gzip: 9.34 kB +reportory:build: build/client/assets/mdx-Cmh6b_Ma.js 136.11 kB β”‚ gzip: 23.35 kB +reportory:build: build/client/assets/chunk-4WY6JWTD-Dxl75A9D.js 136.57 kB β”‚ gzip: 46.16 kB +reportory:build: build/client/assets/ToolDetailsSidebar-CyuuR2QA.js 136.73 kB β”‚ gzip: 40.31 kB +reportory:build: build/client/assets/architectureDiagram-VXUJARFQ-Dhdl2Gj1.js 149.08 kB β”‚ gzip: 42.33 kB +reportory:build: build/client/assets/objective-cpp-CLxacb5B.js 171.97 kB β”‚ gzip: 30.62 kB +reportory:build: build/client/assets/javascript-wDzz0qaB.js 174.83 kB β”‚ gzip: 16.51 kB +reportory:build: build/client/assets/tsx-COt5Ahok.js 175.54 kB β”‚ gzip: 16.51 kB +reportory:build: build/client/assets/jsx-g9-lgVsj.js 177.79 kB β”‚ gzip: 16.61 kB +reportory:build: build/client/assets/typescript-BPQ3VLAy.js 181.08 kB β”‚ gzip: 16.04 kB +reportory:build: build/client/assets/angular-ts-BwZT4LLn.js 183.82 kB β”‚ gzip: 16.63 kB +reportory:build: build/client/assets/vue-vine-_Ih-lPRR.js 190.22 kB β”‚ gzip: 18.07 kB +reportory:build: build/client/assets/wolfram-lXgVvXCa.js 262.39 kB β”‚ gzip: 77.14 kB +reportory:build: build/client/assets/generateCategoricalChart-CCDBLc0H.js 283.55 kB β”‚ gzip: 74.14 kB +reportory:build: build/client/assets/entry.client-D3s3_pRB.js 330.02 kB β”‚ gzip: 99.49 kB +reportory:build: build/client/assets/hidden-field-BnEThcGo.js 410.76 kB β”‚ gzip: 114.31 kB +reportory:build: build/client/assets/mermaid.core-BIsI1JJ8.js 438.35 kB β”‚ gzip: 121.46 kB +reportory:build: build/client/assets/cytoscape.esm-CyJtwmzi.js 442.41 kB β”‚ gzip: 141.90 kB +reportory:build: build/client/assets/treemap-KMMF4GRG-Dv4_qu9B.js 516.67 kB β”‚ gzip: 129.68 kB +reportory:build: build/client/assets/wasm-CG6Dc4jp.js 622.34 kB β”‚ gzip: 230.29 kB +reportory:build: build/client/assets/cpp-CofmeUqb.js 626.08 kB β”‚ gzip: 44.82 kB +reportory:build: build/client/assets/emacs-lisp-C9XAeP06.js 779.85 kB β”‚ gzip: 196.03 kB +reportory:build: build/client/assets/index-onIOlRYB.js 961.84 kB β”‚ gzip: 292.29 kB +reportory:build: +reportory:build: (!) Some chunks are larger than 500 kB after minification. Consider: +reportory:build: - Using dynamic import() to code-split the application +reportory:build: - Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks +reportory:build: - Adjust chunk size limit for this warning via build.chunkSizeWarningLimit. +reportory:build: βœ“ built in 8.88s +reportory:build: vite v6.4.1 building SSR bundle for production... +reportory:build: transforming... +reportory:build: βœ“ 53 modules transformed. +reportory:build: βœ— Build failed in 333ms +reportory:build: Could not resolve "../../../package.json" from "app/routes/api.health.ts" +reportory:build: file: /Users/jake/projects/reportory/apps/Reportory/app/routes/api.health.ts +reportory:build: at getRollupError (file:///Users/jake/projects/reportory/node_modules/rollup/dist/es/shared/parseAst.js:401:41) +reportory:build: at error (file:///Users/jake/projects/reportory/node_modules/rollup/dist/es/shared/parseAst.js:397:42) +reportory:build: at ModuleLoader.handleInvalidResolvedId (file:///Users/jake/projects/reportory/node_modules/rollup/dist/es/shared/node-entry.js:21590:24) +reportory:build: at file:///Users/jake/projects/reportory/node_modules/rollup/dist/es/shared/node-entry.js:21550:26 { +reportory:build: code: 'UNRESOLVED_IMPORT', +reportory:build: exporter: '../../../package.json', +reportory:build: id: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.health.ts', +reportory:build: watchFiles: [ +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/entry.server.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/demo.chat.$scenario.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/schools.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.chat.new.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app._index.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/demo.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.datasets.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.datasets.new.upload.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.chat.$threadId.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.datasets._index.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/root.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.datasets.new.layout.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.datasets.$datasetId.view.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.datasets.new._index.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.chat.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.chat.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.chat.threads.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.chat.threads.$threadId.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.datasets.new.connect.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.blob.upload.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.demo.chat.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.ingest.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/settings.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/invite.$token.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/app.health.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.ingest.batch.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/organization.settings.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/logout.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/organization.members.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.auth.quick-login.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.auth.$.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/login.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/register.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.dataset.rename.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.dataset.switch.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.dataset.restore.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/settings._index.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.dataset.prompt.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.connection.create.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.dataset.archive.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.organization.switch.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.dataview.save.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.dataset.list.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.organization.invite.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.connection.test.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.dataset.delete.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/health.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/404.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/routes/api.health.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/package.json', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/auth.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/app/AppLayout.tsx', +reportory:build: '/Users/jake/projects/reportory/packages/components/src/ui/button.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/demo/scenario-prompts.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/Layout.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/chat/DemoChatInterface.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/auth.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/utils/env.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/BudgetDashboard.tsx', +reportory:build: '/Users/jake/projects/reportory/packages/components/src/utils/index.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/landing/MissionDetailModal.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/landing/MissionGrid.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/landing/MissionChartPreview.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/data/mission-data.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/server/datasets.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/app/AppDatasets.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/app/PageHeader.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/turso.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/settings/SettingsCsvUpload.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/turso/tokens.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/turso/utils.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/utils.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/turso/dataset-session.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/config/constants.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/validation/dataset.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/chat-types.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/datasets/DatasetDataTable.tsx', +reportory:build: '/Users/jake/projects/reportory/packages/components/src/ui/index.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/utils/dataset-view-name.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/db.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/drizzle/schema.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/mastra.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/ai/gateway-client.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/ai/tools/index.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/chat/server/parse-chat-request.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/chat/server/schema-context.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/chat/server/file-context.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/chat/server/dataset-prompts.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/chat/server/persistence.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/prompts/index.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/server/chat/thread-utils.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/chat/server/step-handler.server.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/lib/chat/server/thread-summary.server.ts', +reportory:build: '/Users/jake/projects/reportory/packages/components/src/index.ts', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/chat/ChatInterface.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/chat/ChatHistorySidebar.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/datasets/DatasetStatsSkeleton.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/datasets/MultiDatasetDropdown.tsx', +reportory:build: '/Users/jake/projects/reportory/apps/Reportory/app/components/chat/ChatConversationSkeleton.tsx', +reportory:build: ... 29 more items +reportory:build: ] +reportory:build: } +reportory:build: error: script "build:app" exited with code 1 +reportory:build: error: script "build" exited with code 1 +reportory:build: ERROR: command finished with error: command (/Users/jake/projects/reportory/apps/Reportory) /Users/jake/.nvm/versions/node/v22.12.0/bin/bun run build exited (1) +reportory#build: command (/Users/jake/projects/reportory/apps/Reportory) /Users/jake/.nvm/versions/node/v22.12.0/bin/bun run build exited (1) + + Tasks: 6 successful, 7 total +Cached: 6 cached, 7 total + Time: 10.612s +Failed: reportory#build + + ERROR run failed: command exited (1) +error: "turbo" exited with code 1 +���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� +Implementation complete. Summary: + +## Summary + +Updated `/api/health` for Vercel serverless: + +1. Removed serverless-irrelevant metrics: + - CPU usage (not meaningful in serverless) + - Memory usage (not meaningful in serverless) + - Process uptime (not meaningful in serverless) + +2. Kept relevant metrics: + - Database connectivity check with response time + - Environment information (NODE_ENV, version, node version) + - Deployment information (VERCEL_URL, VERCEL_ENV) β€” now included in both success and error responses + +3. Structure: + - Simplified JSON suitable for monitoring tools + - Backward compatible with `status` field (`ok` | `error`) + +4. Code improvements: + - Extracted `getDeploymentInfo()` helper + - Deployment info included in error responses for better monitoring + +The implementation follows project patterns and is ready for quality gates. The code passes linting checks and follows TypeScript best practices. + +**Next Steps:** +1. Run quality gates: `npm test`, `npm run lint`, `npm run typecheck` +2. After quality gates pass, commit the changes +3. Add task comments with commit info and revision learning + +The implementation is complete and ready for testing. Should I proceed with running the quality gates, or do you want to review the changes first? diff --git a/.devagent/plugins/ralph/tools/ralph.sh b/.devagent/plugins/ralph/tools/ralph.sh new file mode 100755 index 0000000..7339d1e --- /dev/null +++ b/.devagent/plugins/ralph/tools/ralph.sh @@ -0,0 +1,245 @@ +#!/bin/bash + +# Ralph Autonomous Execution Loop +# Reads AI tool configuration from config.json and run settings from a loop JSON. + +set -o pipefail +# Note: We do NOT use 'set -e' globally because we need to handle agent execution failures gracefully +# Instead, we use explicit error checking where needed + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CONFIG_FILE="${SCRIPT_DIR}/config.json" +RUN_FILE="" + +OUTPUT_FILE="${SCRIPT_DIR}/.ralph_last_output.txt" + +# Parse arguments +while [[ "$#" -gt 0 ]]; do + case $1 in + --run) RUN_FILE="$2"; shift ;; + *) echo "Unknown parameter passed: $1"; exit 1 ;; + esac + shift +done + +if [ -z "$RUN_FILE" ]; then + echo "Error: Run file path is required." + echo "Usage: ./ralph.sh --run <path-to-loop.json>" + exit 1 +fi + +# Resolve run file path relative to current working directory +if [ ! -f "$RUN_FILE" ]; then + echo "Error: Run file not found at $RUN_FILE" + exit 1 +fi + +# Load configuration +if [ ! -f "$CONFIG_FILE" ]; then + echo "Error: config.json not found at $CONFIG_FILE" + echo "Please run the setup workflow or ensure config exists." + exit 1 +fi + +# Validate config.json (non-run settings) +validate_config() { + local config_file="$1" + local errors=0 + + # Check required top-level fields + local required_fields=("beads" "ai_tool" "quality_gates") + for field in "${required_fields[@]}"; do + if ! jq -e ".${field}" "$config_file" > /dev/null 2>&1; then + echo "Error: Required field '${field}' is missing from config.json" >&2 + errors=$((errors + 1)) + fi + done + + # Check critical nested fields + local ai_tool_name=$(jq -r '.ai_tool.name // ""' "$config_file") + if [ -z "$ai_tool_name" ] || [ "$ai_tool_name" = "null" ]; then + echo "Error: Required field 'ai_tool.name' is missing or empty in config.json" >&2 + errors=$((errors + 1)) + fi + + local ai_tool_command=$(jq -r '.ai_tool.command // ""' "$config_file") + if [ -z "$ai_tool_command" ] || [ "$ai_tool_command" = "null" ]; then + echo "Error: Required field 'ai_tool.command' is missing or empty in config.json" >&2 + errors=$((errors + 1)) + fi + + if [ $errors -gt 0 ]; then + echo "Configuration validation failed. Please fix the errors above and try again." >&2 + return 1 + fi + + return 0 +} + +# Validate config before proceeding +if ! validate_config "$CONFIG_FILE"; then + exit 1 +fi + +# Validate run config before proceeding +validate_run_config() { + local run_file="$1" + local errors=0 + + local epic_id=$(jq -r '.epic.id // ""' "$run_file") + if [ -z "$epic_id" ] || [ "$epic_id" = "null" ]; then + echo "Error: Required field 'epic.id' is missing or empty in run file." >&2 + errors=$((errors + 1)) + fi + + local base_branch=$(jq -r '.run.git.base_branch // ""' "$run_file") + if [ -z "$base_branch" ] || [ "$base_branch" = "null" ]; then + echo "Error: Required field 'run.git.base_branch' is missing or empty in run file." >&2 + errors=$((errors + 1)) + fi + + local working_branch=$(jq -r '.run.git.working_branch // ""' "$run_file") + if [ -z "$working_branch" ] || [ "$working_branch" = "null" ]; then + echo "Error: Required field 'run.git.working_branch' is missing or empty in run file." >&2 + errors=$((errors + 1)) + elif [ "$working_branch" = "main" ]; then + echo "Error: Ralph runs are not allowed on the 'main' branch. Please configure a different run.git.working_branch." >&2 + errors=$((errors + 1)) + fi + + local max_iterations=$(jq -r '.run.execution.max_iterations // ""' "$run_file") + if [ -z "$max_iterations" ] || [ "$max_iterations" = "null" ]; then + echo "Error: Required field 'run.execution.max_iterations' is missing or empty in run file." >&2 + errors=$((errors + 1)) + elif ! jq -e '.run.execution.max_iterations | type == "number"' "$run_file" > /dev/null 2>&1; then + echo "Error: 'run.execution.max_iterations' must be a number in run file." >&2 + errors=$((errors + 1)) + fi + + local log_dir=$(jq -r '.run.execution.log_dir // ""' "$run_file") + if [ -z "$log_dir" ] || [ "$log_dir" = "null" ]; then + echo "Error: Required field 'run.execution.log_dir' is missing or empty in run file." >&2 + errors=$((errors + 1)) + fi + + if [ $errors -gt 0 ]; then + echo "Run configuration validation failed. Please fix the errors above and try again." >&2 + return 1 + fi + + return 0 +} + +if ! validate_run_config "$RUN_FILE"; then + exit 1 +fi + +AI_TOOL=$(jq -r '.ai_tool.name' "$CONFIG_FILE") +AI_COMMAND=$(jq -r '.ai_tool.command' "$CONFIG_FILE") + +EPIC_ID=$(jq -r '.epic.id' "$RUN_FILE") +BASE_BRANCH=$(jq -r '.run.git.base_branch' "$RUN_FILE") +WORKING_BRANCH=$(jq -r '.run.git.working_branch' "$RUN_FILE") +MAX_ITERATIONS=$(jq -r '.run.execution.max_iterations' "$RUN_FILE") +LOG_DIR_REL=$(jq -r '.run.execution.log_dir' "$RUN_FILE") + +# Set extended timeout for OpenCode bash commands (1 hour) - only if using opencode +if [ "$AI_TOOL" = "opencode" ]; then + export OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS=3600000 +fi + +# Note: ai_tool.name and ai_tool.command are already validated by validate_config function above + +# Setup Git Environment +export REPO_ROOT="$(git rev-parse --show-toplevel)" + +# Align log producer (Ralph) with log viewer (ralph-monitoring app) +# - Viewer resolves via RALPH_LOG_DIR (preferred) or <REPO_ROOT|cwd>/logs/ralph +# - We export both so child processes (bun router + agents) agree on paths. +if [[ "$LOG_DIR_REL" = /* ]]; then + export RALPH_LOG_DIR="$LOG_DIR_REL" +else + export RALPH_LOG_DIR="$REPO_ROOT/$LOG_DIR_REL" +fi +export RALPH_MAX_ITERATIONS="$MAX_ITERATIONS" + +echo "Starting Ralph execution loop..." +echo "AI Tool: $AI_TOOL" +echo "Command: $AI_COMMAND" +echo "Max iterations: $MAX_ITERATIONS" + +# Ensure Beads DB path is absolute and exported +BEADS_DB_REL=$(jq -r '.beads.database_path // ".beads/beads.db"' "$CONFIG_FILE") +# Check if path is already absolute +if [[ "$BEADS_DB_REL" = /* ]]; then + export BEADS_DB="$BEADS_DB_REL" +else + export BEADS_DB="$REPO_ROOT/$BEADS_DB_REL" +fi + +echo "Running in Epic mode for: $EPIC_ID" + +# Validate Epic exists +if ! bd show "$EPIC_ID" --json > /dev/null 2>&1; then + echo "Error: Epic '$EPIC_ID' not found in Beads database." >&2 + echo "Please verify the Epic ID and ensure it exists in the database." >&2 + exit 1 +fi + +# Validate working branch exists +if ! git show-ref --verify --quiet "refs/heads/$WORKING_BRANCH"; then + echo "Error: Working branch '$WORKING_BRANCH' does not exist." >&2 + echo "Please create the branch or update run.git.working_branch in the run file." >&2 + exit 1 +fi + +# Validate current branch matches working branch +CURRENT_BRANCH=$(git branch --show-current) +if [ "$CURRENT_BRANCH" != "$WORKING_BRANCH" ]; then + echo "Error: Current branch '$CURRENT_BRANCH' does not match configured working branch '$WORKING_BRANCH'." >&2 + echo "Please switch to the working branch: git checkout $WORKING_BRANCH" >&2 + exit 1 +fi + +echo "Running in current branch: $CURRENT_BRANCH" +echo "Working directory: $(pwd)" + +# Check if Bun is available (required for router) +if ! command -v bun &> /dev/null; then + echo "Error: Bun is required for label-driven routing but not found in PATH" + echo "Please install Bun: https://bun.sh" + exit 1 +fi + +# Route execution through Bun router +# The router handles sequential execution, agent selection, failure tracking, and blocking +RALPH_TS="${SCRIPT_DIR}/ralph.ts" + +if [ ! -f "$RALPH_TS" ]; then + echo "Error: Ralph router not found at $RALPH_TS" + exit 1 +fi + +echo "Routing execution through Bun router..." +echo "Epic ID: $EPIC_ID" + +# Execute Bun router with epic ID +# The router will handle: +# - Sequential agent execution +# - Label-based agent selection +# - Failure tracking and blocking after 5 failures +# - Re-checking ready tasks after each run +bun "$RALPH_TS" --epic "$EPIC_ID" + +EXIT_CODE=$? + +if [ $EXIT_CODE -ne 0 ]; then + echo "Error: Router execution failed (exit code: $EXIT_CODE)" >&2 + exit $EXIT_CODE +fi + +# Show Git progress summary +echo "" +echo "=== Git Progress Summary ===" +git log --oneline --grep="ralph:" -n 10 + diff --git a/.devagent/plugins/ralph/tools/ralph.ts b/.devagent/plugins/ralph/tools/ralph.ts new file mode 100755 index 0000000..7dffc5c --- /dev/null +++ b/.devagent/plugins/ralph/tools/ralph.ts @@ -0,0 +1,1283 @@ +#!/usr/bin/env bun + +/** + * Ralph Label-Driven Task Router + * + * Loads config and agent profiles, reads ready tasks, and resolves + * the correct agent profile based on task labels. + */ + +import { existsSync, readFileSync } from 'fs'; +import { dirname, isAbsolute, join } from 'path'; +import { fileURLToPath } from 'url'; +import { Database } from 'bun:sqlite'; + +let metadataDb: Database | null = null; +let metadataDbPath: string | null = null; + +function getMetadataDb(dbPath: string): Database { + if (metadataDb && metadataDbPath === dbPath) return metadataDb; + metadataDb = new Database(dbPath); + metadataDbPath = dbPath; + return metadataDb; +} +import type { BeadsComment, BeadsTask } from './lib/beads.types'; +import { compareHierarchicalIds } from './lib/hierarchical-id'; +import { openRalphTaskLogWriter } from './lib/ralph-log-writer.server'; + +// Get script directory +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const SCRIPT_DIR = __dirname; +const REPO_ROOT = join(SCRIPT_DIR, '..', '..', '..', '..'); +const EPIC_CONTEXT_TASK_LIMIT = 50; +const EPIC_STATUS_ORDER = ['in_progress', 'open', 'blocked', 'closed'] as const; + +function resolveRalphLogDirFromConfig(config: Config): string { + const configured = config.execution.log_dir?.trim(); + if (!configured) return join(REPO_ROOT, 'logs', 'ralph'); + return isAbsolute(configured) ? configured : join(REPO_ROOT, configured); +} + +function resolveMaxIterations(config: Config): number { + const override = process.env.RALPH_MAX_ITERATIONS?.trim(); + if (override) { + const parsed = Number.parseInt(override, 10); + if (!Number.isFinite(parsed) || parsed < 1) { + throw new Error(`Invalid RALPH_MAX_ITERATIONS value: ${override}`); + } + return parsed; + } + return config.execution.max_iterations || 50; +} + +/** + * Resolve the Beads database path from config + */ +function resolveDatabasePath(config: Config): string { + const dbPath = config.beads.database_path || '.beads/beads.db'; + return isAbsolute(dbPath) ? dbPath : join(REPO_ROOT, dbPath); +} + +/** + * Task execution metadata interface + */ +interface TaskMetadata { + issue_id: string; + failure_count: number; + last_failure_at: string | null; + last_success_at: string | null; + execution_count: number; +} + +/** + * Initialize the ralph_execution_metadata table if it doesn't exist. + * This should be called on startup before any metadata operations. + * + * @param dbPath - Path to the Beads SQLite database + * @throws Error if table creation fails + */ +function initializeMetadataTable(dbPath: string): void { + if (!existsSync(dbPath)) { + throw new Error(`Beads database not found at ${dbPath}. Run 'bd init' first.`); + } + + const db = getMetadataDb(dbPath); + + try { + db.exec(` + CREATE TABLE IF NOT EXISTS ralph_execution_metadata ( + issue_id TEXT PRIMARY KEY, + failure_count INTEGER DEFAULT 0, + last_failure_at DATETIME, + last_success_at DATETIME, + execution_count INTEGER DEFAULT 0, + FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE + ) + `); + } catch (error) { + throw new Error(`Failed to initialize ralph_execution_metadata table: ${error instanceof Error ? error.message : String(error)}`); + } +} + +/** + * Get task execution metadata, creating a default record if it doesn't exist (lazy insert). + * + * @param dbPath - Path to the Beads SQLite database + * @param issueId - The Beads issue ID + * @returns Task metadata with default values if record didn't exist + * @throws Error if database operation fails + */ +function getTaskMetadata(dbPath: string, issueId: string): TaskMetadata { + if (!existsSync(dbPath)) { + throw new Error(`Beads database not found at ${dbPath}. Run 'bd init' first.`); + } + + const db = getMetadataDb(dbPath); + + try { + // Try to get existing record + const stmt = db.prepare('SELECT * FROM ralph_execution_metadata WHERE issue_id = ?'); + const existing = stmt.get(issueId) as TaskMetadata | undefined; + + if (existing) { + return existing; + } + + // Record doesn't exist - create with defaults (lazy insert) + const insertStmt = db.prepare(` + INSERT INTO ralph_execution_metadata (issue_id, failure_count, execution_count) + VALUES (?, 0, 0) + `); + insertStmt.run(issueId); + + // Return the newly created record + return { + issue_id: issueId, + failure_count: 0, + last_failure_at: null, + last_success_at: null, + execution_count: 0 + }; + } catch (error) { + throw new Error(`Failed to get task metadata for ${issueId}: ${error instanceof Error ? error.message : String(error)}`); + } +} + +/** + * Update task execution metadata with new counts and timestamps. + * + * @param dbPath - Path to the Beads SQLite database + * @param issueId - The Beads issue ID + * @param updates - Partial metadata updates + * @throws Error if database operation fails + */ +function updateTaskMetadata( + dbPath: string, + issueId: string, + updates: { + failure_count?: number; + last_failure_at?: string | null; + last_success_at?: string | null; + execution_count?: number; + } +): void { + if (!existsSync(dbPath)) { + throw new Error(`Beads database not found at ${dbPath}. Run 'bd init' first.`); + } + + const db = getMetadataDb(dbPath); + + try { + // Build update query dynamically based on provided fields + const fields: string[] = []; + const values: (string | number | null)[] = []; + + if (updates.failure_count !== undefined) { + fields.push('failure_count = ?'); + values.push(updates.failure_count); + } + if (updates.last_failure_at !== undefined) { + fields.push('last_failure_at = ?'); + values.push(updates.last_failure_at); + } + if (updates.last_success_at !== undefined) { + fields.push('last_success_at = ?'); + values.push(updates.last_success_at); + } + if (updates.execution_count !== undefined) { + fields.push('execution_count = ?'); + values.push(updates.execution_count); + } + + if (fields.length === 0) { + // No updates to apply + return; + } + + values.push(issueId); + + const updateStmt = db.prepare(` + UPDATE ralph_execution_metadata + SET ${fields.join(', ')} + WHERE issue_id = ? + `); + updateStmt.run(...values); + } catch (error) { + throw new Error(`Failed to update task metadata for ${issueId}: ${error instanceof Error ? error.message : String(error)}`); + } +} + +// Types +interface AgentProfile { + name: string; + label: string; + ai_tool: { + name: string; + command: string; + env?: Record<string, string>; + }; + model_tier: string; + instructions_path: string; +} + +interface Config { + beads: { + database_path: string; + project: string; + }; + ai_tool: { + name: string; + command: string; + env: Record<string, string>; + }; + quality_gates: { + template: string; + overrides: Record<string, unknown>; + }; + beads_payload: string; + roles?: Record<string, string>; + role_briefs?: Record<string, string>; + prompts?: { + preamble_path?: string; + }; + execution: { + require_confirmation: boolean; + max_iterations: number; + log_dir?: string; + }; + agents: Record<string, string>; // label -> profile filename +} + +type BeadsTaskDetails = Omit<BeadsTask, 'acceptance_criteria' | 'parent_id'> & { + // Beads CLI sometimes returns strings or arrays for acceptance_criteria + acceptance_criteria?: string | string[] | null; + parent_id?: string | null; +}; + +function buildRunRolesAndRoutingSection(config: Config): string { + const labels = Object.keys(config.agents ?? {}).sort((a, b) => a.localeCompare(b)); + const hasRoles = Boolean(config.roles && Object.keys(config.roles).length); + const hasBriefs = Boolean(config.role_briefs && Object.keys(config.role_briefs).length); + + const lines: string[] = []; + lines.push('## Run roles & routing (from config)'); + lines.push(''); + lines.push('These values are loaded from the active run config so roles/agents can vary per run.'); + lines.push(''); + + if (!labels.length) { + lines.push('- No routing labels found in `config.agents` (cannot route tasks).'); + return lines.join('\n'); + } + + lines.push('### Routing labels'); + for (const label of labels) { + const displayName = (hasRoles ? config.roles?.[label] : undefined) ?? label; + const profile = config.agents[label]; + const brief = (hasBriefs ? config.role_briefs?.[label] : undefined)?.trim(); + + lines.push(`- **${label}**: ${displayName} (profile: \`${profile}\`)${brief ? ` β€” ${brief}` : ''}`); + } + + lines.push(''); + lines.push('### Task creation logic (when you discover work)'); + lines.push('- Stay in the current task if it’s required to meet that task’s acceptance criteria and is in-scope.'); + lines.push( + '- Create a new Beads task if it’s out-of-scope, a follow-up, or a separate concern that needs its own owner/verification.' + ); + lines.push(''); + lines.push('### Creating a task Ralph can pick up (routing requirements)'); + lines.push('- Make it a **direct epic child** and apply **exactly one** routing label from the list above.'); + lines.push('- Add ordering constraints with dependency edges: `bd dep add <task> <depends-on>`.'); + lines.push('- Ensure epic-scoped queries work: `bd update <task> --parent <epic>`.'); + + if (!hasBriefs) { + lines.push(''); + lines.push( + 'Tip: add `role_briefs` in `config.json` (map of label β†’ short description) to share run-specific role guidance.' + ); + } + + return lines.join('\n'); +} + +type SanitizedConfig = Omit<Config, 'ai_tool'> & { + ai_tool: Omit<Config['ai_tool'], 'env'>; +}; + +type SanitizedAgentProfile = Omit<AgentProfile, 'ai_tool'> & { + ai_tool: Omit<AgentProfile['ai_tool'], 'env'>; +}; + +function formatDuration(ms: number): string { + const totalSeconds = Math.max(0, Math.round(ms / 1000)); + const hours = Math.floor(totalSeconds / 3600); + const minutes = Math.floor((totalSeconds % 3600) / 60); + const seconds = totalSeconds % 60; + + const parts: string[] = []; + if (hours) parts.push(`${hours}h`); + if (minutes || hours) parts.push(`${minutes}m`); + parts.push(`${seconds}s`); + return parts.join(' '); +} + +function formatDateTimeLocal(date: Date): string { + return new Intl.DateTimeFormat('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false, + timeZoneName: 'short' + }).format(date); +} + +function toJsonPreview(input: string, maxChars = 200): string { + const trimmed = input.trim(); + if (!trimmed) return '<empty>'; + const normalized = trimmed.replace(/\s+/g, ' '); + return normalized.length <= maxChars ? normalized : `${normalized.slice(0, maxChars)}…`; +} + +function parseJsonWithContext<T>(input: string, context: string): T { + try { + return JSON.parse(input) as T; + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + const preview = toJsonPreview(input); + throw new Error(`Failed to parse JSON (${context}): ${message}. Output preview: ${preview}`); + } +} + +function extractExitCodeFromText(input: string): number | null { + const match = input.match(/exit code:\s*(-?\d+)/i); + if (!match?.[1]) return null; + const parsed = Number.parseInt(match[1], 10); + return Number.isFinite(parsed) ? parsed : null; +} + +/** + * Load configuration from config.json + */ +function loadConfig(): Config { + const configPath = join(SCRIPT_DIR, 'config.json'); + + if (!existsSync(configPath)) { + throw new Error(`Config file not found at ${configPath}`); + } + + const configContent = readFileSync(configPath, 'utf-8'); + const config = parseJsonWithContext<Config>(configContent, `config file at ${configPath}`); + + // Validate required fields + if (!config.agents) { + throw new Error("Config missing required 'agents' mapping"); + } + + if (!config.agents['project-manager']) { + throw new Error("Config missing required 'project-manager' agent in agents mapping"); + } + + return config; +} + +/** + * Load agent profile from JSON file + */ +function loadAgentProfile(profileFilename: string): AgentProfile { + const profilePath = join(SCRIPT_DIR, '..', 'agents', profileFilename); + + if (!existsSync(profilePath)) { + throw new Error(`Agent profile not found at ${profilePath}`); + } + + const profileContent = readFileSync(profilePath, 'utf-8'); + const profile = parseJsonWithContext<AgentProfile>( + profileContent, + `agent profile ${profileFilename} at ${profilePath}` + ); + + // Validate required fields + if (!profile.name || !profile.label || !profile.ai_tool || !profile.instructions_path) { + throw new Error(`Invalid agent profile: missing required fields in ${profileFilename}`); + } + + return profile; +} + +/** + * Get labels for a task using Beads CLI + */ +function getTaskLabels(taskId: string): string[] { + try { + const result = Bun.spawnSync(['bd', 'label', 'list', taskId], { + stdout: 'pipe', + stderr: 'pipe' + }); + + if (result.exitCode !== 0) { + // Task has no labels or error occurred + const stderr = result.stderr.toString(); + if (stderr.includes('has no labels')) { + return []; + } + // Log error but don't throw - treat as no labels + console.warn(`Warning: Failed to get labels for task ${taskId}: ${stderr}`); + return []; + } + + const output = result.stdout.toString().trim(); + if (!output) { + return []; + } + + // Parse labels from output + // Format: "🏷 Labels for <task-id>:\n - label1\n - label2" + const lines = output.split('\n'); + const labels: string[] = []; + + for (const line of lines) { + // Skip header line and empty lines + if (line.includes('🏷') || line.trim().length === 0) { + continue; + } + + // Extract label from lines like " - label" or "- label" + const match = line.match(/^\s*-\s*(.+)$/); + if (match && match[1]) { + labels.push(match[1].trim()); + } + } + + return labels; + } catch (error) { + console.warn(`Warning: Error getting labels for task ${taskId}: ${error}`); + return []; + } +} + +/** + * Read ready tasks from Beads + * Note: When running with --epic filter, we may need to query with --parent to get child tasks + */ +function getReadyTasks(epicId?: string): BeadsTask[] { + try { + const args = ['bd', 'ready', '--json', '--limit', '200']; + if (epicId) { + args.push('--parent', epicId); + } + const result = Bun.spawnSync(args, { + stdout: 'pipe', + stderr: 'pipe' + }); + + if (result.exitCode !== 0) { + const stderr = result.stderr.toString(); + throw new Error(`Failed to get ready tasks: ${stderr}`); + } + + const output = result.stdout.toString().trim(); + if (!output) { + return []; + } + + const tasks = parseJsonWithContext<BeadsTask[]>(output, `bd ready --json${epicId ? ` --parent ${epicId}` : ''}`); + const readyTasks = Array.isArray(tasks) ? tasks : []; + + if (epicId && readyTasks.length === 0) { + // Fallback: Some Beads setups don't auto-populate parent links for explicit IDs. + // Try an unscoped ready query and let the caller filter by epic ID. + const fallbackResult = Bun.spawnSync(['bd', 'ready', '--json', '--limit', '200'], { + stdout: 'pipe', + stderr: 'pipe' + }); + if (fallbackResult.exitCode !== 0) { + const stderr = fallbackResult.stderr.toString(); + throw new Error(`Failed to get ready tasks (fallback): ${stderr}`); + } + const fallbackOutput = fallbackResult.stdout.toString().trim(); + if (!fallbackOutput) { + return []; + } + const fallbackTasks = parseJsonWithContext<BeadsTask[]>(fallbackOutput, 'bd ready --json (fallback, unscoped)'); + const fallbackList = Array.isArray(fallbackTasks) ? fallbackTasks : []; + return fallbackList.filter(task => task.parent_id === epicId || task.id.startsWith(`${epicId}.`)); + } + + return readyTasks; + } catch (error) { + // Invalid JSON or empty output should not crash the router; surface context for debugging. + console.warn(`Warning: Failed to get ready tasks${epicId ? ` for epic ${epicId}` : ''}:`, error); + return []; + } +} + +/** + * Resolve agent profile for a task based on its labels + * + * Strategy: + * 1. Get task labels + * 2. Use first label that matches an agent in config.agents + * 3. Default to "project-manager" if no labels or no match + */ +function resolveAgentForTask( + task: BeadsTask, + config: Config +): { + profile: AgentProfile; + matchedLabel: string | null; + labels: string[]; + fallbackReason: 'no_labels' | 'no_match' | null; +} { + const labels = getTaskLabels(task.id); + + // If no labels, default to project-manager + if (labels.length === 0) { + const fallbackProfileFilename = config.agents['project-manager']; + const profile = loadAgentProfile(fallbackProfileFilename); + return { profile, matchedLabel: null, labels, fallbackReason: 'no_labels' }; + } + + // Try to match first label to an agent + for (const label of labels) { + const profileFilename = config.agents[label]; + if (profileFilename) { + const profile = loadAgentProfile(profileFilename); + return { profile, matchedLabel: label, labels, fallbackReason: null }; + } + } + + // No matching label found, default to project-manager + const fallbackProfileFilename = config.agents['project-manager']; + const profile = loadAgentProfile(fallbackProfileFilename); + return { profile, matchedLabel: null, labels, fallbackReason: 'no_match' }; +} + + +/** + * Get full task details from Beads + */ +function getTaskDetails(taskId: string): BeadsTaskDetails { + try { + const result = Bun.spawnSync(['bd', 'show', taskId, '--json'], { + stdout: 'pipe', + stderr: 'pipe' + }); + + if (result.exitCode !== 0) { + throw new Error(`Failed to get task details: ${result.stderr.toString()}`); + } + + const output = result.stdout.toString().trim(); + const taskData = parseJsonWithContext<unknown>(output, `bd show ${taskId} --json`); + + // Handle array response (Beads sometimes returns arrays) + const task = Array.isArray(taskData) ? taskData[0] : taskData; + return task as BeadsTaskDetails; + } catch (error) { + throw new Error(`Failed to get task details for ${taskId}: ${error}`); + } +} + +/** + * Build prompt for agent execution + */ +function buildPrompt(task: BeadsTaskDetails, epicId: string | null, agentInstructions: string, config: Config): string { + const description = task.description || ''; + const acceptance = Array.isArray(task.acceptance_criteria) + ? task.acceptance_criteria.join('; ') + : task.acceptance_criteria || ''; + + // Load preamble if configured + let preamble = ''; + if (config.prompts?.preamble_path) { + const preamblePath = join(REPO_ROOT, config.prompts.preamble_path); + if (existsSync(preamblePath)) { + try { + preamble = readFileSync(preamblePath, 'utf-8') + '\n\n---\n\n'; + } catch (error) { + console.warn(`Warning: Failed to read preamble from ${preamblePath}: ${error}`); + } + } + } + + const runRolesAndRouting = buildRunRolesAndRoutingSection(config) + '\n\n---\n\n'; + + let epicContext = ''; + if (epicId) { + const epicTasks = getEpicTasks(epicId); + + if (epicTasks.length > 0) { + const statusIndex = new Map<string, number>(EPIC_STATUS_ORDER.map((status, index) => [status, index])); + const orderedTasks = epicTasks.slice().sort((a, b) => { + const aIndex = statusIndex.get(a.status) ?? EPIC_STATUS_ORDER.length; + const bIndex = statusIndex.get(b.status) ?? EPIC_STATUS_ORDER.length; + if (aIndex !== bIndex) return aIndex - bIndex; + return compareHierarchicalIds(a.id, b.id); + }); + + const totalTasks = orderedTasks.length; + const visibleTasks = orderedTasks.slice(0, EPIC_CONTEXT_TASK_LIMIT); + const remainingCount = totalTasks - visibleTasks.length; + const taskList = visibleTasks + .map(t => { + const marker = t.id === task.id ? ' ← current task' : ''; + return `- ${t.id} (${t.status}): ${t.title}${marker}`; + }) + .join('\n'); + + const progressSummary = getEpicProgressSummary(epicId); + epicContext = ` +### EPIC CONTEXT: ${epicId} + +${progressSummary} + +**Sub-issues (context only, showing ${visibleTasks.length} of ${totalTasks}):** +${taskList} +${remainingCount > 0 ? `\n- ...and ${remainingCount} more` : ''} +`; + } + } + + return `${preamble}${runRolesAndRouting}Task: ${description} +Task ID: ${task.id} +Parent Epic ID: ${epicId || 'null'} + +Acceptance Criteria: +${acceptance} + +CONTEXT: +You are working on task ${task.id} which is part of Epic ${epicId || 'null'}.${epicContext} +You can view full epic details using: bd show ${epicId || task.id} + +### AGENT OPERATING INSTRUCTIONS +${agentInstructions} + +### EXECUTION INSTRUCTIONS +Please implement this task following the instructions above and the project's coding standards.`; +} + +/** + * Load agent instructions from agent profile's instructions_path, with fallback to AGENTS.md + */ +function loadAgentInstructions(agentProfile?: AgentProfile): string { + // Try to load agent-specific instructions first + if (agentProfile?.instructions_path) { + const agentInstructionsPath = join(REPO_ROOT, agentProfile.instructions_path); + if (existsSync(agentInstructionsPath)) { + try { + const agentInstructions = readFileSync(agentInstructionsPath, 'utf-8'); + // Also include base AGENTS.md for shared context + const baseInstructions = loadBaseAgentInstructions(); + return `${agentInstructions}\n\n---\n\n## Shared Ralph Instructions\n${baseInstructions}`; + } catch (error) { + console.warn(`Warning: Failed to read agent instructions from ${agentInstructionsPath}: ${error}`); + } + } + } + + // Fallback to base AGENTS.md + return loadBaseAgentInstructions(); +} + +/** + * Load base agent instructions from AGENTS.md + */ +function loadBaseAgentInstructions(): string { + const agentsPath = join(SCRIPT_DIR, '..', 'AGENTS.md'); + + if (!existsSync(agentsPath)) { + console.warn(`Warning: AGENTS.md not found at ${agentsPath}`); + return ''; + } + + try { + return readFileSync(agentsPath, 'utf-8'); + } catch (error) { + console.warn(`Warning: Failed to read AGENTS.md: ${error}`); + return ''; + } +} + +/** + * Execute agent for a task using Bun.spawn + */ +async function executeAgent( + task: BeadsTask, + agent: AgentProfile, + prompt: string, + config: Config +): Promise<{ success: boolean; exitCode: number; error?: string; failureType?: 'timeout' | 'failed' }> { + const logWriter = openRalphTaskLogWriter(task.id); + logWriter.write(`\n=== ralph: start ${task.id} (${new Date().toISOString()}) ===\n`); + + const drainStreamToLogAndCaptureTail = async ( + stream: ReadableStream<Uint8Array> | null, + maxChars: number + ): Promise<string> => { + if (!stream) return ''; + const reader = stream.getReader(); + const decoder = new TextDecoder(); + let captured = ''; + + while (true) { + const { value, done } = await reader.read(); + if (done) break; + if (!value) continue; + + // Write bytes directly to file for real-time tail streaming. + logWriter.write(value); + + // Keep a bounded tail for error comments. + const text = decoder.decode(value, { stream: true }); + if (text) { + captured += text; + if (captured.length > maxChars) captured = captured.slice(captured.length - maxChars); + } + } + + const flushed = decoder.decode(); + if (flushed) { + captured += flushed; + if (captured.length > maxChars) captured = captured.slice(captured.length - maxChars); + } + + return captured; + }; + + const command = agent.ai_tool.command; + const args: string[] = []; + + // Build command arguments based on AI tool type + if (agent.ai_tool.name === 'agent' || agent.ai_tool.name === 'cursor') { + args.push('-p', '--force', '--output-format', 'text', prompt); + } else if (agent.ai_tool.name === 'opencode') { + args.push('run', prompt); + } else { + // Generic fallback - assume command takes prompt as last arg + args.push(prompt); + } + + // Setup environment + const env = { + ...process.env, + ...agent.ai_tool.env, + ...config.ai_tool.env + }; + + // For OpenCode, set OPENCODE_CLI=1 + if (agent.ai_tool.name === 'opencode') { + env.OPENCODE_CLI = '1'; + } + + // Agent timeout: 2 hours (7200 seconds) + const AGENT_TIMEOUT = 7200 * 1000; // milliseconds + + try { + const proc = Bun.spawn([command, ...args], { + env, + stdout: 'pipe', + stderr: 'pipe' + }); + + const MAX_CAPTURED_OUTPUT_CHARS = 30_000; + const stdoutPromise = drainStreamToLogAndCaptureTail(proc.stdout, MAX_CAPTURED_OUTPUT_CHARS); + const stderrPromise = drainStreamToLogAndCaptureTail(proc.stderr, MAX_CAPTURED_OUTPUT_CHARS); + + // Set timeout + let didTimeout = false; + const timeoutId = setTimeout(() => { + didTimeout = true; + proc.kill(9); + }, AGENT_TIMEOUT); + + // Wait for process to complete + const [exitCode, stdoutTail, stderrTail] = await Promise.all([proc.exited, stdoutPromise, stderrPromise]); + clearTimeout(timeoutId); + + const normalizedExitCode = didTimeout && exitCode === 0 ? -1 : exitCode; + + logWriter.write(`\n=== ralph: exit ${task.id} (code: ${normalizedExitCode}) ===\n`); + logWriter.close(); + + if (didTimeout) { + return { + success: false, + exitCode: normalizedExitCode, + failureType: 'timeout', + error: stderrTail || stdoutTail || `Agent timed out after ${Math.round(AGENT_TIMEOUT / 1000)}s` + }; + } + + if (normalizedExitCode === 0) { + return { success: true, exitCode: 0 }; + } else { + return { + success: false, + exitCode: normalizedExitCode, + failureType: 'failed', + error: stderrTail || stdoutTail || `Agent exited with code ${normalizedExitCode}` + }; + } + } catch (error) { + try { + logWriter.write( + `\n=== ralph: spawn error ${task.id} (${new Date().toISOString()}) ===\n${error instanceof Error ? error.message : String(error)}\n` + ); + logWriter.close(); + } catch { + // ignore log writer errors when already failing + } + return { + success: false, + exitCode: -1, + failureType: 'failed', + error: error instanceof Error ? error.message : String(error) + }; + } +} + +function getEpicProgressSummary(epicId: string): string { + const tasks = getEpicTasks(epicId); + const total = tasks.length; + const closed = tasks.filter(t => t.status === 'closed').length; + const inProgress = tasks.filter(t => t.status === 'in_progress').length; + const blocked = tasks.filter(t => t.status === 'blocked').length; + const open = tasks.filter(t => t.status === 'open').length; + + const completionPct = total === 0 ? 0 : Math.round((closed / total) * 100); + return `**Epic Progress:** ${closed}/${total} closed | ${inProgress} in_progress | ${blocked} blocked | ${open} open +**Completion:** ${completionPct}%`; +} + +function getEpicTasks(epicId: string): Array<{ + id: string; + title: string; + status: string; +}> { + try { + const runBdList = (args: string[]): BeadsTask[] => { + const result = Bun.spawnSync(args, { stdout: 'pipe', stderr: 'pipe' }); + + if (result.exitCode !== 0) { + console.warn(`Warning: Failed to list tasks: ${result.stderr.toString()}`); + return []; + } + + const output = result.stdout.toString().trim(); + if (!output) return []; + + try { + const parsed = parseJsonWithContext<unknown>(output, `bd list (${args.join(' ')})`); + return Array.isArray(parsed) ? (parsed as BeadsTask[]) : []; + } catch (error) { + console.warn(`Warning: Failed to parse bd list output: ${error}`); + return []; + } + }; + + // 1) Hierarchical descendants (IDs like epic.1, epic.1.1). Requires scanning tasks once. + // Use --all and --limit 0 so we don't silently omit closed tasks or truncate at 50. + const allTasks = runBdList(['bd', 'list', '--all', '--limit', '0', '--json']); + const hierarchicalTasks = allTasks.filter(t => t.id.startsWith(`${epicId}.`)); + + // 2) Explicit parent linkage (covers non-hierarchical IDs). One bounded call. + const childTasks = runBdList(['bd', 'list', '--parent', epicId, '--all', '--limit', '0', '--json']); + + // Combine and deduplicate + const allEpicTasks = Array.from(new Map([...hierarchicalTasks, ...childTasks].map(t => [t.id, t])).values()); + + return allEpicTasks.map(task => ({ id: task.id, title: task.title, status: task.status })); + } catch (error) { + console.warn(`Warning: Error fetching epic tasks for ${epicId}: ${error}`); + return []; + } +} + +/** + * Check if epic is blocked or closed + */ +function isEpicBlocked(epicId: string): boolean { + try { + const result = Bun.spawnSync(['bd', 'show', epicId, '--json'], { + stdout: 'pipe', + stderr: 'pipe' + }); + + if (result.exitCode !== 0) { + return false; // Can't determine, assume not blocked + } + + const output = result.stdout.toString().trim(); + const epicData = parseJsonWithContext<unknown>(output, `bd show ${epicId} --json`); + const epic = Array.isArray(epicData) ? epicData[0] : epicData; + const status = epic?.status; + + return status === 'blocked' || status === 'closed'; + } catch (error) { + console.warn(`Warning: Failed to check epic status for ${epicId}: ${error}`); + return false; + } +} + +/** + * Main execution loop + * + * Executes agents sequentially, re-checking ready tasks after each run. + * Handles failures by resetting to open and blocking after 5 failures. + */ +export async function executeLoop(epicId: string): Promise<void> { + const config = loadConfig(); + const MAX_FAILURES = 5; + + // Align log producer (Ralph) with log viewer (ralph-monitoring app): + // Use the same env vars + path mapping as `getLogFilePath()` in `logs.server.ts`. + process.env.REPO_ROOT ??= REPO_ROOT; + process.env.RALPH_LOG_DIR ??= resolveRalphLogDirFromConfig(config); + + // Initialize metadata table on startup + const dbPath = resolveDatabasePath(config); + try { + initializeMetadataTable(dbPath); + console.log('Initialized ralph_execution_metadata table'); + } catch (error) { + console.error(`Failed to initialize metadata table: ${error}`); + throw error; // Fail fast - cannot proceed without metadata table + } + + console.log('Starting Ralph execution loop...'); + console.log(`Epic ID: ${epicId}`); + console.log(`Max failures before blocking: ${MAX_FAILURES}`); + + let iteration = 0; + const maxIterations = resolveMaxIterations(config); + let previousIterationDurationMs: number | null = null; + + while (iteration < maxIterations) { + iteration++; + const iterationStartedAtMs = Date.now(); + if (previousIterationDurationMs !== null) { + console.log(`\nPrevious iteration took: ${formatDuration(previousIterationDurationMs)}`); + } + console.log(`\n=== Iteration ${iteration} ===`); + console.log(`Started: ${formatDateTimeLocal(new Date(iterationStartedAtMs))}`); + + try { + const epicTasksAll = getEpicTasks(epicId); + if (epicTasksAll.length > 0) { + const completed = epicTasksAll.filter(t => t.status === 'closed').length; + const remaining = epicTasksAll.length - completed; + console.log(`Epic tasks: ${completed} completed / ${remaining} remaining (${epicTasksAll.length} total)`); + } + + // Check if epic is blocked/closed + if (isEpicBlocked(epicId)) { + console.log(`Epic ${epicId} is blocked or closed. Stopping execution.`); + break; + } + + // Get ready tasks from the entire tree + const readyTasks = getReadyTasks(epicId); + + // Preserve plan order: hierarchical IDs must be compared numerically, not lexicographically. + readyTasks.sort((a, b) => compareHierarchicalIds(a.id, b.id)); + + if (readyTasks.length === 0) { + console.log('No more ready tasks in the objective tree. Execution complete.'); + break; + } + + console.log(`Ready tasks discovered: ${readyTasks.length}`); + + // Process first ready task + const task = readyTasks[0]; + + // Get full task details + let taskDetails: BeadsTaskDetails; + try { + taskDetails = getTaskDetails(task.id); + } catch (error) { + console.error(`Failed to get task details for ${task.id}: ${error}`); + continue; + } + + const taskTitle = taskDetails.title?.trim() ? taskDetails.title.trim() : '<no title>'; + console.log(`Processing task: ${task.id} β€” ${taskTitle}`); + console.log(`Task started: ${formatDateTimeLocal(new Date())}`); + + // Get task metadata (lazy insert if doesn't exist) + let taskMetadata: TaskMetadata; + try { + taskMetadata = getTaskMetadata(dbPath, task.id); + } catch (error) { + console.error(`Failed to get task metadata for ${task.id}: ${error}`); + throw error; // Fail fast + } + + // Increment execution count + try { + updateTaskMetadata(dbPath, task.id, { + execution_count: taskMetadata.execution_count + 1 + }); + taskMetadata.execution_count += 1; + } catch (error) { + console.error(`Failed to update execution count for ${task.id}: ${error}`); + throw error; // Fail fast + } + + const failureCount = taskMetadata.failure_count; + + const isDryRun = process.argv.includes('--dry-run'); + + if (failureCount >= MAX_FAILURES) { + console.log(`Task ${task.id} has failed ${failureCount} times. Blocking task.`); + if (!isDryRun) { + Bun.spawnSync(['bd', 'update', task.id, '--status', 'blocked'], { + stdout: 'pipe', + stderr: 'pipe' + }); + Bun.spawnSync( + [ + 'bd', + 'comments', + 'add', + task.id, + `Task blocked after ${failureCount} failures. Manual intervention required.` + ], + { + stdout: 'pipe', + stderr: 'pipe' + } + ); + } else { + console.log('Dry run: skipping task blocking mutations.'); + } + continue; + } + + // Mark task as in progress + if (!isDryRun) { + Bun.spawnSync(['bd', 'update', task.id, '--status', 'in_progress'], { + stdout: 'pipe', + stderr: 'pipe' + }); + } + + // Resolve agent for task + const { profile: agent, matchedLabel, labels, fallbackReason } = resolveAgentForTask(task, config); + const validLabels = Object.keys(config.agents).sort(); + if (!matchedLabel) { + if (fallbackReason === 'no_labels') { + console.log( + `Routing fallback: task ${task.id} has no labels. Using 'project-manager'. Add exactly one label from: ${validLabels.join(', ')}.` + ); + } else if (fallbackReason === 'no_match') { + console.log( + `Routing fallback: task ${task.id} labels [${labels.join(', ')}] do not match config mapping keys. Using 'project-manager'. Valid labels: ${validLabels.join(', ')}.` + ); + } else { + console.log(`Routing fallback: task ${task.id} using 'project-manager'.`); + } + } + if (matchedLabel && labels.length > 1) { + console.log( + `Note: multiple labels detected for ${task.id} (${labels.join(', ')}). Router uses first matching label: ${matchedLabel}.` + ); + } + console.log( + `Resolved agent: ${agent.name}${matchedLabel ? ` (label: ${matchedLabel})` : ' (project-manager fallback)'}` + ); + + // Load agent-specific instructions + let agentInstructions = loadAgentInstructions(agent); + + // Add role information to instructions + const roleName = matchedLabel + ? config.roles?.[matchedLabel] || matchedLabel + : config.roles?.['project-manager'] || 'Project Manager'; + const agentName = agent.name?.trim() ? agent.name.trim() : 'Agent'; + const signatureLine = `Signed: ${agentName} β€” ${roleName}`; + agentInstructions = + `YOUR AGENT NAME: ${agentName}\n` + + `YOUR ASSIGNED ROLE FOR THIS TASK: ${roleName}\n` + + `COMMENT SIGNATURE (append this exact line to every Beads comment you write): ${signatureLine}\n\n` + + agentInstructions; + + // Build prompt + const prompt = buildPrompt(taskDetails, taskDetails.parent_id || epicId, agentInstructions, config); + + // Execute agent + console.log(`Executing agent: ${agent.ai_tool.name}...`); + if (isDryRun) { + console.log('Dry run: skipping agent execution and Beads status updates.'); + break; + } + const agentStartedAtMs = Date.now(); + const result = await executeAgent(task, agent, prompt, config); + const agentDurationMs = Date.now() - agentStartedAtMs; + console.log(`Agent runtime: ${formatDuration(agentDurationMs)}`); + + if (result.success) { + console.log(`Task ${task.id} completed successfully`); + // Update metadata: record success + try { + updateTaskMetadata(dbPath, task.id, { + last_success_at: new Date().toISOString() + }); + } catch (error) { + console.error(`Failed to update success metadata for ${task.id}: ${error}`); + throw error; // Fail fast + } + // Agent is responsible for updating status to closed + } else { + const failureLabel = result.failureType === 'timeout' ? 'timed out' : 'failed'; + console.error(`Task ${task.id} ${failureLabel} (exit code: ${result.exitCode})`); + if (result.error) { + console.error(`Error: ${result.error}`); + } + + // Reset to open and add error comment + Bun.spawnSync(['bd', 'update', task.id, '--status', 'open'], { + stdout: 'pipe', + stderr: 'pipe' + }); + + const prefix = + result.failureType === 'timeout' + ? 'Task implementation timed out' + : 'Task implementation failed - AI tool returned error'; + const errorMessage = `${prefix} (exit code: ${result.exitCode})${result.error ? `: ${result.error}` : ''}`; + Bun.spawnSync(['bd', 'comments', 'add', task.id, errorMessage], { + stdout: 'pipe', + stderr: 'pipe' + }); + + // Update metadata: increment failure count and record failure timestamp + const newFailureCount = failureCount + 1; + try { + updateTaskMetadata(dbPath, task.id, { + failure_count: newFailureCount, + last_failure_at: new Date().toISOString() + }); + } catch (error) { + console.error(`Failed to update failure metadata for ${task.id}: ${error}`); + throw error; // Fail fast + } + console.log(`Task ${task.id} failure count: ${newFailureCount}/${MAX_FAILURES}`); + + if (newFailureCount >= MAX_FAILURES) { + console.log(`Blocking task ${task.id} after ${MAX_FAILURES} failures`); + Bun.spawnSync(['bd', 'update', task.id, '--status', 'blocked'], { + stdout: 'pipe', + stderr: 'pipe' + }); + Bun.spawnSync( + [ + 'bd', + 'comments', + 'add', + task.id, + `Task blocked after ${MAX_FAILURES} failures. Manual intervention required.` + ], + { + stdout: 'pipe', + stderr: 'pipe' + } + ); + } + } + + // Re-check ready tasks after each run (loop will restart) + } finally { + previousIterationDurationMs = Date.now() - iterationStartedAtMs; + } + } + + if (iteration >= maxIterations) { + console.log(`Max iterations (${maxIterations}) reached. Stopping.`); + } +} + +function sanitizeConfigForOutput(config: Config): SanitizedConfig { + const { env: _env, ...aiToolWithoutEnv } = config.ai_tool; + return { ...config, ai_tool: aiToolWithoutEnv }; +} + +function sanitizeAgentProfileForOutput(agent: AgentProfile): SanitizedAgentProfile { + const { env: _env, ...aiToolWithoutEnv } = agent.ai_tool; + return { ...agent, ai_tool: aiToolWithoutEnv }; +} + +/** + * Main router function + * + * Loads config and profiles, reads ready tasks, and resolves + * agent profiles for each task. + */ +export function router(): { + config: SanitizedConfig; + readyTasks: BeadsTask[]; + taskAgents: Array<{ + task: BeadsTask; + agent: SanitizedAgentProfile; + matchedLabel: string | null; + }>; +} { + // Load configuration + const config = loadConfig(); + + // Read ready tasks + const readyTasks = getReadyTasks(); + + // Resolve agent for each task + const taskAgents = readyTasks.map(task => { + const { profile, matchedLabel } = resolveAgentForTask(task, config); + return { + task, + agent: sanitizeAgentProfileForOutput(profile), + matchedLabel + }; + }); + + return { + config: sanitizeConfigForOutput(config), + readyTasks, + taskAgents + }; +} + +// CLI entrypoint +if (import.meta.main) { + const args = process.argv.slice(2); + + // Check for --epic flag + const epicIndex = args.indexOf('--epic'); + if (epicIndex !== -1 && epicIndex + 1 < args.length) { + const epicId = args[epicIndex + 1]; + // Execute loop + executeLoop(epicId) + .then(() => { + console.log('\nExecution loop completed.'); + process.exit(0); + }) + .catch(error => { + console.error('Error in execution loop:', error); + process.exit(1); + }); + } else { + // Default: router mode (for testing/dry-run) + try { + const result = router(); + + // Output results as JSON for programmatic use + console.log(JSON.stringify(result, null, 2)); + } catch (error) { + console.error('Error:', error instanceof Error ? error.message : String(error)); + process.exit(1); + } + } +} diff --git a/.devagent/plugins/ralph/tools/setup-loop.ts b/.devagent/plugins/ralph/tools/setup-loop.ts new file mode 100755 index 0000000..055962a --- /dev/null +++ b/.devagent/plugins/ralph/tools/setup-loop.ts @@ -0,0 +1,410 @@ +#!/usr/bin/env bun +/** + * Ralph Loop Setup Script + * + * Parses loop.json, resolves templates, validates against schema, + * and creates Beads tasks with proper dependencies. + * + * Supports nested hierarchies (Objective -> Epics -> Tasks) + * + * Usage: + * bun setup-loop.ts <path-to-loop.json> + */ + +import Ajv from 'ajv'; +import addFormats from 'ajv-formats'; +import { execFileSync } from 'child_process'; +import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'fs'; +import { dirname, isAbsolute, join, resolve } from 'path'; +import { fileURLToPath } from 'url'; + +// Get script directory +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const SCRIPT_DIR = __dirname; +const PLUGIN_DIR = resolve(__dirname, '..'); +const REPO_ROOT = resolve(PLUGIN_DIR, '..', '..', '..'); + +// Types +interface Task { + id: string; + title: string; + description?: string; + descriptionPath?: string; + role: 'engineering' | 'qa' | 'design' | 'project-manager'; + issue_type?: 'task' | 'epic' | 'feature' | 'bug'; + parent_id?: string; + acceptance_criteria?: string[]; + dependencies?: string[]; + labels?: string[]; + metadata?: Record<string, unknown>; +} + +interface Epic { + id: string; + title?: string; + description?: string; + parent_id?: string; +} + +interface RunConfig { + git: { + base_branch: string; + working_branch: string; + }; + execution: { + max_iterations: number; + log_dir: string; + }; +} + +interface LoopConfig { + extends?: string; + run: RunConfig; + loop?: { + setupTasks?: Task[]; + teardownTasks?: Task[]; + }; + epics?: Epic[]; // Sub-epics in the objective + tasks: Task[]; + availableAgents?: string[]; + epic?: Epic; // Main Objective Epic +} + +interface Config { + roles: Record<string, string>; +} + +/** + * Get project prefix from Beads CLI + */ +function getProjectPrefix(): string { + try { + const output = execFileSync('bd', ['info', '--json'], { encoding: 'utf-8', stdio: 'pipe' }); + const info = JSON.parse(output); + return info.config.issue_prefix || 'devagent'; + } catch (error) { + console.warn('⚠️ Failed to fetch project prefix from bd info, defaulting to "devagent"'); + return 'devagent'; + } +} + +/** + * Deep merge two objects + */ +function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T { + const result = { ...target }; + for (const key in source) { + if (source[key] === null || source[key] === undefined) continue; + if (Array.isArray(source[key])) { + result[key] = source[key] as T[Extract<keyof T, string>]; + } else if ( + typeof source[key] === 'object' && + !Array.isArray(source[key]) && + typeof target[key] === 'object' && + target[key] !== null + ) { + result[key] = deepMerge( + target[key] as Record<string, unknown>, + source[key] as Record<string, unknown> + ) as T[Extract<keyof T, string>]; + } else { + result[key] = source[key] as T[Extract<keyof T, string>]; + } + } + return result; +} + +/** + * Resolve template path + */ +function resolveTemplatePath(templatePath: string, baseDir: string): string { + if (isAbsolute(templatePath)) + return existsSync(templatePath) + ? templatePath + : (() => { + throw new Error(`Template not found: ${templatePath}`); + })(); + const normalizedPath = templatePath.startsWith('templates/') + ? templatePath.substring('templates/'.length) + : templatePath; + const paths = [ + join(PLUGIN_DIR, 'templates', normalizedPath), + join(baseDir, templatePath), + join(baseDir, normalizedPath) + ]; + for (const p of paths) if (existsSync(p)) return p; + throw new Error(`Template not found: ${templatePath}`); +} + +/** + * Load and resolve template + */ +function loadAndResolveConfig(filePath: string): LoopConfig { + const resolvedPath = resolve(process.cwd(), filePath); + if (!existsSync(resolvedPath)) throw new Error(`File not found: ${resolvedPath}`); + const config: LoopConfig = JSON.parse(readFileSync(resolvedPath, 'utf-8')); + if (config.extends) { + const templatePath = resolveTemplatePath(config.extends, dirname(resolvedPath)); + const template: LoopConfig = JSON.parse(readFileSync(templatePath, 'utf-8')); + const merged: LoopConfig = { + ...template, + ...config, + loop: config.loop + ? { + ...template.loop, + ...config.loop, + setupTasks: config.loop.setupTasks ?? template.loop?.setupTasks, + teardownTasks: config.loop.teardownTasks ?? template.loop?.teardownTasks + } + : template.loop, + tasks: config.tasks, + epics: [...(template.epics || []), ...(config.epics || [])], + availableAgents: config.availableAgents ?? template.availableAgents + }; + delete merged.extends; + return merged; + } + return config; +} + +/** + * Validate config + */ +function validateConfig(config: LoopConfig): void { + const ajv = new Ajv({ allErrors: true, verbose: true }); + addFormats(ajv); + const schemaPath = join(PLUGIN_DIR, 'core', 'schemas', 'loop.schema.json'); + if (!existsSync(schemaPath)) throw new Error(`Schema not found: ${schemaPath}`); + const schema = JSON.parse(readFileSync(schemaPath, 'utf-8')); + const validate = ajv.compile(schema); + if (!validate(config)) { + console.error('❌ Validation failed!'); + if (validate.errors) { + validate.errors.forEach(error => { + console.error(` - ${error.instancePath || '/'}: ${error.message}`); + }); + } + throw new Error('Configuration validation failed'); + } + console.log('βœ… Configuration validated against schema'); +} + +function loadConfig(): Config { + const configPath = join(SCRIPT_DIR, 'config.json'); + if (!existsSync(configPath)) throw new Error(`Config not found: ${configPath}`); + return JSON.parse(readFileSync(configPath, 'utf-8')); +} + +/** + * Update config.json with run-specific settings from loop.json + */ +function updateConfigFromRun(runConfig: RunConfig): void { + const configPath = join(SCRIPT_DIR, 'config.json'); + const currentConfig = JSON.parse(readFileSync(configPath, 'utf-8')); + + // Merge git configuration + currentConfig.git = { + ...currentConfig.git, + base_branch: runConfig.git.base_branch, + working_branch: runConfig.git.working_branch + }; + + // Merge execution configuration + currentConfig.execution = { + ...currentConfig.execution, + max_iterations: runConfig.execution.max_iterations + }; + + writeFileSync(configPath, JSON.stringify(currentConfig, null, 2), 'utf-8'); + console.log('βœ… Updated config.json with run settings'); +} + +function createTempFile(content: string): string { + const tempPath = join('/tmp', `beads-desc-${Date.now()}-${Math.random().toString(36).substring(7)}.txt`); + writeFileSync(tempPath, content, 'utf-8'); + return tempPath; +} + +/** + * Create a Beads issue (task, epic, etc.) + */ +function createBeadsIssue( + item: Task | Epic, + isEpic: boolean, + tempFiles: string[], + prefix: string, + rootEpicId?: string | null +): string { + const type = isEpic ? 'epic' : (item as Task).issue_type || 'task'; + const title = (item as Task).title || (item as Epic).id; + + let body = ''; + if (isEpic) { + body = (item as Epic).description || ''; + } else { + const task = item as Task; + if (task.descriptionPath) { + const fullPath = isAbsolute(task.descriptionPath) + ? task.descriptionPath + : resolve(REPO_ROOT, task.descriptionPath); + + if (existsSync(fullPath)) { + body = readFileSync(fullPath, 'utf-8'); + } else { + console.warn(`⚠️ Description file not found: ${fullPath}`); + body = task.description || ''; + } + } else { + body = task.description || ''; + } + } + + // Ensure ID has the correct prefix + let id = item.id; + if (!id.startsWith(`${prefix}-`)) { + if (rootEpicId && rootEpicId.startsWith(`${prefix}-`)) { + id = `${rootEpicId}.${id}`; + } else { + id = `${prefix}-${id}`; + } + } + + const descFile = createTempFile(body); + tempFiles.push(descFile); + + const args = ['create', '--type', type, '--title', title, '--id', id, '--body-file', descFile, '--force']; + + if (!isEpic) { + const task = item as Task; + // Combine role and additional labels into a single comma-separated string + const allLabels = [task.role, ...(task.labels || [])].filter(Boolean); + if (allLabels.length) args.push('--labels', allLabels.join(',')); + if (task.acceptance_criteria?.length) args.push('--acceptance', task.acceptance_criteria.join('; ')); + } + + args.push('--json'); + + try { + const result = execFileSync('bd', args, { encoding: 'utf-8', stdio: 'pipe' }); + const created = JSON.parse(result); + console.log(`βœ… Created ${type}: ${created.id} - ${created.title}`); + return created.id; + } catch (error) { + const msg = error instanceof Error ? error.message : String(error); + if (msg.includes('already exists') || msg.includes('UNIQUE constraint')) { + console.log(`⚠️ ${type} ${id} already exists`); + return id; + } + throw new Error(`Failed to create ${type} ${id}: ${msg}`); + } +} + +function addDependency(taskId: string, dependsOnId: string): void { + try { + execFileSync('bd', ['dep', 'add', taskId, dependsOnId], { encoding: 'utf-8', stdio: 'pipe' }); + console.log(`βœ… Dependency: ${taskId} -> ${dependsOnId}`); + } catch (error) { + if (!error.toString().includes('already exists')) console.warn(`⚠️ Failed dependency ${taskId} -> ${dependsOnId}`); + } +} + +function setParent(taskId: string, parentId: string): void { + try { + execFileSync('bd', ['update', taskId, '--parent', parentId], { encoding: 'utf-8', stdio: 'pipe' }); + console.log(`βœ… Parent: ${taskId} -> ${parentId}`); + } catch (error) { + if (!error.toString().includes('already set')) console.warn(`⚠️ Failed parent ${taskId} -> ${parentId}`); + } +} + +function extractEpicIdFromTaskId(taskId: string): string | null { + const match = taskId.match(/^([^.]+)/); + return match ? match[1] : null; +} + +function main() { + const args = process.argv.slice(2); + const dryRun = args.includes('--dry-run'); + const filePath = args.find(arg => !arg.startsWith('--')); + if (!filePath) { + console.error('Usage: bun setup-loop.ts [--dry-run] <path-to-loop.json>'); + process.exit(1); + } + + try { + const config = loadAndResolveConfig(filePath); + validateConfig(config); + + // Update config.json with run-specific settings if not in dry-run mode + if (!dryRun) { + updateConfigFromRun(config.run); + } + + const tempFiles: string[] = []; + const prefix = getProjectPrefix(); + console.log(`🏷️ Project Prefix: ${prefix}`); + + // 1. Create Main Objective Epic + let rootEpicId: string | null = null; + if (config.epic) { + if (!dryRun) createBeadsIssue(config.epic, true, tempFiles, prefix, null); + rootEpicId = config.epic.id.startsWith(`${prefix}-`) ? config.epic.id : `${prefix}-${config.epic.id}`; + } + + // 2. Create Sub-Epics + if (config.epics) { + for (const subEpic of config.epics) { + if (!dryRun) { + const subEpicId = createBeadsIssue(subEpic, true, tempFiles, prefix, rootEpicId); + if (subEpic.parent_id) setParent(subEpicId, subEpic.parent_id); + else if (rootEpicId) setParent(subEpicId, rootEpicId); + } + } + } + + // 3. Collect and Create Tasks + const allTasks = [...(config.loop?.setupTasks || []), ...config.tasks, ...(config.loop?.teardownTasks || [])]; + const taskIdMap = new Map<string, string>(); + + for (const task of allTasks) { + if (dryRun) { + console.log(`[DRY RUN] Create task: ${task.id}`); + taskIdMap.set(task.id, task.id); + } else { + const createdId = createBeadsIssue(task, false, tempFiles, prefix, rootEpicId); + taskIdMap.set(task.id, createdId); + + // Link to parent + const parentId = task.parent_id || extractEpicIdFromTaskId(createdId); + if (parentId && parentId !== createdId) setParent(createdId, parentId); + } + } + + // 4. Link Dependencies + for (const task of allTasks) { + if (task.dependencies?.length) { + const taskId = taskIdMap.get(task.id); + if (!taskId) continue; + + for (const depId of task.dependencies) { + const resolvedDepId = taskIdMap.get(depId) || depId; + if (!dryRun) addDependency(taskId, resolvedDepId); + } + } + } + + // Cleanup + for (const f of tempFiles) + try { + unlinkSync(f); + } catch {} + console.log('\nβœ… Loop setup completed!'); + } catch (error) { + const msg = error instanceof Error ? error.message : String(error); + console.error(`\n❌ Error: ${msg}`); + process.exit(1); + } +} + +main(); diff --git a/.devagent/plugins/ralph/tools/sync-objective.test.ts b/.devagent/plugins/ralph/tools/sync-objective.test.ts new file mode 100644 index 0000000..afa7d52 --- /dev/null +++ b/.devagent/plugins/ralph/tools/sync-objective.test.ts @@ -0,0 +1,162 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { parsePlanMarkdown, parseDependencies } from "./sync-objective"; + +describe("sync-objective", () => { + describe("parsePlanMarkdown", () => { + it("should parse tasks from Implementation Tasks section", () => { + const markdown = ` +# Objective Plan + +## Implementation Tasks + +#### Task 1: Define Orchestrator Schema & Roles +- **Objective:** Create the template and role definitions for the Admin Loop. +- **Impacted Modules/Files:** + - \`.devagent/plugins/ralph/templates/orchestrator-loop.json\` (New) + - \`.devagent/plugins/ralph/roles/objective-planner.md\` (New) +- **References:** Clarification Packet +- **Acceptance Criteria:** + - \`orchestrator-loop.json\` defines the standard Admin tasks. + - Role prompts include specific instructions for Git Stacking and Plan Sync. +- **Testing Criteria:** Unit test with sample markdown. + +#### Task 2: Implement Plan Sync Logic +- **Objective:** Build the logic to sync objective-plan.md to Beads tasks. +- **Impacted Modules/Files:** + - \`.devagent/plugins/ralph/tools/sync-objective.ts\` (New) +- **Dependencies:** Task 1 +- **Acceptance Criteria:** + - Script parses markdown list/graph. + - Creates/Updates Beads tasks to match. + - Sets correct dependencies in Beads. +- **Testing Criteria:** Unit test with sample markdown. +`; + + const tasks = parsePlanMarkdown(markdown); + + expect(tasks).toHaveLength(2); + expect(tasks[0]).toMatchObject({ + id: "Task 1", + title: "Define Orchestrator Schema & Roles", + objective: "Create the template and role definitions for the Admin Loop.", + }); + expect(tasks[0].acceptanceCriteria).toContain("orchestrator-loop.json"); + expect(tasks[1]).toMatchObject({ + id: "Task 2", + title: "Implement Plan Sync Logic", + dependencies: "Task 1", + }); + }); + + it("should handle tasks with no dependencies", () => { + const markdown = ` +## Implementation Tasks + +#### Task 1: First Task +- **Objective:** Do something. +- **Dependencies:** None +`; + + const tasks = parsePlanMarkdown(markdown); + + expect(tasks).toHaveLength(1); + expect(tasks[0].dependencies).toBe("None"); + }); + + it("should handle tasks with range dependencies", () => { + const markdown = ` +## Implementation Tasks + +#### Task 5: End-to-End Test +- **Objective:** Run full test. +- **Dependencies:** Tasks 1-4 +`; + + const tasks = parsePlanMarkdown(markdown); + + expect(tasks).toHaveLength(1); + expect(tasks[0].dependencies).toBe("Tasks 1-4"); + }); + + it("should handle tasks with multiple dependencies", () => { + const markdown = ` +## Implementation Tasks + +#### Task 3: Integration +- **Objective:** Integrate components. +- **Dependencies:** Task 1, Task 2 +`; + + const tasks = parsePlanMarkdown(markdown); + + expect(tasks).toHaveLength(1); + expect(tasks[0].dependencies).toBe("Task 1, Task 2"); + }); + + it("should throw error if Implementation Tasks section not found", () => { + const markdown = ` +# Some Other Plan + +## Different Section +- No tasks here +`; + + expect(() => parsePlanMarkdown(markdown)).toThrow( + "Could not find 'Implementation Tasks' section" + ); + }); + + it("should handle tasks with ### headers", () => { + const markdown = ` +## Implementation Tasks + +### Task 1: Test Task +- **Objective:** Test parsing. +`; + + const tasks = parsePlanMarkdown(markdown); + + expect(tasks).toHaveLength(1); + expect(tasks[0].id).toBe("Task 1"); + expect(tasks[0].title).toBe("Test Task"); + }); + }); + + describe("parseDependencies", () => { + it("should parse range dependencies (Tasks 1-4)", () => { + const deps = parseDependencies("Tasks 1-4"); + + expect(deps).toEqual(["Task 1", "Task 2", "Task 3", "Task 4"]); + }); + + it("should parse list dependencies (Task 1, Task 2)", () => { + const deps = parseDependencies("Task 1, Task 2"); + + expect(deps).toEqual(["Task 1", "Task 2"]); + }); + + it("should parse single task dependency", () => { + const deps = parseDependencies("Task 1"); + + expect(deps).toEqual(["Task 1"]); + }); + + it("should handle 'None' dependencies", () => { + const deps = parseDependencies("None"); + + expect(deps).toEqual([]); + }); + + it("should handle empty string", () => { + const deps = parseDependencies(""); + + expect(deps).toEqual([]); + }); + + it("should parse multiple task references", () => { + const deps = parseDependencies("Task 1 and Task 2"); + + expect(deps).toEqual(["Task 1", "Task 2"]); + }); + }); +}); diff --git a/.devagent/plugins/ralph/tools/sync-objective.ts b/.devagent/plugins/ralph/tools/sync-objective.ts new file mode 100644 index 0000000..200f1f0 --- /dev/null +++ b/.devagent/plugins/ralph/tools/sync-objective.ts @@ -0,0 +1,378 @@ +#!/usr/bin/env bun +/** + * Objective Plan Sync Script + * + * Parses objective-plan.md and syncs it to Beads tasks. + * Creates/updates epic tasks and sets dependencies based on the plan document. + * + * Usage: + * bun sync-objective.ts <plan-path> <objective-epic-id> + * + * Example: + * bun sync-objective.ts .devagent/workspace/tasks/active/2026-01-22_objective-orchestrator-layer/plan/objective-plan.md devagent-034b9i + */ + +import { readFileSync, existsSync } from "fs"; +import { resolve, isAbsolute } from "path"; +import { execFileSync } from "child_process"; + +// Types +interface ParsedTask { + id: string; // e.g., "Task 1", "Task 2" + title: string; + objective?: string; + impactedModules?: string; + references?: string; + dependencies?: string; + acceptanceCriteria?: string; + testingCriteria?: string; + validationPlan?: string; +} + +interface BeadsTask { + id: string; + title: string; + description?: string; + status: string; + parent_id?: string | null; +} + +/** + * Parse markdown plan document to extract tasks + */ +function parsePlanMarkdown(planContent: string): ParsedTask[] { + const tasks: ParsedTask[] = []; + + // Find the "Implementation Tasks" section + // Match until next ## section or end of string + // Use a more permissive pattern that captures everything after the header + const implementationTasksMatch = planContent.match(/##\s+Implementation\s+Tasks\s*\n([\s\S]*?)(?=\n##\s|$)/i); + if (!implementationTasksMatch) { + throw new Error("Could not find 'Implementation Tasks' section in plan document"); + } + + let tasksSection = implementationTasksMatch[1]; + // Remove trailing whitespace/newlines + tasksSection = tasksSection.trim(); + + // Match task blocks (#### Task N: Title or ### Task N: Title) + // Split by task headers to get individual task blocks + const taskHeaderRegex = /(?:####|###)\s+Task\s+\d+:/g; + const taskHeaders = [...tasksSection.matchAll(taskHeaderRegex)]; + + for (let i = 0; i < taskHeaders.length; i++) { + const headerMatch = taskHeaders[i]; + if (!headerMatch || headerMatch.index === undefined) continue; + + const startIndex = headerMatch.index; + const endIndex = i < taskHeaders.length - 1 && taskHeaders[i + 1].index !== undefined + ? taskHeaders[i + 1].index + : tasksSection.length; + + const taskContent = tasksSection.slice(startIndex, endIndex); + + // Extract task ID and title from header + const headerLineMatch = taskContent.match(/(?:####|###)\s+Task\s+(\d+):\s*(.+?)(?:\n|$)/); + if (!headerLineMatch) continue; + + const taskId = headerLineMatch[1]; + const taskTitle = headerLineMatch[2].trim(); + + const task: ParsedTask = { + id: `Task ${taskId}`, + title: taskTitle, + }; + + // Extract Objective + const objectiveMatch = taskContent.match(/-?\s*\*\*Objective:\*\*\s*(.+?)(?:\n|$)/i); + if (objectiveMatch) { + task.objective = objectiveMatch[1].trim(); + } + + // Extract Impacted Modules/Files + const impactedMatch = taskContent.match(/-?\s*\*\*Impacted\s+Modules\/Files:\*\*\s*([\s\S]*?)(?:\n-?\s*\*\*|$)/i); + if (impactedMatch) { + task.impactedModules = impactedMatch[1].trim(); + } + + // Extract References + const referencesMatch = taskContent.match(/-?\s*\*\*References:\*\*\s*(.+?)(?:\n|$)/i); + if (referencesMatch) { + task.references = referencesMatch[1].trim(); + } + + // Extract Dependencies + const depsMatch = taskContent.match(/-?\s*\*\*Dependencies?:\*\*\s*(.+?)(?:\n|$)/i); + if (depsMatch) { + task.dependencies = depsMatch[1].trim(); + } + + // Extract Acceptance Criteria + const acceptanceMatch = taskContent.match(/-?\s*\*\*Acceptance\s+Criteria:\*\*\s*([\s\S]*?)(?:\n-?\s*\*\*|$)/i); + if (acceptanceMatch) { + task.acceptanceCriteria = acceptanceMatch[1].trim(); + } + + // Extract Testing Criteria + const testingMatch = taskContent.match(/-?\s*\*\*Testing\s+Criteria:\*\*\s*(.+?)(?:\n|$)/i); + if (testingMatch) { + task.testingCriteria = testingMatch[1].trim(); + } + + // Extract Validation Plan + const validationMatch = taskContent.match(/-?\s*\*\*Validation\s+Plan:\*\*\s*(.+?)(?:\n|$)/i); + if (validationMatch) { + task.validationPlan = validationMatch[1].trim(); + } + + tasks.push(task); + } + + return tasks; +} + +/** + * Build description from parsed task + */ +function buildTaskDescription(task: ParsedTask): string { + const parts: string[] = []; + + if (task.objective) { + parts.push(`**Objective:** ${task.objective}`); + } + + if (task.impactedModules) { + parts.push(`**Impacted Modules/Files:**\n${task.impactedModules}`); + } + + if (task.references) { + parts.push(`**References:** ${task.references}`); + } + + if (task.acceptanceCriteria) { + parts.push(`**Acceptance Criteria:**\n${task.acceptanceCriteria}`); + } + + if (task.testingCriteria) { + parts.push(`**Testing Criteria:** ${task.testingCriteria}`); + } + + if (task.validationPlan) { + parts.push(`**Validation Plan:** ${task.validationPlan}`); + } + + return parts.join("\n\n"); +} + +/** + * Parse dependency string (e.g., "Tasks 1-4" or "Task 1, Task 2") + */ +function parseDependencies(depsStr: string): string[] { + const deps: string[] = []; + + // Handle "Tasks 1-4" format + const rangeMatch = depsStr.match(/Tasks?\s+(\d+)\s*-\s*(\d+)/i); + if (rangeMatch) { + const start = parseInt(rangeMatch[1], 10); + const end = parseInt(rangeMatch[2], 10); + for (let i = start; i <= end; i++) { + deps.push(`Task ${i}`); + } + return deps; + } + + // Handle "Task 1, Task 2" format - extract all task numbers + const allTaskMatches = depsStr.match(/Task\s+(\d+)/gi); + if (allTaskMatches && allTaskMatches.length > 0) { + return allTaskMatches.map(m => m.replace(/\s+/g, ' ')); + } + + return deps; +} + +/** + * Execute Beads CLI command and return JSON result + */ +function bdCommand(args: string[]): unknown { + try { + const output = execFileSync("bd", [...args, "--json"], { encoding: "utf-8", stdio: "pipe" }); + const lines = output.trim().split('\n'); + // Find the last line that looks like JSON (Beads may output warnings) + for (let i = lines.length - 1; i >= 0; i--) { + const line = lines[i].trim(); + if (line.startsWith('[') || line.startsWith('{')) { + return JSON.parse(line); + } + } + throw new Error(`No JSON output found in: ${output}`); + } catch (error) { + if (error instanceof Error && 'stdout' in error) { + const rawOutput = (error as { stdout?: string | Buffer }).stdout; + const output = typeof rawOutput === 'string' ? rawOutput : rawOutput?.toString() || ''; + const lines = output.trim().split('\n'); + for (let i = lines.length - 1; i >= 0; i--) { + const line = lines[i].trim(); + if (line.startsWith('[') || line.startsWith('{')) { + return JSON.parse(line); + } + } + } + throw error; + } +} + +/** + * Get existing Beads tasks for the objective epic + */ +function getExistingTasks(objectiveEpicId: string): Map<string, BeadsTask> { + const result = bdCommand(['list', '--parent', objectiveEpicId]) as BeadsTask[]; + const taskMap = new Map<string, BeadsTask>(); + + for (const task of result) { + // Try to match by title pattern "Task N: ..." + const titleMatch = task.title.match(/^Task\s+(\d+):/i); + if (titleMatch) { + const taskId = `Task ${titleMatch[1]}`; + taskMap.set(taskId, task); + } + } + + return taskMap; +} + +/** + * Create or update a Beads task + */ +function createOrUpdateTask( + task: ParsedTask, + objectiveEpicId: string, + existingTask?: BeadsTask +): string { + const description = buildTaskDescription(task); + const title = `${task.id}: ${task.title}`; + + if (existingTask) { + // Update existing task + bdCommand([ + 'update', + existingTask.id, + '--title', title, + '--description', description, + ]); + return existingTask.id; + } else { + // Create new task + const result = bdCommand([ + 'create', + title, + '--type', 'task', + '--parent', objectiveEpicId, + '--description', description, + '--priority', '2', + ]) as { id: string } | BeadsTask[]; + + // Handle both single object and array responses + const taskId = Array.isArray(result) ? result[0]?.id : result.id; + if (!taskId) { + throw new Error(`Failed to create task: ${title}`); + } + return taskId; + } +} + +/** + * Set dependencies between tasks + */ +function setDependencies( + taskId: string, + dependencyTaskIds: string[], + taskIdMap: Map<string, string> +): void { + for (const depTaskId of dependencyTaskIds) { + const depBeadsId = taskIdMap.get(depTaskId); + if (!depBeadsId) { + console.warn(`Warning: Dependency task "${depTaskId}" not found, skipping dependency`); + continue; + } + + try { + bdCommand(['dep', 'add', taskId, depBeadsId]); + } catch (error) { + console.warn(`Warning: Failed to add dependency ${depBeadsId} to ${taskId}: ${error}`); + } + } +} + +/** + * Main sync function + */ +function syncObjectivePlan(planPath: string, objectiveEpicId: string): void { + // Read plan file + if (!existsSync(planPath)) { + throw new Error(`Plan file not found: ${planPath}`); + } + + const planContent = readFileSync(planPath, 'utf-8'); + + // Parse plan + const parsedTasks = parsePlanMarkdown(planContent); + console.log(`Parsed ${parsedTasks.length} tasks from plan document`); + + // Get existing tasks + const existingTasks = getExistingTasks(objectiveEpicId); + console.log(`Found ${existingTasks.size} existing tasks in Beads`); + + // Create/update tasks and build ID mapping + const taskIdMap = new Map<string, string>(); // Parsed task ID -> Beads task ID + const dependencyMap = new Map<string, string[]>(); // Beads task ID -> dependency task IDs + + for (const task of parsedTasks) { + const existingTask = existingTasks.get(task.id); + const beadsId = createOrUpdateTask(task, objectiveEpicId, existingTask); + taskIdMap.set(task.id, beadsId); + + // Parse dependencies + if (task.dependencies && task.dependencies.toLowerCase() !== 'none') { + const deps = parseDependencies(task.dependencies); + if (deps.length > 0) { + dependencyMap.set(beadsId, deps); + } + } + + console.log(`${existingTask ? 'Updated' : 'Created'} task: ${task.title} (${beadsId})`); + } + + // Set dependencies + for (const [beadsId, depTaskIds] of dependencyMap.entries()) { + setDependencies(beadsId, depTaskIds, taskIdMap); + console.log(`Set dependencies for ${beadsId}: ${depTaskIds.join(', ')}`); + } + + console.log(`\nSync complete: ${parsedTasks.length} tasks processed`); +} + +// Main execution +if (import.meta.main) { + const args = process.argv.slice(2); + + if (args.length < 2) { + console.error('Usage: bun sync-objective.ts <plan-path> <objective-epic-id>'); + process.exit(1); + } + + const [planPath, objectiveEpicId] = args; + + // Resolve plan path (relative to repo root or absolute) + const resolvedPath = isAbsolute(planPath) + ? planPath + : resolve(process.cwd(), planPath); + + try { + syncObjectivePlan(resolvedPath, objectiveEpicId); + } catch (error) { + console.error('Error syncing objective plan:', error); + process.exit(1); + } +} + +export { parsePlanMarkdown, parseDependencies, syncObjectivePlan }; diff --git a/.devagent/plugins/ralph/workflows/final-review.md b/.devagent/plugins/ralph/workflows/final-review.md new file mode 100644 index 0000000..e04707a --- /dev/null +++ b/.devagent/plugins/ralph/workflows/final-review.md @@ -0,0 +1,87 @@ +# Ralph Final Review & PR Creation + +## Mission +- Primary goal: Review the results of a Ralph execution cycle, summarize work completed, integrate process improvements from revise reports, and create or update a GitHub PR. +- Boundaries / non-goals: Do not modify application code or change task statuses (except to record the final report). +- Success signals: A GitHub PR is created or updated with a high-quality summary of work, a status table of tasks, and the contents of the latest revise report (if available). If PR review comments exist, follow-up tasks are created before any revise report is generated. + +## Standard Instructions Reference +Before executing this workflow, review standard instructions in `.devagent/core/AGENTS.md` β†’ Standard Workflow Instructions for: +- Date handling (run `date +%Y-%m-%d`) +- Metadata retrieval +- Context gathering order + +## Execution Directive +- Execute immediately without human-in-the-loop confirmation. +- Ensure the final report is created even if the execution cycle ended in an error (the "Stop Reason" should be clearly documented). + +## Inputs +- Required: Epic ID, Stop Reason (e.g., "Max Iterations Reached", "All Tasks Completed"). +- Optional: Iteration count, current branch name. + +## Workflow + +### 1. Data Aggregation +- Fetch task status summary using `bd list --parent <EPIC_ID> --json`. +- Extract "Revision Learning" and "Commit" comments from all tasks in the Epic. +- **Determine task folder:** Extract task folder path from Epic's plan document reference (Epic description contains "Plan document: <path>") +- Identify the latest revise report in the task folder (`.devagent/workspace/tasks/active/YYYY-MM-DD_task-slug/`) or fallback location (`.devagent/workspace/reviews/`) for this Epic. + +### 2. PR Review Comment Triage (Before Revise Report) +- Check for PR review comments (inline review comments or review threads) on the current PR. + - Example (requires repo + PR number): + - `gh repo view --json nameWithOwner` + - `gh pr view --json number,url` + - `gh api repos/<owner>/<repo>/issues/<pr-number>/comments` (PR timeline/issue comments) + - `gh api repos/<owner>/<repo>/pulls/<pr-number>/comments` (REST: diff-anchored review comments only) + - **Review threads (GraphQL):** REST does not include unresolved review threads. If you need full coverage, query `pullRequest.reviewThreads` via GraphQL (or explicitly note that unresolved threads will be missed if you only use REST). + - Example GraphQL query: + ```bash + gh api graphql -f query=' + query($owner:String!, $name:String!, $number:Int!) { + repository(owner:$owner, name:$name) { + pullRequest(number:$number) { + reviewThreads(first: 100) { + nodes { + isResolved + comments(first: 50) { + nodes { author { login } body url createdAt } + } + } + } + } + } + }' -F owner=<owner> -F name=<repo> -F number=<pr-number> + ``` +- If **actionable review comments exist**: + - Create new child tasks under the epic (one per comment or grouped by theme). + - Label tasks `engineering` for code changes and `qa` for verification/test requests. + - Include the PR comment link/text in the task description/notes for traceability. + - **Keep the final review task open** and stop here. Do **not** generate the revise report until the new tasks are closed. + +### 3. Summary Generation +- Create a natural language executive summary of the execution cycle: + - What was accomplished? + - What blockers were encountered? + - Why did the cycle stop? +- Format a "Task Status" table (ID, Status, Title). + +### 4. Revise Report Integration +- If a recent revise report exists (generated via the revise-report workflow), append its "Improvement Recommendations" and "Action Items" to the PR body. +- If no report exists, briefly note that no process improvements were identified in this cycle. + +### 5. PR Management +- Use `gh pr list --head <BRANCH_NAME> --json url` to check if a PR already exists. +- If PR exists: + - Update the PR body with the new summary using `gh pr edit`. +- If PR does not exist: + - Create the PR using `gh pr create` with a title like "Ralph Execution: <Epic Title> (<Epic ID>)". + - Set the base branch (default: `main`). + +## Failure Handling +- **gh CLI missing:** If `gh` is not found, write the final summary to a file `.ralph_pr_body.md` and report that PR creation was skipped. +- **Git push failure:** If the branch hasn't been pushed, attempt to push it once before PR creation. If push fails, report the error but continue with PR creation (PR may still work if branch was pushed previously). + +## Expected Output +- A created or updated GitHub PR with a comprehensive execution report. +- A summary message in the terminal with the PR URL. diff --git a/.devagent/plugins/ralph/workflows/generate-revise-report.md b/.devagent/plugins/ralph/workflows/generate-revise-report.md new file mode 100644 index 0000000..c49b708 --- /dev/null +++ b/.devagent/plugins/ralph/workflows/generate-revise-report.md @@ -0,0 +1,118 @@ +# Generate Revise Report (Epic Scope) + +## Mission +Generate a comprehensive revise report for a Beads Epic, aggregating traceability data and revision learnings from child tasks to drive process improvement. + +## Inputs +- Required: Epic ID (e.g., `bd-1a2b`) +- Optional: Output directory (default: `.devagent/workspace/reviews/`) + +**Note:** There is no CLI entrypoint for this workflow. Follow the steps below to generate the report manually. + +## Standard Instructions Reference +Before executing this workflow, review standard instructions in `.devagent/core/AGENTS.md` β†’ Standard Workflow Instructions for date handling, metadata retrieval, context gathering order, and storage patterns. + +## Resource Strategy +- Skill instructions: `.devagent/plugins/ralph/skills/revise-report-generation/SKILL.md` +- Beads CLI: `bd` command for data retrieval +- Storage location: Primary - task folder (`.devagent/workspace/tasks/active/YYYY-MM-DD_task-slug/`), Fallback - `.devagent/workspace/reviews/` + +## Workflow Steps + +### Step 1: Initialize Report Context + +**Objective:** Validate Epic ID and set up report metadata. + +**Instructions:** +1. Validate the provided Epic ID exists using `bd show <EpicID>`. +2. Get current date using `date +%Y-%m-%d`. +3. **Determine task folder:** Extract task folder path from Epic's plan document reference: + - Epic description contains "Plan document: <absolute-path>" + - Extract the task folder from the plan path (e.g., `/path/to/.devagent/workspace/tasks/active/YYYY-MM-DD_task-slug/plan/...` β†’ `.devagent/workspace/tasks/active/YYYY-MM-DD_task-slug/`) + - If task folder cannot be determined, use fallback location `.devagent/workspace/reviews/` +4. Create report filename: `YYYY-MM-DD_<epic-id>-improvements.md` (preferred) or `YYYY-MM-DD_revise-report-epic-<EpicID>.md` (legacy). + +### Step 2: Aggregate Task Data + +**Objective:** Fetch all tasks and their comments to build the dataset. + +**Instructions:** +1. List all child tasks for the Epic: + `bd list --parent <EpicID> --json` +2. For EACH child task: + a. Fetch details: `bd show <TaskID> --json` + b. Fetch comments: `bd comments <TaskID> --json` +3. Parse the data to extract: + - **Traceability:** Look for comment "Commit: <hash> - <subject>" + - **Learnings:** Look for comment "Revision Learning: <text>" (may include structured format) + - **Screenshots:** Look for comment "Screenshots captured: <path>" + - **Status:** Current status of the task + +### Step 3: Analyze & Classify + +**Objective:** Group learnings and build the traceability matrix. + +**Instructions:** +1. **Traceability Matrix:** Map each task to its commit hash. Identify tasks with missing commits. +2. **Screenshot Collection:** + - Extract all screenshot paths from "Screenshots captured:" comments. + - Group screenshots by task ID. + - Verify screenshot files exist in project directory. + - Count total screenshots and identify key screenshots for inclusion. + - Determine screenshot directory structure (epic-level vs task-specific). +3. **Learning Classification:** + - **Structured Format:** If "Revision Learning" includes structured fields: + - Extract `Category:` (Documentation|Process|Rules|Architecture) + - Extract `Priority:` (Critical|High|Medium|Low) + - Extract `Issue:` (description) + - Extract `Recommendation:` (actionable improvement) + - Extract `Files/Rules Affected:` (references) + - **Auto-Classification:** If not structured, classify into: + - **Documentation:** Missing context, unclear specs, outdated docs, onboarding gaps. + - **Process:** Workflow, prompting, instructions, automation opportunities, quality gates. + - **Rules & Standards:** Cursor rules, coding standards, pattern inconsistencies, best practices. + - **Tech Architecture:** Architecture, patterns, libraries, code structure, dependencies, technical debt, performance. +4. **Prioritization:** Assign priorities (Critical, High, Medium, Low) to all improvements, prioritizing structured learnings with explicit priorities. +5. Synthesize an **Executive Summary** based on the overall health (success rate, quality gate failures, rich learnings, improvement density). + +### Step 4: Generate Report + +**Objective:** Write the markdown report. + +**Instructions:** +1. Follow the template defined in `skills/revise-report-generation/SKILL.md`. +2. Write the Executive Summary. +3. Render the Traceability Matrix as a markdown table. +4. **Evidence & Screenshots Section:** + - Document screenshot directory location. + - List key screenshots with descriptions and relative paths. + - Include screenshot count and organization. +5. **Improvement Recommendations Section:** + - Organize improvements by category (Documentation, Process, Rules & Standards, Tech Architecture). + - For each improvement, include: + - Priority (Critical, High, Medium, Low) + - Issue description + - Recommendation (actionable) + - Files/Rules affected (when available) + - Source Task ID + - Use checkbox format for actionable items. +6. **Action Items Section:** + - Extract top 5-10 prioritized action items from improvements. + - Group by priority (Critical first, then High, Medium, Low). + - Include category and source task for traceability. + +### Step 5: Finalize + +**Objective:** Save the report and update indices. + +**Instructions:** +1. **Save report to task folder (preferred):** Write the file to `.devagent/workspace/tasks/active/YYYY-MM-DD_task-slug/YYYY-MM-DD_<epic-id>-improvements.md` + - If task folder cannot be determined, use fallback: `.devagent/workspace/reviews/YYYY-MM-DD_<epic-id>-improvements.md` +2. Ensure screenshot directories are documented and accessible (should be in task folder if available). +3. Update `.devagent/workspace/reviews/README.md` to include a link to the new report (if saved to reviews/ folder). + +## Error Handling + +- **Epic not found:** Return error if `bd show` fails. +- **No comments:** If tasks have no comments, note "No revision learnings captured" in the report. +- **JSON parsing:** Use robust parsing (e.g. `jq`) to handle potential special characters in comments. diff --git a/.devagent/plugins/ralph/workflows/orchestrator-loop.md b/.devagent/plugins/ralph/workflows/orchestrator-loop.md new file mode 100644 index 0000000..30f66ec --- /dev/null +++ b/.devagent/plugins/ralph/workflows/orchestrator-loop.md @@ -0,0 +1,126 @@ +# Orchestrator Loop Workflow (Ralph Plugin) + +## Mission +Execute the orchestrator loop to coordinate multiple dependent epics for a multi-epic objective. This workflow leverages **native Beads dependencies** to manage the lifecycle of implementation epics, ensuring a seamless flow from sync to integration without manual "wait" tasks. + +## Prerequisites +- Orchestrator configuration exists at `.devagent/plugins/ralph/tools/config.json` +- Objective loop config JSON exists (created by setup workflow) +- Beads tasks and nested epics created via `setup-loop.ts` +- Git access is available and working branch is configured + +## Standard Instructions Reference +Before executing this workflow, review standard instructions in `.devagent/core/AGENTS.md` β†’ Standard Workflow Instructions. + +## Workflow Overview + +The orchestrator loop follows a **Dependency-Driven** pattern: +1. **Setup & Sync**: Initialize the objective hub and sync the nested tree (Objective -> Epics -> Tasks) to Beads. +2. **Implementation (Automatic)**: Ralph executes implementation tasks as they become "ready" in the tree. Agents autonomously switch branches based on task hints. +3. **Integration (Merge)**: Integration tasks (merging epics to the hub) become "ready" as soon as their respective implementation epics are closed. +4. **Teardown**: Finalize the objective once all implementation and integration work is complete. + +## Workflow Steps + +### Step 1: Objective Setup & Sync + +**Objective:** Initialize the hub branch and sync the entire project blueprint to Beads. + +**Instructions:** +1. Create the `feature/<objective-slug>-hub` branch off the base branch. +2. Construct/Verify the `loop.json` blueprint. + - Use `descriptionPath` for long objective specs. + - For multi-epic objectives, reference child loop files in kickoff tasks: `Loop File: ./path/to/child-loop.json`. +3. Run the setup tool: + ```bash + bun .devagent/plugins/ralph/tools/setup-loop.ts path/to/loop.json + ``` +4. Verify the tree structure: `bd tree --parent <OBJECTIVE_ID>`. + +**Acceptance Criteria:** +- Objective tree created in Beads. +- Kickoff tasks include `Target Epic` and optional `Loop File` references. +- Implementation epics correctly linked to the Hub. +- Dependencies set (Integration tasks blocked by Implementation epics). + +**Role:** ObjectivePlanner (project-manager) + +--- + +### Step 2: Integrated Execution (The Loop) + +**Objective:** Execute implementation and integration tasks in the order dictated by the Beads graph. + +**Instructions:** +1. Follow the **Context-Aware Branching** protocol in `AGENTS.md`. +2. Look for `Branch: feature/...` hints in task descriptions to manage your git state. +3. When kicking off a child epic (EpicCoordinator): + - Check if a `Loop File` is referenced in the kickoff task. + - If present, run `bun .devagent/plugins/ralph/tools/setup-loop.ts <loop-file>` to populate the child epic's tasks. + - Trigger the `ralph.sh` loop for the child epic. +4. When working on an implementation task: + - Stay on the feature branch. + - Mark the **Epic itself** as `closed` once the last task is finished. +5. When working on an integration task (Merge): + - Switch to the **Hub Branch**. + - Merge the feature branch (`--no-ff`). + - Rebase dependent branches if necessary. + +**Acceptance Criteria:** +- Tasks executed in dependency order. +- Child epics initialized autonomously via `Loop File` references. +- Branches managed autonomously by agents. +- Implementation epics closed to unblock integration work. + +--- + +### Step 3: Teardown Objective + +**Objective:** Finalize the objective and generate the final report. + +**Instructions:** +1. Verify all implementation epics and integration tasks are `closed`. +2. Merge the Hub branch into the primary base branch. +3. Generate the final objective summary report. + +**Acceptance Criteria:** +- Objective marked `closed` in Beads. +- All code integrated into the base branch. + +**Role:** EpicCoordinator (project-manager) + +--- + +## Integration with Other Roles + +**With ObjectivePlanner:** +- Defines the blueprint and sets the initial graph. + +**With BranchManager:** +- Handles integration tasks (merges/rebases) on the hub branch. + +**With Engineering/QA:** +- Execute implementation tasks on feature branches. + +## Quality Standards + +**Your Work Should:** +- Respect the Beads dependency graph. +- Manage git state (branching) autonomously based on task context. +- Close epics explicitly to signal flow progress. +- Document integration results (merges/conflicts) in task comments. + +## Tools & Commands + +**Beads Commands:** +```bash +bd ready --parent <OBJECTIVE_ID> --limit 200 --json # Discover ready work +bd tree --parent <OBJECTIVE_ID> # View project graph +bd update <ID> --status closed # Mark task/epic closed +``` + +**Git Commands:** +```bash +git checkout -b <branch> # Context-aware branching +git merge <branch> --no-ff # Integration merge +``` diff --git a/.devagent/plugins/ralph/workflows/run-review-report.md b/.devagent/plugins/ralph/workflows/run-review-report.md new file mode 100644 index 0000000..2c95be8 --- /dev/null +++ b/.devagent/plugins/ralph/workflows/run-review-report.md @@ -0,0 +1,45 @@ +# PR Epic Run Review Report + +## Mission +Evaluate a PR + Beads epic run against the canonical `ralph-e2e` expectations rubric, producing a `run-report.md` artifact and updating PR/Beads summaries. + +## Inputs +- Required: PR reference (URL or number) +- Required: Beads Epic ID (e.g., `bd-123`) + +## Workflow Steps + +### Step 1: Initialize and Canonicalize +1. **Canonicalize PR**: If a number is provided, convert to full GitHub URL. +2. **Resolve Run Folder**: + - Parse the Beads Epic description or comments for a "Run folder:" entry. + - Fallback: Search for directory matching `runs/*_<epic-id>/` under `.devagent/workspace/tests/ralph-e2e/`. +3. **Read Rubric**: Load the latest expectations from `.devagent/workspace/tests/ralph-e2e/expectations/expectations.md`. + +### Step 2: Gather Evidence +1. **Beads Data**: Fetch all tasks and comments for the Epic (`bd list --parent <EpicID> --json`, `bd comments <TaskID> --json`). +2. **Commit History**: Identify commits associated with the run (from Beads comments or PR). +3. **Screenshots**: List files in the run folder's `setup/`, `execution/`, `qa/`, and `post-run/` directories. + +### Step 3: Evaluate Against Rubric +Evaluate the run evidence against each stage of the `expectations.md` rubric: +- **Stage 0 (Roles/Collaboration)**: Verify role signatures in comments and explicit handoffs. +- **Stage 1 (Setup)**: Verify task breakdown and run header presence. +- **Stage 2 (Implementation)**: Verify quality gate reporting and traceability (task IDs in commits). +- **Stage 3 (QA)**: Verify evidence-first pass/fail and failure semantics. +- **Stage 4 (Post-run)**: Verify presence of "what we learned" summary. +- **Stage 5 (PR Definition of Done)**: Verify PR hygiene (links, expectations version, test plan). + +### Step 4: Generate artifacts +1. **Write `run-report.md`**: Create the report in the resolved run folder. + - Include rubric-aligned sections (Met/Not Met/Partial). + - Enumerate evidence pointers (links to Beads comments, screenshot paths). + - Add a "Next Run Improvements" section with concrete, actionable recommendations. +2. **Update Beads Epic**: Post a concise summary comment to the Epic with a link to the `run-report.md`. +3. **Update PR Description**: + - Find or create a "## Run Summary" section in the PR description. + - Update it with the run result, expectations version, and a link to the report. + +### Step 5: Finalize +1. Confirm all artifacts are saved. +2. If this is the final `revise-report` task in the epic, mark it as closed. diff --git a/.devagent/plugins/ralph/workflows/setup-ralph-loop.md b/.devagent/plugins/ralph/workflows/setup-ralph-loop.md new file mode 100644 index 0000000..57d5937 --- /dev/null +++ b/.devagent/plugins/ralph/workflows/setup-ralph-loop.md @@ -0,0 +1,69 @@ +# Setup Ralph Loop (Ralph Plugin) + +## Mission +Convert a DevAgent plan or goal into a structured `loop.json` configuration file, then use `setup-loop.ts` to create the Beads Epic and tasks. This workflow favors a **JSON-first blueprint** approach over manual CLI commands. + +## Inputs +- Required: Path to DevAgent plan markdown file (or a high-level goal). + +## Resource Strategy +- **Loop Schema**: `.devagent/plugins/ralph/core/schemas/loop.schema.json` +- **Setup Script**: `.devagent/plugins/ralph/tools/setup-loop.ts` (JSON -> Beads) +- **Runs Directory**: `.devagent/plugins/ralph/runs/` + +--- + +## Workflow Steps + +### Step 1: Analyze & Extract +Read the plan (or goal) and extract the task list. +- **Identify Epics**: Determine the parent Epic ID (must start with the `devagent-` prefix). +- **Identify Tasks**: Extract descriptions, roles (`engineering`, `qa`, `design`, `project-manager`), and acceptance criteria. +- **Identify Dependencies**: Map task relationships. + +### Step 2: Construct loop.json +Build a structured JSON file matching the `loop.schema.json`. + +**Blueprinting Best Practices:** +1. **Epic Object**: Include an `epic` object with `id`, `title`, and `description`. +2. **Task IDs**: Use hierarchical IDs (e.g., `devagent-epic.1`). +3. **Modular Descriptions**: Use `descriptionPath` to reference external markdown files for long technical specs. Use `description` for short inline details. +4. **Separate Loop Files**: For multi-epic objectives, reference sub-loop files in the kickoff task description: `Loop File: ./path/to/sub-loop.json`. +5. **Branch Hints**: Include a `Branch: feature/...` line in the `description` of every implementation task to help agents manage git state. +6. **Closing Signals**: Add a "Wrap up & Close Epic" task at the end of every implementation epic. +7. **Dependencies**: Ensure "Merge" tasks are blocked by their respective "Epic" objects. + +### Step 3: Execute Sync +Save the JSON to `.devagent/plugins/ralph/runs/<id>_<date>.json` and run the setup tool: + +```bash +bun .devagent/plugins/ralph/tools/setup-loop.ts path/to/your-loop.json +``` + +**What happens:** +- The script creates the **Epic** if it doesn't exist. +- The script creates all **Tasks**. +- The script links all **Dependencies**. +- The script automatically updates `.devagent/plugins/ralph/tools/config.json` with run-specific settings from `loop.json`: + - `git.base_branch` and `git.working_branch` + - `execution.max_iterations` + +**Note:** This eliminates the need to manually edit `config.json` after setup. All run-specific configuration comes from `loop.json`'s `run` section. + +### Step 4: Verify +Run a quick check to ensure the structure is correct in Beads: +```bash +bd ready --parent <EPIC_ID> --json +``` + +--- + +## Quality Standards (C6) +- **Prefer Simplicity**: Do not use manual `bd create` commands if you can build a JSON blueprint instead. +- **Self-Documenting**: Ensure the `epic.description` in your JSON includes a link to the original plan file. +- **Idempotent**: You can run the setup script multiple times; it will skip existing tasks and update dependencies. + +## Output +- A `loop.json` file in the `runs/` directory. +- A live Epic and Task tree in Beads. +- Ralph configuration updated at `.devagent/plugins/ralph/tools/config.json`. diff --git a/.devagent/plugins/ralph/workflows/setup-workspace.md b/.devagent/plugins/ralph/workflows/setup-workspace.md new file mode 100644 index 0000000..b3dc577 --- /dev/null +++ b/.devagent/plugins/ralph/workflows/setup-workspace.md @@ -0,0 +1,55 @@ +# Setup Ralph Workspace + +## Mission +- Primary goal: Validate the execution environment, prepare the git workspace, and ensure the correct branch is set up before a Ralph autonomous execution cycle begins. +- Boundaries / non-goals: Do not execute implementation tasks, generate PRs, modify task statuses beyond `in_progress` validation, or create git worktrees (user is responsible for worktree setup if needed). +- Success signals: The agent correctly identifies the Epic, creates or switches to the `ralph-<epic-id>` branch (dash-separated, in the current worktree), ensures the workspace is clean or stashed, and confirms the repository is ready for the main execution loop. + +## Standard Instructions Reference +Before executing this workflow, review standard instructions in `.devagent/core/AGENTS.md` β†’ Standard Workflow Instructions for: +- Metadata retrieval (get git config user.name) +- Context gathering order +- Standard guardrails + +## Execution Directive +- Execute immediately without human-in-the-loop confirmation. +- If validation fails (e.g., Epic not found), report the error and stop the workflow to prevent `ralph.sh` from continuing. + +## Inputs +- Required: Epic ID (e.g., `bd-1234`). +- Optional: Config file path (default: `.devagent/plugins/ralph/tools/config.json`). + +## Workflow + +### 1. Environment Validation +- Validate the Epic ID using `bd show <EPIC_ID> --json`. If the Epic does not exist, fail fast. +- Verify that `gh` CLI is installed and authenticated if remote push is expected. +- Check current git status. If there are uncommitted changes that are NOT part of the Ralph branch, decide whether to stash or fail based on project safety rules. + +### 2. Git Branch Management +- Determine target branch: `ralph-<EPIC_ID>` (use dash, not slash, to avoid GitHub "fatal error in commit_refs" issue). +- **Important:** This workflow runs in the current worktree. The user is responsible for creating worktrees beforehand if isolation is desired. +- **Note**: Branch names with slashes (e.g., `ralph/<EPIC_ID>`) frequently fail to push with GitHub server errors. Use dash-separated names instead. +- If the branch does not exist: + - Create it from the `main` branch (or configured base branch). + - Push it to the remote origin to establish tracking. +- If the branch exists: + - Switch to it. + - Pull latest changes if tracking is configured. +- Ensure the branch is pushed/upstreamed so other agents or processes can see it. +- **Note:** Ralph will validate that the current branch is not `main` before proceeding with execution. + +### 3. Workspace Preparation +- Ensure `beads.db` path is accessible and correctly exported in the environment. +- Confirm that the `AGENTS.md` instructions are readable and up-to-date for the main loop. +- Log a "Setup Complete" message with the current branch and Epic status. + +## Failure Handling +- **Missing Epic:** Fail and report "Epic <ID> not found in Beads." +- **Dirty Workspace:** If uncommitted changes exist on a non-Ralph branch, fail and ask the user to clean up or stash manually. +- **Git Error:** Report the specific git error (e.g., "Permission denied on push") and stop. + +## Expected Output +- A prepared git branch `ralph-<EPIC_ID>` (dash-separated, not slash). +- A "Setup Successful" report in the terminal. +- Workspace switched to the target branch. diff --git a/.devagent/plugins/ralph/workflows/start-ralph-execution.md b/.devagent/plugins/ralph/workflows/start-ralph-execution.md new file mode 100644 index 0000000..477f150 --- /dev/null +++ b/.devagent/plugins/ralph/workflows/start-ralph-execution.md @@ -0,0 +1,93 @@ +# Start Ralph Execution (Ralph Plugin) + +## Mission +Start Ralph's autonomous execution loop. This workflow assumes Ralph is already configured (see `setup-ralph-loop.md` for full setup) and focuses on launching execution. + +## Prerequisites +- Ralph configuration exists at `.devagent/plugins/ralph/tools/config.json` with required `git` section: + - `git.base_branch`: Base branch name (e.g., "main") + - `git.working_branch`: Working branch name (e.g., "ralph-<plan-title-slug>") +- Beads tasks have been imported (completed in `setup-ralph-loop.md`) +- AI tool is configured and available +- Epic ID is available +- Working branch exists locally and current branch matches `git.working_branch` in config +- **Note:** `setup-ralph-loop.md` does **not** create or switch git branches. Ensure your working branch is created/checked out before starting. + +## Standard Instructions Reference +Before executing this workflow, review standard instructions in `.devagent/core/AGENTS.md` β†’ Standard Workflow Instructions for date handling, metadata retrieval, context gathering order, and storage patterns. + +## Workflow Steps + +### Step 1: Start Ralph + +**Objective:** Launch Ralph's autonomous execution loop. + +**Instructions:** +1. Navigate to the project root directory. +2. Execute the Ralph script with the required Epic ID: + ```bash + # Run for a specific Epic (Required) + # Pipe through cat to prevent interactive pager from opening + .devagent/plugins/ralph/tools/ralph.sh --epic <epic-id> 2>&1 | cat + ``` + - Alternative (with logging): `.devagent/plugins/ralph/tools/ralph.sh --epic <epic-id> > logs/ralph/<epic-id>.log 2>&1` + - Do NOT run without piping to `cat` or logging, as output may trigger an interactive pager that's difficult to exit +3. The script will: + - Load configuration from `.devagent/plugins/ralph/tools/config.json` + - Validate required `git` section (base_branch, working_branch) + - Validate Epic exists in Beads database (`bd show <epic-id>`) + - Validate working branch exists and current branch matches config + - Enter an autonomous loop: + - Select the next ready task from Beads (filtered by Epic) + - Invoke the AI tool with task context + - Wait for task completion + - Run quality gates + - Update task status in Beads + - Repeat until all tasks are complete or max iterations reached + +**Note:** No logging is needed - Ralph handles its own execution tracking through Beads comments and Git commits. Simply start the script and leave it running. + +**Cleanup:** +Worktrees are created in `../ralph-worktrees/`. After the epic is complete and PR merged, you can delete the worktree manually: +```bash +git worktree remove ../ralph-worktrees/<epic-id> --force +``` + +## How the Autonomous Loop Works + +Ralph operates in a continuous loop: + +1. **Task Selection:** Query Beads for the next ready task (status `todo`, dependencies satisfied) +2. **AI Tool Invocation:** Call the configured AI tool (Cursor, OpenCode, etc.) with: + - Full task context from Beads (`bd show <task-id>`) + - Acceptance criteria + - Related task dependencies + - Agent instructions from `.devagent/plugins/ralph/AGENTS.md` +3. **Execution:** AI agent implements the task according to acceptance criteria +4. **Quality Gates:** Run configured quality gate commands (test, lint, typecheck, etc.) +5. **Status Update:** Update task status in Beads (`closed`, `blocked`, or `in_progress`) +6. **Repeat:** Continue with next ready task until completion or iteration limit + +Monitor progress through: +- Beads comments: `bd show <task-id>` to see task progress +- Git history: Commits follow conventional commit format with task references +- Task status: `bd ready --parent <EPIC_ID> --limit 200` to see remaining tasks (default limit is 10) + +## Error Handling + +- **Configuration missing:** If `config.json` is not found at `.devagent/plugins/ralph/tools/config.json`, error and refer to `setup-ralph-loop.md` for setup +- **Git configuration missing:** If `git` section or required fields (`base_branch`, `working_branch`) are missing, script fails with clear error message +- **Working branch doesn't exist:** Script fails immediately if `working_branch` from config doesn't exist locally +- **Wrong branch:** Script fails immediately if current branch doesn't match `working_branch` from config +- **Epic not found:** Script fails immediately if Epic ID doesn't exist in Beads database +- **AI tool unavailable:** If the configured AI tool command is not found, pause and report error +- **Beads errors:** Task selection or status update failures are logged by Ralph script + +## Output + +Ralph runs continuously until: +- All tasks are completed (`status: closed`) +- Maximum iterations reached (configured in `config.json`) +- Manual interruption (Ctrl+C) + +Execution artifacts (commits, Beads updates, comments) are tracked in the repository and Beads database respectively. diff --git a/.devagent/plugins/ralph/workflows/task-setup-handoff.md b/.devagent/plugins/ralph/workflows/task-setup-handoff.md new file mode 100644 index 0000000..bb1bf5a --- /dev/null +++ b/.devagent/plugins/ralph/workflows/task-setup-handoff.md @@ -0,0 +1,197 @@ +# Task Setup Handoff (Ralph Plugin) + +## Mission +Create a **task setup handoff packet** for a Ralph/Beads epic so a new agent can start execution without re-discovering: +- plan + research context +- Beads epic/tasks + routing labels + dependencies +- Ralph config + branch requirements +- known gotchas + verification commands + +This workflow is **documentation-only**. It does not execute the epic. + +## Inputs +- Required: + - Task hub path (e.g. `.devagent/workspace/tasks/active/YYYY-MM-DD_task-slug/`) + - Epic ID (e.g. `devagent-300b`) +- Optional: + - Plan path (if not in task hub) + - Research path (if not obvious) + - Ralph config path (default: `.devagent/plugins/ralph/tools/config.json`) + +## References (Canonical) +- Beads CLI reference: `.devagent/plugins/ralph/skills/beads-integration/SKILL.md` +- Planβ†’Beads mapping rules: `.devagent/plugins/ralph/skills/plan-to-beads-conversion/SKILL.md` +- Setup planβ†’Beads+config workflow (for commands): `.devagent/plugins/ralph/workflows/setup-ralph-loop.md` +- Core handoff prompt workflow (for prompt shape, optional): `.devagent/core/workflows/handoff.md` + +## Workflow Steps + +### Step 1: Pull the minimal context set (don’t rediscover) +- Task hub: + - `AGENTS.md` (progress + checklist + references) + - `plan/*.md` (canonical implementation steps + acceptance criteria) + - `research/*.md` (if present) OR `.devagent/workspace/research/<...>.md` (when research is centralized) +- Ralph config: + - `.devagent/plugins/ralph/tools/config.json` (git branches + agent routing label keys) +- Beads: + - Epic + child tasks: `bd show <EPIC_ID> --json`, `bd list --parent <EPIC_ID> --json` + - Dependency graph: `bd dep tree <EPIC_ID>` + +### Step 2: Capture known β€œsetup gotchas” explicitly +Always write these down in the packet (even if β€œobvious”): +- **Active definition**: what exactly counts as β€œactive” (Beads status? runtime state? both?) +- **Writer vs viewer contract**: log writer path + filename/sanitization must match viewer expectations +- **Branch/regression mismatch**: confirm whether a prior fix exists vs a true missing feature +- **Daemon staleness**: for write operations, default to direct mode: `BD_NO_DAEMON=1` or `bd ... --no-daemon` +- **Routing**: direct epic children must have exactly **one** routing label that exists in `.devagent/plugins/ralph/tools/config.json` β†’ `agents` keys +- **Parent linkage** (safe by default): set parent explicitly for direct epic children so `bd ready --parent` works reliably +- **CLI drift**: if any `bd` flag looks suspicious, confirm with `bd create --help` / `bd update --help` (don’t guess) + +### Step 3: Add a short verification checklist (copy/paste) +Include commands + what β€œgood” looks like. + +**Beads sanity:** +```bash +which bd +bd info --json +bd show <EPIC_ID> --json +bd list --parent <EPIC_ID> --json +bd dep tree <EPIC_ID> +``` + +**Routing labels (must be exactly one per direct epic child):** +```bash +jq -r '.agents | keys[]' .devagent/plugins/ralph/tools/config.json +bd label list <EPIC_ID>.1 +bd label list <EPIC_ID>.2 +bd label list <EPIC_ID>.3 +# ... direct epic children only +``` + +**Parent + ready list (must not be silently empty):** +```bash +# Note: bd ready defaults to --limit 10 +bd ready --parent <EPIC_ID> --limit 200 --json +``` +Expected: returns **at least** the first unblocked task(s) (usually `.1`). + +**Dependencies (spot-check):** +```bash +bd show <EPIC_ID>.4 --json +bd show <EPIC_ID>.5 --json +``` +Expected: `.4` depends on earlier tasks as described in the plan; `.5` depends on `.1–.4` (or equivalent). + +**Ralph git config (safe by default):** +```bash +jq '.git' .devagent/plugins/ralph/tools/config.json +WORKING_BRANCH="$(jq -r '.git.working_branch' .devagent/plugins/ralph/tools/config.json)" +git rev-parse --verify "$WORKING_BRANCH" >/dev/null +[ "$(git branch --show-current)" = "$WORKING_BRANCH" ] +``` +Expected: working branch exists locally and matches current checkout. + +### Step 4: Produce the handoff packet (template) +Save the packet as a markdown artifact adjacent to the task hub (recommended location): +- `.devagent/workspace/tasks/active/<task>/handoff/YYYY-MM-DD_task-setup-handoff.md` + +Use this template (fill in every section; remove optional sections only if truly empty): + +```md +**Goal / Intent** +<what the epic is trying to fix, in one paragraph> + +**Current State** +- What’s set up already (plan/research done, epic/tasks created, config ready) +- What has NOT been executed yet (explicitly) + +**Critical Issues / Known Gotchas** +1. Active definition: <current ambiguity + what to verify> +2. Writer vs viewer contract: <path + naming + env vars involved> +3. Branch/regression mismatch: <what to check first to avoid reinventing> + +**Plan** +- <path to plan> +- Key tasks (1–4) summary + +**Research** +- <path to research> +- Verification checklist summary (what to validate first) + +**Beads Epic / Tasks** +- Epic ID: <EPIC_ID> +- Task graph: + - .1 β†’ unblocks .2, .3 + - .4 depends on .1, .2, .3 + - .5 depends on .1–.4 +- Routing: + - Valid labels are keys in `.devagent/plugins/ralph/tools/config.json` β†’ `agents` + - Direct epic children must have exactly one routing label +- Parent linkage: + - Ensure each direct child has `parent=<EPIC_ID>` so `bd ready --parent <EPIC_ID>` works + +**Ralph Config** +- Config path: `.devagent/plugins/ralph/tools/config.json` +- base_branch: <value> +- working_branch: <value> (must exist + match current checkout) + +**Verification Checklist** +- labels valid + exactly one per direct epic child +- deps wired +- `bd ready --parent <EPIC_ID> --limit 200` returns at least task .1 +- working_branch exists and matches current checkout + +**Example Runbook (Copy/Paste)** +<commands to validate and then continue with start-ralph-execution> +``` + +## Concrete Example: β€œFix Beads Live Log Viewing” + +### Context +- Task hub: `.devagent/workspace/tasks/active/2026-01-20_fix-beads-live-log-viewing/AGENTS.md` +- Plan: `.devagent/workspace/tasks/active/2026-01-20_fix-beads-live-log-viewing/plan/2026-01-20_beads-live-log-viewing-plan.md` +- Research: `.devagent/workspace/research/2026-01-20_beads-live-log-viewing-file-not-found.md` + +### Intent Summary (what’s broken) +Ralph Monitoring live log viewing consistently shows β€œcan’t find the log files”. The fix focus is **only stream logs for active tasks**; inactive tasks should not surface noisy errors. + +### Epic / Graph +- Epic ID (expected): `devagent-300b` +- Task graph (expected): + - `.1` β†’ unblocks `.2`, `.3` + - `.4` depends on `.1`, `.2`, `.3` + - `.5` depends on `.1–.4` + +### Setup Verification (copy/paste) +```bash +# Beads +bd info --json +bd show devagent-300b --json +bd list --parent devagent-300b --json +bd dep tree devagent-300b +bd ready --parent devagent-300b --limit 200 --json + +# Routing labels +jq -r '.agents | keys[]' .devagent/plugins/ralph/tools/config.json +bd label list devagent-300b.1 +bd label list devagent-300b.2 +bd label list devagent-300b.3 +bd label list devagent-300b.4 +bd label list devagent-300b.5 + +# Ralph config: working branch must exist and match checkout +jq '.git' .devagent/plugins/ralph/tools/config.json +WORKING_BRANCH="$(jq -r '.git.working_branch' .devagent/plugins/ralph/tools/config.json)" +git rev-parse --verify "$WORKING_BRANCH" >/dev/null +[ "$(git branch --show-current)" = "$WORKING_BRANCH" ] +``` + +If `bd show devagent-300b` returns β€œnot found”, treat it as a **setup blocker**: +- verify you’re in the correct repo +- verify Beads is pointing at the expected DB (`bd info --json`) +- if needed, rerun the planβ†’Beads setup workflow: `.devagent/plugins/ralph/workflows/setup-ralph-loop.md` + +### Continuation +After the packet is written and verification passes, proceed with: +- `.devagent/plugins/ralph/workflows/start-ralph-execution.md` using epic `devagent-300b` + diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..4a1dfa4 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,23 @@ +# Agent Workflow (React Router Starter) + +This repo uses **Beads (bd)** for all work tracking and **Ralph** for autonomous execution. Follow these rules whenever you act as an agent. + +## Beads (Required) + +- All work must be tracked in Beads. Do not use markdown TODO lists as a substitute. +- Read task context first: `bd show <id> --json` and `bd comments <id> --json`. +- Update status when you start/finish: `bd update <id> --status in_progress|closed|blocked`. + +## Ralph / Devagent + +- Full Ralph playbook: `.devagent/plugins/ralph/AGENTS.md`. +- Workflows and setup guides: `.devagent/plugins/ralph/workflows/`. +- Use Ralph tasks and labels to route work (see the playbook). + +## AI Rules + +- Cursor rules live in `.cursorrules/`. Start with `00-project-context.mdc` and apply the domain rules (React Router, Storybook, forms, testing, monorepo, UI). + +## Quality Gates + +- Always derive lint/test/typecheck/build commands from `package.json` before running gates. diff --git a/README.md b/README.md index 9773871..66f1a62 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,12 @@ A modern, full-featured todo application built with React Router 7, showcasing b - **shadcn/ui Components** - Beautiful, accessible UI components - **TypeScript** - Full type safety throughout - **React Context + useReducer** - Built-in state management -- **Vitest** - Fast unit testing +- **Lambda Curry Forms** - Type-safe forms with Zod and React Hook Form ([FORMS_INTEGRATION.md](./FORMS_INTEGRATION.md)) +- **Storybook** - Component development and documentation (port 6006) +- **Bun Test** - Fast unit, component, and integration testing - **Bun** - Fast package manager and runtime -- **Biome** - Fast linting and formatting +- **Biome** - Linting and formatting +- **AI / Agent rules** - Managed by `ai-rules` (AGENTS + Cursor rules) ([AGENTS.md](./AGENTS.md)) ## πŸ“ Project Structure @@ -55,22 +58,58 @@ bun dev 4. Open [http://localhost:5173](http://localhost:5173) in your browser +## πŸ“‹ Usage Examples + +From the **repo root** (uses Turbo): + +```bash +bun dev # Start all dev servers +bun build # Build all packages and apps +bun test # Run all tests (watch from workspace) +bun run test:ci # Run tests once (CI) +bun lint # Lint all packages +bun typecheck # Type check all packages +``` + +From **apps/todo-app** (or `bun run --filter todo-app ...` from root): + +```bash +cd apps/todo-app +bun dev # Start dev server (http://localhost:5173) +bun run storybook # Start Storybook (http://localhost:6006) +bun run build-storybook # Build static Storybook +bun test # Bun test run +bun run test:watch # Bun test watch mode +bun run test:run # Bun test single run +``` + +Quick flows: + +- **Add a todo:** Open app β†’ type in the input β†’ submit (or use the "Advanced Todo Form" route for the full form example). +- **Run tests:** From root `bun test`, or from `apps/todo-app`: `bun run test:run`. +- **Browse components:** From `apps/todo-app` run `bun run storybook` and open http://localhost:6006. + ## πŸ“¦ Available Scripts -### Root Level +### Root level - `bun dev` - Start all development servers - `bun build` - Build all packages and apps -- `bun test` - Run all tests +- `bun test` - Run all tests (Turbo) +- `bun run test:ci` - Run tests once (CI) - `bun lint` - Lint all packages - `bun format` - Format all code - `bun typecheck` - Type check all packages -### App Level (apps/todo-app) +### App level (apps/todo-app) - `bun dev` - Start development server - `bun build` - Build for production - `bun start` - Start production server - `bun test` - Run tests -- `bun test:ui` - Run tests with UI +- `bun run test:run` - Run tests once +- `bun run test:ci` - Run tests once (CI) +- `bun run test:watch` - Run tests in watch mode +- `bun run storybook` - Start Storybook (port 6006) +- `bun run build-storybook` - Build static Storybook ## πŸ—οΈ Architecture @@ -107,24 +146,37 @@ This project uses **Tailwind CSS v4** with CSS-first configuration for modern, e - **Dark mode support**: Uses `@custom-variant` and `@variant` directives for theme switching - **shadcn/ui compatible**: Maintains full compatibility with shadcn/ui components +## πŸ“– Storybook + +Component stories live in **apps/todo-app/app/components/** as `*.stories.tsx` (e.g. `add-todo.stories.tsx`, `todo-item.stories.tsx`, `todo-filters.stories.tsx`, `contact-form.stories.tsx`). Storybook is configured in `apps/todo-app/.storybook/`. + +| Command | Description | +|--------|-------------| +| `bun run storybook` | Start Storybook dev server (from apps/todo-app) β€” http://localhost:6006 | +| `bun run build-storybook` | Build static Storybook output | + +Use `npm run storybook` / `npm run build-storybook` if you prefer npm in that app. + ## πŸ§ͺ Testing -The project includes comprehensive testing setup: +The project uses **Bun test** and **React Testing Library** for unit, component, and integration tests. Full patterns and examples are in **[apps/todo-app/TESTING.md](./apps/todo-app/TESTING.md)**. -- **Vitest** for unit testing -- **@testing-library/react** for component testing -- **jsdom** environment for DOM testing -- Test files located alongside source files in `__tests__` directories +**Patterns:** -Run tests: -```bash -bun test -``` +- **Unit** β€” Pure helpers in `app/lib/__tests__/*.test.ts`. +- **Component** β€” UI components in `app/components/__tests__/*.test.tsx`; use **`renderWithRouter`** from `test/test-utils.tsx` when components use `Link`, `useNavigate`, or other router APIs. +- **Integration** β€” Full route + provider flows in `app/routes/__tests__/*.integration.test.tsx`. -Run tests with UI: -```bash -bun test:ui -``` +**Scripts (from apps/todo-app):** + +| Script | Description | +|--------|-------------| +| `bun test` | Bun test run | +| `bun run test:run` | Single run (CI) | +| `bun run test:ci` | Same as test:run | +| `bun run test:watch` | Watch mode | + +Shared setup: `test/setup.ts`. Shared helpers: `test/test-utils.tsx` (includes `renderWithRouter`). ## 🎨 Styling @@ -177,13 +229,19 @@ The app supports: - Static pre-rendering - Progressive enhancement +## πŸ“š Documentation + +- **[FORMS_INTEGRATION.md](./FORMS_INTEGRATION.md)** β€” Lambda Curry Forms setup, patterns, and examples +- **[apps/todo-app/TESTING.md](./apps/todo-app/TESTING.md)** β€” Testing guide (unit, component, integration, `renderWithRouter`) +- **[AGENTS.md](./AGENTS.md)** β€” Generated agent rules (ai-rules) and Ralph/Beads guidance + ## πŸ“š Learn More - [React Router 7 Documentation](https://reactrouter.com/) - [Tailwind CSS v4](https://tailwindcss.com/) - [shadcn/ui](https://ui.shadcn.com/) - [React Context](https://react.dev/reference/react/useContext) -- [Vitest](https://vitest.dev/) +- [Bun test](https://bun.sh/docs/cli/test) - [Turbo](https://turbo.build/) ## 🀝 Contributing diff --git a/apps/todo-app/.storybook/main.ts b/apps/todo-app/.storybook/main.ts new file mode 100644 index 0000000..16f8233 --- /dev/null +++ b/apps/todo-app/.storybook/main.ts @@ -0,0 +1,19 @@ +import type { StorybookConfig } from '@storybook/react-vite'; + +const config: StorybookConfig = { + stories: ['../app/**/*.stories.@(ts|tsx)'], + addons: ['@storybook/addon-essentials', '@storybook/addon-links'], + framework: { + name: '@storybook/react-vite', + options: {} + }, + async viteFinal(config) { + const path = await import('node:path'); + return { + ...config, + configFile: path.resolve(__dirname, 'vite.config.ts') + }; + } +}; + +export default config; diff --git a/apps/todo-app/.storybook/preview.tsx b/apps/todo-app/.storybook/preview.tsx new file mode 100644 index 0000000..62d4c1f --- /dev/null +++ b/apps/todo-app/.storybook/preview.tsx @@ -0,0 +1,30 @@ +import type { Preview } from '@storybook/react'; +import type { ComponentType } from 'react'; +import { createMemoryRouter, RouterProvider } from 'react-router-dom'; +import { TodoProvider } from '~/lib/todo-context'; +import '../app/globals.css'; + +const withRouter = (Story: ComponentType) => { + const router = createMemoryRouter([{ path: '/', element: <Story /> }], { initialEntries: ['/'] }); + return <RouterProvider router={router} />; +}; + +const withTodoProvider = (Story: ComponentType) => ( + <TodoProvider> + <Story /> + </TodoProvider> +); + +const preview: Preview = { + decorators: [withRouter, withTodoProvider], + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i + } + } + } +}; + +export default preview; diff --git a/apps/todo-app/.storybook/vite.config.ts b/apps/todo-app/.storybook/vite.config.ts new file mode 100644 index 0000000..3f6be70 --- /dev/null +++ b/apps/todo-app/.storybook/vite.config.ts @@ -0,0 +1,7 @@ +import tailwindcss from '@tailwindcss/vite'; +import { defineConfig } from 'vite'; +import tsconfigPaths from 'vite-tsconfig-paths'; + +export default defineConfig({ + plugins: [tsconfigPaths(), tailwindcss()] +}); diff --git a/apps/todo-app/TESTING.md b/apps/todo-app/TESTING.md new file mode 100644 index 0000000..a170037 --- /dev/null +++ b/apps/todo-app/TESTING.md @@ -0,0 +1,80 @@ +# Testing Guide + +This app uses **Bun test** and **React Testing Library** for unit, component, and integration tests. + +## Running tests + +```bash +npm run test # watch mode +npm run test:run # single run (CI) +npm run test:ci # same as test:run +npm run test:watch # explicit watch mode +``` + +Use `bun run test`, `bun run test:run`, etc. as equivalent commands. + +Optional coverage: + +```bash +bun test --coverage --coverage-reporter=text --coverage-reporter=lcov +``` + +## Test layout + +| Pattern | Location | Purpose | +|--------|----------|---------| +| **Unit** | `app/lib/__tests__/*.test.ts` | Pure utilities (e.g. `format.ts`, `todo-context` helpers). | +| **Component** | `app/components/__tests__/*.test.tsx` | UI components with router/context mocking. | +| **Integration** | `app/routes/__tests__/*.integration.test.tsx` | Full route + provider flows. | + +Shared setup: `test/setup.ts` (jest-dom, cleanup). Shared helpers: `test/test-utils.tsx`. + +## Unit test examples + +- **App:** `app/lib/__tests__/format.test.ts` β€” tests `slugify()` and other pure helpers. +- **Packages:** `packages/utils` has `cn.test.ts` and `types.test.ts`; `packages/ui` has `button.test.tsx`. Run tests from repo root or each package. + +## Component tests with React Router + +Components that use `Link`, `useNavigate`, `useFetcher`, or `useHref` need router context. Use the shared helper: + +```tsx +import { renderWithRouter } from '../../../test/test-utils'; + +it('renders and submits', () => { + renderWithRouter(<MyComponent />); + // or with custom route/entry: + renderWithRouter(<Page />, { initialEntries: ['/contact'] }); +}); +``` + +`renderWithRouter` wraps the component in React Router’s `createMemoryRouter` + `RouterProvider`. See `test/test-utils.tsx` and `app/components/__tests__/add-todo.test.tsx` for examples. + +## Integration test pattern + +Integration tests render a full route with providers and assert user flows (e.g. add todo, see it in the list): + +```tsx +import { renderWithRouter } from '../../../test/test-utils'; +import { TodoProvider } from '../../lib/todo-context'; +import Home from '../home'; + +renderWithRouter( + <TodoProvider> + <Home /> + </TodoProvider> +); +// then fire events and assert DOM/state +``` + +See `app/routes/__tests__/home.integration.test.tsx` (Todo flow: provider + AddTodo + filtered list). For full-route integration with `Link`/navigation, use the app router in E2E or a test environment that mounts the full app. + +## Bun test setup + +`bunfig.toml` preloads `test/setup.ts`, which: + +- boots a JSDOM environment for component/integration tests +- registers `@testing-library/jest-dom` matchers +- runs RTL cleanup after each test + +Coverage remains optional via `bun test --coverage ...`. diff --git a/apps/todo-app/app/components/__tests__/add-todo.test.tsx b/apps/todo-app/app/components/__tests__/add-todo.test.tsx index 7a4bafa..eafe6f0 100644 --- a/apps/todo-app/app/components/__tests__/add-todo.test.tsx +++ b/apps/todo-app/app/components/__tests__/add-todo.test.tsx @@ -1,53 +1,51 @@ -import { fireEvent, render, screen } from '@testing-library/react'; -import { createMemoryRouter, RouterProvider } from 'react-router-dom'; -import { describe, expect, it, vi } from 'vitest'; +import { fireEvent, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, jest } from 'bun:test'; +import { renderWithRouter } from '../../../test/test-utils'; import { AddTodo } from '../add-todo'; // Hoist regex to top-level to satisfy performance rule const addRegex = /add/i; -function renderWithRouter(ui: React.ReactElement) { - const router = createMemoryRouter([{ path: '/', element: ui }], { initialEntries: ['/'] }); - return render(<RouterProvider router={router} />); -} - describe('AddTodo', () => { it('renders input and button', () => { - const mockOnAdd = vi.fn(); + const mockOnAdd = jest.fn(); renderWithRouter(<AddTodo onAdd={mockOnAdd} />); expect(screen.getByPlaceholderText('Add a new todo...')).toBeInTheDocument(); expect(screen.getByRole('button', { name: addRegex })).toBeInTheDocument(); }); - it('calls onAdd when form is submitted with text', () => { - const mockOnAdd = vi.fn(); + it('calls onAdd when form is submitted with text', async () => { + const mockOnAdd = jest.fn(); + const user = userEvent.setup(); renderWithRouter(<AddTodo onAdd={mockOnAdd} />); const input = screen.getByPlaceholderText('Add a new todo...'); const button = screen.getByRole('button', { name: addRegex }); - fireEvent.change(input, { target: { value: 'New todo' } }); - fireEvent.click(button); + await user.type(input, 'New todo'); + await user.click(button); - expect(mockOnAdd).toHaveBeenCalledWith('New todo'); + await waitFor(() => expect(mockOnAdd).toHaveBeenCalledWith('New todo')); }); - it('clears input after adding todo', () => { - const mockOnAdd = vi.fn(); + it('clears input after adding todo', async () => { + const mockOnAdd = jest.fn(); + const user = userEvent.setup(); renderWithRouter(<AddTodo onAdd={mockOnAdd} />); const input = screen.getByPlaceholderText('Add a new todo...') as HTMLInputElement; const button = screen.getByRole('button', { name: addRegex }); - fireEvent.change(input, { target: { value: 'New todo' } }); - fireEvent.click(button); + await user.type(input, 'New todo'); + await user.click(button); - expect(input.value).toBe(''); + await waitFor(() => expect(input.value).toBe('')); }); it('does not call onAdd with empty text', () => { - const mockOnAdd = vi.fn(); + const mockOnAdd = jest.fn(); renderWithRouter(<AddTodo onAdd={mockOnAdd} />); const button = screen.getByRole('button', { name: addRegex }); @@ -56,16 +54,17 @@ describe('AddTodo', () => { expect(mockOnAdd).not.toHaveBeenCalled(); }); - it('trims whitespace from input', () => { - const mockOnAdd = vi.fn(); + it('trims whitespace from input', async () => { + const mockOnAdd = jest.fn(); + const user = userEvent.setup(); renderWithRouter(<AddTodo onAdd={mockOnAdd} />); const input = screen.getByPlaceholderText('Add a new todo...'); const button = screen.getByRole('button', { name: addRegex }); - fireEvent.change(input, { target: { value: ' New todo ' } }); - fireEvent.click(button); + await user.type(input, ' New todo '); + await user.click(button); - expect(mockOnAdd).toHaveBeenCalledWith('New todo'); + await waitFor(() => expect(mockOnAdd).toHaveBeenCalledWith('New todo')); }); }); diff --git a/apps/todo-app/app/components/__tests__/contact-form.test.tsx b/apps/todo-app/app/components/__tests__/contact-form.test.tsx new file mode 100644 index 0000000..8ff820e --- /dev/null +++ b/apps/todo-app/app/components/__tests__/contact-form.test.tsx @@ -0,0 +1,58 @@ +import { fireEvent, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it, jest } from 'bun:test'; +import { renderWithRouter } from '../../../test/test-utils'; +import { ContactForm } from '../contact-form'; + +describe('ContactForm', () => { + it('renders name, email, message fields and submit button', () => { + const onSubmit = jest.fn(); + renderWithRouter(<ContactForm onSubmit={onSubmit} />); + + expect(screen.getByLabelText(/name/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/email/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/message/i)).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /send message/i })).toBeInTheDocument(); + }); + + it('calls onSubmit with validated data when form is valid', async () => { + const onSubmit = jest.fn(); + const user = userEvent.setup(); + renderWithRouter(<ContactForm onSubmit={onSubmit} />); + + await user.type(screen.getByLabelText(/name/i), 'Jane'); + await user.type(screen.getByLabelText(/email/i), 'jane@example.com'); + await user.type(screen.getByLabelText(/message/i), 'Hello, this is a test message.'); + await user.click(screen.getByRole('button', { name: /send message/i })); + + await waitFor(() => + expect(onSubmit).toHaveBeenCalledWith({ + name: 'Jane', + email: 'jane@example.com', + message: 'Hello, this is a test message.' + }) + ); + }); + + it('does not call onSubmit when required fields are empty', () => { + const onSubmit = jest.fn(); + renderWithRouter(<ContactForm onSubmit={onSubmit} />); + + fireEvent.click(screen.getByRole('button', { name: /send message/i })); + + expect(onSubmit).not.toHaveBeenCalled(); + }); + + it('does not call onSubmit when message is too short', async () => { + const onSubmit = jest.fn(); + const user = userEvent.setup(); + renderWithRouter(<ContactForm onSubmit={onSubmit} />); + + await user.type(screen.getByLabelText(/name/i), 'Jane'); + await user.type(screen.getByLabelText(/email/i), 'jane@example.com'); + await user.type(screen.getByLabelText(/message/i), 'Hi'); + await user.click(screen.getByRole('button', { name: /send message/i })); + + expect(onSubmit).not.toHaveBeenCalled(); + }); +}); diff --git a/apps/todo-app/app/components/add-todo.stories.tsx b/apps/todo-app/app/components/add-todo.stories.tsx new file mode 100644 index 0000000..e2bdf85 --- /dev/null +++ b/apps/todo-app/app/components/add-todo.stories.tsx @@ -0,0 +1,19 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { fn } from '@storybook/test'; +import { AddTodo } from './add-todo'; + +const meta: Meta<typeof AddTodo> = { + component: AddTodo, + title: 'Components/AddTodo', + tags: ['autodocs'] +}; + +export default meta; + +type Story = StoryObj<typeof AddTodo>; + +export const Default: Story = { + args: { + onAdd: fn() + } +}; diff --git a/apps/todo-app/app/components/contact-form.stories.tsx b/apps/todo-app/app/components/contact-form.stories.tsx new file mode 100644 index 0000000..39c7f91 --- /dev/null +++ b/apps/todo-app/app/components/contact-form.stories.tsx @@ -0,0 +1,27 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { fn } from '@storybook/test'; +import { ContactForm } from './contact-form'; + +const meta: Meta<typeof ContactForm> = { + component: ContactForm, + title: 'Components/ContactForm', + tags: ['autodocs'], + parameters: { + docs: { + description: { + component: + 'Example form using @lambdacurry/forms with Zod validation. Use `onSubmit` in Storybook; use `fetcher` on a route with getValidatedFormData in the action.' + } + } + } +}; + +export default meta; + +type Story = StoryObj<typeof ContactForm>; + +export const Default: Story = { + args: { + onSubmit: fn() + } +}; diff --git a/apps/todo-app/app/components/contact-form.tsx b/apps/todo-app/app/components/contact-form.tsx new file mode 100644 index 0000000..b8a4dba --- /dev/null +++ b/apps/todo-app/app/components/contact-form.tsx @@ -0,0 +1,79 @@ +import { zodResolver } from '@hookform/resolvers/zod'; +import { FormError, TextField } from '@lambdacurry/forms'; +import { Button } from '@lambdacurry/forms/ui'; +import type { FetcherWithComponents } from 'react-router'; +import { RemixFormProvider, useRemixForm } from 'remix-hook-form'; +import { z } from 'zod'; + +export const contactFormSchema = z.object({ + name: z.string().min(1, 'Name is required').trim(), + email: z.string().email('Invalid email address').trim(), + message: z.string().min(10, 'Message must be at least 10 characters').trim() +}); + +export type ContactFormData = z.infer<typeof contactFormSchema>; + +interface ContactFormActionData { + message?: string; + errors?: Record<string, { message: string }>; +} + +interface ContactFormProps { + /** When provided, form submits via fetcher to the given action (route usage). */ + fetcher?: FetcherWithComponents<ContactFormActionData>; + /** When provided (e.g. in Storybook), called with validated data on submit. */ + onSubmit?: (data: ContactFormData) => void; +} + +const defaultValues: ContactFormData = { + name: '', + email: '', + message: '' +}; + +export function ContactForm({ fetcher, onSubmit }: ContactFormProps) { + const methods = useRemixForm<ContactFormData>({ + resolver: zodResolver(contactFormSchema), + defaultValues, + ...(fetcher && { + fetcher, + submitConfig: { action: '/contact', method: 'post' } + }), + ...(onSubmit && { + submitHandlers: { + onValid: data => { + onSubmit(data); + methods.reset(); + } + } + }) + }); + + const isSubmitting = fetcher?.state === 'submitting'; + + const formContent = ( + <> + <TextField name="name" label="Name" placeholder="Your name" required /> + <TextField name="email" type="email" label="Email" placeholder="you@example.com" required /> + <TextField name="message" label="Message" placeholder="Your message..." required /> + <FormError name="_form" /> + <Button type="submit" disabled={isSubmitting}> + {isSubmitting ? 'Sending...' : 'Send message'} + </Button> + </> + ); + + return ( + <RemixFormProvider {...methods}> + {fetcher ? ( + <fetcher.Form onSubmit={methods.handleSubmit} className="space-y-4"> + {formContent} + </fetcher.Form> + ) : ( + <form onSubmit={methods.handleSubmit} className="space-y-4"> + {formContent} + </form> + )} + </RemixFormProvider> + ); +} diff --git a/apps/todo-app/app/components/todo-filters.stories.tsx b/apps/todo-app/app/components/todo-filters.stories.tsx new file mode 100644 index 0000000..a5296a2 --- /dev/null +++ b/apps/todo-app/app/components/todo-filters.stories.tsx @@ -0,0 +1,44 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { fn } from '@storybook/test'; +import type { TodoFilter } from '@todo-starter/utils'; +import { TodoFilters } from './todo-filters'; + +const meta: Meta<typeof TodoFilters> = { + component: TodoFilters, + title: 'Components/TodoFilters', + tags: ['autodocs'] +}; + +export default meta; + +type Story = StoryObj<typeof TodoFilters>; + +export const All: Story = { + args: { + currentFilter: 'all' as TodoFilter, + onFilterChange: fn(), + activeCount: 3, + completedCount: 0, + onClearCompleted: fn() + } +}; + +export const Active: Story = { + args: { + currentFilter: 'active' as TodoFilter, + onFilterChange: fn(), + activeCount: 2, + completedCount: 1, + onClearCompleted: fn() + } +}; + +export const WithCompleted: Story = { + args: { + currentFilter: 'completed' as TodoFilter, + onFilterChange: fn(), + activeCount: 1, + completedCount: 2, + onClearCompleted: fn() + } +}; diff --git a/apps/todo-app/app/components/todo-item.stories.tsx b/apps/todo-app/app/components/todo-item.stories.tsx new file mode 100644 index 0000000..a9ec654 --- /dev/null +++ b/apps/todo-app/app/components/todo-item.stories.tsx @@ -0,0 +1,40 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { fn } from '@storybook/test'; +import type { Todo } from '@todo-starter/utils'; +import { TodoItem } from './todo-item'; + +const sampleTodo: Todo = { + id: '1', + text: 'Learn React Router 7', + completed: false, + createdAt: new Date(), + updatedAt: new Date() +}; + +const meta: Meta<typeof TodoItem> = { + component: TodoItem, + title: 'Components/TodoItem', + tags: ['autodocs'] +}; + +export default meta; + +type Story = StoryObj<typeof TodoItem>; + +export const Default: Story = { + args: { + todo: sampleTodo, + onToggle: fn(), + onDelete: fn(), + onUpdate: fn() + } +}; + +export const Completed: Story = { + args: { + todo: { ...sampleTodo, completed: true, text: 'Completed task' }, + onToggle: fn(), + onDelete: fn(), + onUpdate: fn() + } +}; diff --git a/apps/todo-app/app/lib/__tests__/format.test.ts b/apps/todo-app/app/lib/__tests__/format.test.ts new file mode 100644 index 0000000..9628c7a --- /dev/null +++ b/apps/todo-app/app/lib/__tests__/format.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from 'bun:test'; +import { slugify } from '../format'; + +describe('format utilities', () => { + describe('slugify', () => { + it('converts text to lowercase hyphenated slug', () => { + expect(slugify('Hello World')).toBe('hello-world'); + }); + + it('trims leading and trailing whitespace', () => { + expect(slugify(' foo bar ')).toBe('foo-bar'); + }); + + it('collapses multiple spaces into a single hyphen', () => { + expect(slugify('a b c')).toBe('a-b-c'); + }); + + it('strips non-alphanumeric characters', () => { + expect(slugify('Hello, World!')).toBe('hello-world'); + }); + + it('collapses multiple hyphens', () => { + expect(slugify('a---b')).toBe('a-b'); + }); + + it('returns empty string for empty or only-symbols input', () => { + expect(slugify('')).toBe(''); + expect(slugify(' ')).toBe(''); + expect(slugify('!!!')).toBe(''); + }); + }); +}); diff --git a/apps/todo-app/app/lib/__tests__/todo-context.test.tsx b/apps/todo-app/app/lib/__tests__/todo-context.test.tsx index deaa7f1..956f7b8 100644 --- a/apps/todo-app/app/lib/__tests__/todo-context.test.tsx +++ b/apps/todo-app/app/lib/__tests__/todo-context.test.tsx @@ -1,6 +1,6 @@ import { act, render, screen } from '@testing-library/react'; import type { Todo } from '@todo-starter/utils'; -import { describe, expect, it } from 'vitest'; +import { describe, expect, it } from 'bun:test'; import { getFilteredTodos, TodoProvider, useTodoStore } from '../todo-context'; // Mock crypto.randomUUID for consistent testing diff --git a/apps/todo-app/app/lib/format.ts b/apps/todo-app/app/lib/format.ts new file mode 100644 index 0000000..2714d78 --- /dev/null +++ b/apps/todo-app/app/lib/format.ts @@ -0,0 +1,12 @@ +/** + * Converts a string to a URL-friendly slug (lowercase, hyphens, no extra spaces). + */ +export function slugify(text: string): string { + return text + .trim() + .toLowerCase() + .replace(/\s+/g, '-') + .replace(/[^a-z0-9-]/g, '') + .replace(/-+/g, '-') + .replace(/^-|-$/g, ''); +} diff --git a/apps/todo-app/app/routes.ts b/apps/todo-app/app/routes.ts index aee5c60..724dffe 100644 --- a/apps/todo-app/app/routes.ts +++ b/apps/todo-app/app/routes.ts @@ -1,4 +1,8 @@ import type { RouteConfig } from '@react-router/dev/routes'; import { index, route } from '@react-router/dev/routes'; -export default [index('routes/home.tsx'), route('create-todo', 'routes/create-todo.tsx')] satisfies RouteConfig; +export default [ + index('routes/home.tsx'), + route('create-todo', 'routes/create-todo.tsx'), + route('contact', 'routes/contact.tsx') +] satisfies RouteConfig; diff --git a/apps/todo-app/app/routes/__tests__/home.integration.test.tsx b/apps/todo-app/app/routes/__tests__/home.integration.test.tsx new file mode 100644 index 0000000..2779a25 --- /dev/null +++ b/apps/todo-app/app/routes/__tests__/home.integration.test.tsx @@ -0,0 +1,63 @@ +import { fireEvent, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it } from 'bun:test'; +import { renderWithRouter } from '../../../test/test-utils'; +import { AddTodo } from '../../components/add-todo'; +import { TodoItem } from '../../components/todo-item'; +import { getFilteredTodos, TodoProvider, useTodoStore } from '../../lib/todo-context'; + +/** + * Integration test: full flow combining TodoProvider, AddTodo, and filtered list. + * Exercises multiple units together without requiring the full route tree (which uses Link from react-router and needs the app's router). + */ +function TodoFlow() { + const { todos, filter, addTodo, toggleTodo, deleteTodo, updateTodo, setFilter } = useTodoStore(); + const filtered = getFilteredTodos(todos, filter); + return ( + <div> + <AddTodo onAdd={addTodo} /> + <button type="button" onClick={() => setFilter('active')} aria-label="Filter active"> + Active + </button> + {filtered.map(todo => ( + <TodoItem key={todo.id} todo={todo} onToggle={toggleTodo} onDelete={deleteTodo} onUpdate={updateTodo} /> + ))} + </div> + ); +} + +describe('Todo flow (integration)', () => { + it('adds a todo and shows it in the list', async () => { + const user = userEvent.setup(); + renderWithRouter( + <TodoProvider> + <TodoFlow /> + </TodoProvider> + ); + + expect(screen.getByPlaceholderText('Add a new todo...')).toBeInTheDocument(); + const input = screen.getByPlaceholderText('Add a new todo...'); + const addButton = screen.getByRole('button', { name: /add/i }); + + await user.type(input, 'Integration test todo'); + await user.click(addButton); + + await waitFor(() => expect(screen.getByText('Integration test todo')).toBeInTheDocument()); + }); + + it('shows initial todos and allows filtering', () => { + renderWithRouter( + <TodoProvider> + <TodoFlow /> + </TodoProvider> + ); + + expect(screen.getByText('Learn React Router 7')).toBeInTheDocument(); + expect(screen.getByText('Set up Tailwind CSS')).toBeInTheDocument(); + + const activeFilter = screen.getByRole('button', { name: /filter active/i }); + fireEvent.click(activeFilter); + + expect(screen.getByText('Learn React Router 7')).toBeInTheDocument(); + }); +}); diff --git a/apps/todo-app/app/routes/contact.tsx b/apps/todo-app/app/routes/contact.tsx new file mode 100644 index 0000000..11437b8 --- /dev/null +++ b/apps/todo-app/app/routes/contact.tsx @@ -0,0 +1,66 @@ +import { zodResolver } from '@hookform/resolvers/zod'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@todo-starter/ui'; +import type { ActionFunctionArgs, MetaFunction } from 'react-router'; +import { useFetcher } from 'react-router'; +import { getValidatedFormData } from 'remix-hook-form'; +import { ContactForm, type ContactFormData, contactFormSchema } from '~/components/contact-form'; + +export const meta: MetaFunction = () => { + return [ + { title: 'Contact - React Router 7 Starter' }, + { name: 'description', content: 'Example contact form with Zod validation and action handler' } + ]; +}; + +export const action = async ({ request }: ActionFunctionArgs) => { + const { data, errors } = await getValidatedFormData<ContactFormData>(request, zodResolver(contactFormSchema)); + + if (errors) return { errors }; + + try { + // Simulate sending the message (e.g. to an API or email service) + console.log('Contact submission:', data); + return { message: 'Thanks! Your message has been sent.' }; + } catch (_error) { + return { + errors: { + _form: { message: 'Failed to send. Please try again.' } + } + }; + } +}; + +export default function Contact() { + const fetcher = useFetcher<{ + message?: string; + errors?: Record<string, { message: string }>; + }>(); + + return ( + <div className="min-h-screen bg-background p-4"> + <div className="max-w-xl mx-auto space-y-6"> + <div> + <h1 className="text-3xl font-bold tracking-tight">Contact</h1> + <p className="text-muted-foreground mt-1"> + Example form using @lambdacurry/forms, Zod validation, and getValidatedFormData. + </p> + </div> + + <Card> + <CardHeader> + <CardTitle>Send a message</CardTitle> + <CardDescription>Fill out the form below. Validation runs on client and server.</CardDescription> + </CardHeader> + <CardContent> + {fetcher.data?.message && ( + <div className="p-4 mb-4 bg-green-50 border border-green-200 rounded-lg"> + <p className="text-green-800 font-medium">βœ… {fetcher.data.message}</p> + </div> + )} + <ContactForm fetcher={fetcher} /> + </CardContent> + </Card> + </div> + </div> + ); +} diff --git a/apps/todo-app/app/routes/home.tsx b/apps/todo-app/app/routes/home.tsx index ad99be6..3242b8b 100644 --- a/apps/todo-app/app/routes/home.tsx +++ b/apps/todo-app/app/routes/home.tsx @@ -32,13 +32,16 @@ export default function Home() { Built with React Router 7, Tailwind CSS, shadcn/ui, and @lambdacurry/forms </p> </div> - <div className="flex justify-center"> + <div className="flex justify-center gap-2 flex-wrap"> <Button asChild variant="outline"> <Link to="/create-todo"> <Settings className="h-4 w-4 mr-2" /> Advanced Todo Form </Link> </Button> + <Button asChild variant="outline"> + <Link to="/contact">Contact form example</Link> + </Button> </div> </div> diff --git a/apps/todo-app/bunfig.toml b/apps/todo-app/bunfig.toml new file mode 100644 index 0000000..8755352 --- /dev/null +++ b/apps/todo-app/bunfig.toml @@ -0,0 +1,2 @@ +[test] +preload = ["./test/setup.ts"] diff --git a/apps/todo-app/package.json b/apps/todo-app/package.json index e6a101e..95787f0 100644 --- a/apps/todo-app/package.json +++ b/apps/todo-app/package.json @@ -17,20 +17,34 @@ "typecheck": "tsc --noEmit", "lint": "biome lint .", "format": "biome format --write .", - "test": "vitest", - "test:ui": "vitest --ui", - "test:run": "vitest run", - "test:ci": "vitest run" + "test": "bun test", + "test:watch": "bun test --watch", + "test:ui": "bun test --watch", + "test:run": "bun test", + "test:ci": "bun test", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" }, "devDependencies": { + "@storybook/addon-essentials": "^8", + "@storybook/addon-links": "^8", + "@storybook/blocks": "^8", + "@storybook/react": "^8", + "@storybook/react-vite": "^8", + "@storybook/test": "^8", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.1.0", + "@testing-library/user-event": "^14.6.1", + "bun-types": "^1.3.5", "@types/node": "^20", - "@vitest/ui": "^3.2.4", "jsdom": "^26.1.0", + "react-router-dom": "^7.13.0", + "storybook": "^8", + "tailwindcss-animate": "^1.0.7", "typescript": "^5.8.3", "vite": "^6.3.3", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.2.4" + "vite-tsconfig-paths": "^5.1.4" }, "dependencies": { "@hookform/resolvers": "^3.9.1", diff --git a/apps/todo-app/test/bun-jest-dom.d.ts b/apps/todo-app/test/bun-jest-dom.d.ts new file mode 100644 index 0000000..9723d17 --- /dev/null +++ b/apps/todo-app/test/bun-jest-dom.d.ts @@ -0,0 +1,11 @@ +import 'bun:test'; + +declare module 'bun:test' { + interface Matchers<T = unknown> { + toBeDisabled(): T; + toBeInTheDocument(): T; + toHaveAttribute(name: string, value?: string): T; + toHaveClass(...classNames: string[]): T; + toHaveTextContent(text: string | RegExp): T; + } +} diff --git a/apps/todo-app/test/setup.ts b/apps/todo-app/test/setup.ts index 85466e8..cd7d168 100644 --- a/apps/todo-app/test/setup.ts +++ b/apps/todo-app/test/setup.ts @@ -1,10 +1,207 @@ -import '@testing-library/jest-dom/vitest'; -import { cleanup } from '@testing-library/react'; -import { afterEach } from 'vitest'; +import { afterEach, beforeEach, jest, mock } from 'bun:test'; +import '@testing-library/jest-dom'; +import { within } from '@testing-library/dom'; +import { cleanup, configure, screen } from '@testing-library/react'; +import { JSDOM } from 'jsdom'; + +if (typeof globalThis.window === 'undefined' || typeof globalThis.document === 'undefined') { + const dom = new JSDOM('<!doctype html><html><body></body></html>', { + url: 'http://localhost' + }); + + Object.defineProperty(globalThis, 'window', { + configurable: true, + writable: true, + value: dom.window + }); + + Object.defineProperty(globalThis, 'document', { + configurable: true, + writable: true, + value: dom.window.document + }); + + Object.defineProperty(globalThis, 'navigator', { + configurable: true, + writable: true, + value: dom.window.navigator + }); + + Object.defineProperty(globalThis, 'HTMLElement', { + configurable: true, + writable: true, + value: dom.window.HTMLElement + }); + + Object.defineProperty(globalThis, 'Node', { + configurable: true, + writable: true, + value: dom.window.Node + }); + + Object.defineProperty(globalThis, 'Element', { + configurable: true, + writable: true, + value: dom.window.Element + }); + + Object.defineProperty(globalThis, 'MutationObserver', { + configurable: true, + writable: true, + value: dom.window.MutationObserver + }); + + Object.defineProperty(globalThis, 'CustomEvent', { + configurable: true, + writable: true, + value: dom.window.CustomEvent + }); + + Object.defineProperty(globalThis, 'Event', { + configurable: true, + writable: true, + value: dom.window.Event + }); + + Object.defineProperty(globalThis, 'KeyboardEvent', { + configurable: true, + writable: true, + value: dom.window.KeyboardEvent + }); + + Object.defineProperty(globalThis, 'MouseEvent', { + configurable: true, + writable: true, + value: dom.window.MouseEvent + }); + + Object.defineProperty(globalThis, 'HTMLInputElement', { + configurable: true, + writable: true, + value: dom.window.HTMLInputElement + }); + + Object.defineProperty(globalThis, 'HTMLFormElement', { + configurable: true, + writable: true, + value: dom.window.HTMLFormElement + }); + + Object.defineProperty(globalThis, 'HTMLButtonElement', { + configurable: true, + writable: true, + value: dom.window.HTMLButtonElement + }); + + Object.defineProperty(globalThis, 'HTMLTextAreaElement', { + configurable: true, + writable: true, + value: dom.window.HTMLTextAreaElement + }); + + Object.defineProperty(globalThis, 'DocumentFragment', { + configurable: true, + writable: true, + value: dom.window.DocumentFragment + }); + + Object.defineProperty(globalThis, 'getComputedStyle', { + configurable: true, + writable: true, + value: dom.window.getComputedStyle.bind(dom.window) + }); +} + +if (typeof window !== 'undefined') { + const htmlElementProto = window.HTMLElement.prototype as HTMLElement & { + attachEvent?: (event: string, handler: (...args: unknown[]) => void) => void; + detachEvent?: (event: string, handler: (...args: unknown[]) => void) => void; + }; + + if (typeof htmlElementProto.attachEvent !== 'function') { + htmlElementProto.attachEvent = () => {}; + } + + if (typeof htmlElementProto.detachEvent !== 'function') { + htmlElementProto.detachEvent = () => {}; + } + + if (typeof window.matchMedia !== 'function') { + window.matchMedia = (query: string) => ({ + matches: false, + media: query, + onchange: null, + addListener: () => {}, + removeListener: () => {}, + addEventListener: () => {}, + removeEventListener: () => {}, + dispatchEvent: () => false + }); + } + + if (typeof window.requestAnimationFrame !== 'function') { + window.requestAnimationFrame = (callback: FrameRequestCallback) => + setTimeout(() => callback(Date.now()), 16) as unknown as number; + } + + if (typeof window.cancelAnimationFrame !== 'function') { + window.cancelAnimationFrame = (id: number) => clearTimeout(id); + } + + if (typeof globalThis.requestAnimationFrame !== 'function') { + globalThis.requestAnimationFrame = window.requestAnimationFrame.bind(window); + } + + if (typeof globalThis.cancelAnimationFrame !== 'function') { + globalThis.cancelAnimationFrame = window.cancelAnimationFrame.bind(window); + } + + if (!window.HTMLElement.prototype.scrollTo) { + window.HTMLElement.prototype.scrollTo = function (options?: ScrollToOptions | number, y?: number) { + if (typeof options === 'object' && options !== null) { + this.scrollTop = options.top || 0; + this.scrollLeft = options.left || 0; + } else if (typeof options === 'number') { + this.scrollLeft = options; + this.scrollTop = y || 0; + } + }; + } +} + +if (typeof globalThis.ResizeObserver === 'undefined') { + globalThis.ResizeObserver = class ResizeObserver { + observe() {} + unobserve() {} + disconnect() {} + } as typeof ResizeObserver; +} + +(globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; +configure({ asyncUtilTimeout: 1000 }); // React Router's useRemixForm calls useHref; wrap renders in a Router for components that need it. // For tests that require Router context, prefer rendering the component within a MemoryRouter in the test itself. +beforeEach(() => { + if (!globalThis.document.body) { + globalThis.document.body = globalThis.document.createElement('body'); + } + + Object.assign(screen, within(globalThis.document.body)); + + const originalConsoleError = console.error; + jest.spyOn(console, 'error').mockImplementation((...args: unknown[]) => { + const message = typeof args[0] === 'string' ? args[0] : ''; + if (message.includes('Cannot update a component') && message.includes('while rendering a different component')) { + return; + } + originalConsoleError(...args); + }); +}); + afterEach(() => { cleanup(); + jest.restoreAllMocks(); + mock.restore(); }); diff --git a/apps/todo-app/test/test-utils.tsx b/apps/todo-app/test/test-utils.tsx new file mode 100644 index 0000000..af67b52 --- /dev/null +++ b/apps/todo-app/test/test-utils.tsx @@ -0,0 +1,42 @@ +import { type RenderOptions, render } from '@testing-library/react'; +import type { ReactElement } from 'react'; +import { createMemoryRouter, type RouteObject, RouterProvider } from 'react-router-dom'; + +export interface RenderWithRouterOptions extends Omit<RenderOptions, 'wrapper'> { + /** Route path for initial entry. Default: '/' */ + initialEntries?: string[]; + /** Additional route config (e.g. for loaders/actions in integration tests). */ + routes?: RouteObject[]; +} + +/** + * Renders a React component wrapped in React Router's MemoryRouter. + * Use this for any component that depends on router context (e.g. Link, useNavigate, useFetcher, useHref). + * + * @example + * ```tsx + * renderWithRouter(<MyComponent />); + * renderWithRouter(<Page />, { initialEntries: ['/contact'] }); + * ``` + */ +export function renderWithRouter(ui: ReactElement, options: RenderWithRouterOptions = {}) { + const { initialEntries = ['/'], routes, ...renderOptions } = options; + + const routeConfig: RouteObject[] = routes ?? [ + { + path: '/', + element: ui + } + ]; + + const router = createMemoryRouter(routeConfig, { initialEntries }); + return render(<RouterProvider router={router} />, renderOptions); +} + +/** + * Creates a memory router for integration tests that need full route trees + * (e.g. nested layouts, loaders, or multiple routes). + */ +export function createTestRouter(routes: RouteObject[], initialEntries: string[] = ['/']) { + return createMemoryRouter(routes, { initialEntries }); +} diff --git a/apps/todo-app/tsconfig.json b/apps/todo-app/tsconfig.json index 7715c6a..3c7d17c 100644 --- a/apps/todo-app/tsconfig.json +++ b/apps/todo-app/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "types": ["bun-types"], "baseUrl": ".", "paths": { "~/*": ["./app/*"], diff --git a/apps/todo-app/vitest.config.ts b/apps/todo-app/vitest.config.ts deleted file mode 100644 index ae236a9..0000000 --- a/apps/todo-app/vitest.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import tsconfigPaths from 'vite-tsconfig-paths'; -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - plugins: [tsconfigPaths()], - test: { - globals: true, - environment: 'jsdom', - setupFiles: ['./test/setup.ts'] - } -}); diff --git a/biome.json b/biome.json index d5333cf..ec50e27 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.2.0/schema.json", + "$schema": "https://biomejs.dev/schemas/2.3.11/schema.json", "vcs": { "enabled": false, "clientKind": "git", @@ -16,8 +16,10 @@ "!yarn.lock", "!node_modules", "!**/.react-router", - "!build", - "!dist" + "!**/build/**", + "!**/dist/**", + "!**/storybook-static/**", + "!**/.devagent/**" ] }, "assist": { @@ -73,8 +75,8 @@ "useImportExtensions": "off" }, "a11y": { - "useKeyWithClickEvents": "off", - "noLabelWithoutControl": "off" + "useKeyWithClickEvents": "warn", + "noLabelWithoutControl": "warn" } } } diff --git a/bun.lock b/bun.lock index c235f40..83eccfc 100644 --- a/bun.lock +++ b/bun.lock @@ -4,33 +4,34 @@ "": { "name": "react-router-todo-starter", "dependencies": { - "@hookform/resolvers": "^3.9.1", - "@lambdacurry/forms": "^0.19.1", - "@react-router/node": "^7.7.1", - "@react-router/serve": "^7.7.1", - "fs-extra": "^11.3.0", - "isbot": "^5.1.27", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-hook-form": "^7.53.1", - "react-router": "^7.7.1", + "@hookform/resolvers": "^3.10.0", + "@lambdacurry/forms": "^0.19.7", + "@react-router/node": "^7.13.0", + "@react-router/serve": "^7.13.0", + "fs-extra": "^11.3.3", + "isbot": "^5.1.34", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-hook-form": "^7.71.1", + "react-router": "^7.13.0", + "react-router-dom": "^7.13.0", "remix-hook-form": "7.1.0", - "zod": "^3.24.1", + "zod": "^3.25.76", }, "devDependencies": { - "@biomejs/biome": "2.2.0", - "@react-router/dev": "^7.7.1", - "@types/node": "^20", + "@biomejs/biome": "2.3.11", + "@react-router/dev": "^7.13.0", + "@types/jsdom": "^21.1.7", + "@types/node": "^20.19.30", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.5", "@vitejs/plugin-react": "^4.7.0", - "@vitest/ui": "^3.2.4", + "bun-types": "^1.3.5", "jsdom": "^26.1.0", - "turbo": "^2.1.2", - "typescript": "^5.8.3", - "vite": "^6.3.3", + "turbo": "^2.8.1", + "typescript": "^5.9.3", + "vite": "^6.4.1", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.2.4", }, }, "apps/todo-app": { @@ -55,14 +56,25 @@ "zod": "^3.24.1", }, "devDependencies": { + "@storybook/addon-essentials": "^8", + "@storybook/addon-links": "^8", + "@storybook/blocks": "^8", + "@storybook/react": "^8", + "@storybook/react-vite": "^8", + "@storybook/test": "^8", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.1.0", + "@testing-library/user-event": "^14.6.1", "@types/node": "^20", - "@vitest/ui": "^3.2.4", + "bun-types": "^1.3.5", "jsdom": "^26.1.0", + "react-router-dom": "^7.13.0", + "storybook": "^8", + "tailwindcss-animate": "^1.0.7", "typescript": "^5.8.3", "vite": "^6.3.3", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.2.4", }, }, "packages/ui": { @@ -78,14 +90,15 @@ "react-dom": "^19.1.0", }, "devDependencies": { - "@biomejs/biome": "2.2.0", + "@biomejs/biome": "2.3.11", + "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.1.0", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.5", + "bun-types": "^1.3.5", "jsdom": "^26.1.0", "typescript": "^5.8.3", - "vitest": "^3.2.4", }, "peerDependencies": { "react": "^19.1.0", @@ -100,9 +113,9 @@ "tailwind-merge": "^2.2.0", }, "devDependencies": { - "@biomejs/biome": "2.2.0", + "@biomejs/biome": "2.3.11", + "bun-types": "^1.3.5", "typescript": "^5.8.3", - "vitest": "^3.2.4", }, }, }, @@ -180,23 +193,23 @@ "@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], - "@biomejs/biome": ["@biomejs/biome@2.2.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.2.0", "@biomejs/cli-darwin-x64": "2.2.0", "@biomejs/cli-linux-arm64": "2.2.0", "@biomejs/cli-linux-arm64-musl": "2.2.0", "@biomejs/cli-linux-x64": "2.2.0", "@biomejs/cli-linux-x64-musl": "2.2.0", "@biomejs/cli-win32-arm64": "2.2.0", "@biomejs/cli-win32-x64": "2.2.0" }, "bin": { "biome": "bin/biome" } }, "sha512-3On3RSYLsX+n9KnoSgfoYlckYBoU6VRM22cw1gB4Y0OuUVSYd/O/2saOJMrA4HFfA1Ff0eacOvMN1yAAvHtzIw=="], + "@biomejs/biome": ["@biomejs/biome@2.3.11", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.11", "@biomejs/cli-darwin-x64": "2.3.11", "@biomejs/cli-linux-arm64": "2.3.11", "@biomejs/cli-linux-arm64-musl": "2.3.11", "@biomejs/cli-linux-x64": "2.3.11", "@biomejs/cli-linux-x64-musl": "2.3.11", "@biomejs/cli-win32-arm64": "2.3.11", "@biomejs/cli-win32-x64": "2.3.11" }, "bin": { "biome": "bin/biome" } }, "sha512-/zt+6qazBWguPG6+eWmiELqO+9jRsMZ/DBU3lfuU2ngtIQYzymocHhKiZRyrbra4aCOoyTg/BmY+6WH5mv9xmQ=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zKbwUUh+9uFmWfS8IFxmVD6XwqFcENjZvEyfOxHs1epjdH3wyyMQG80FGDsmauPwS2r5kXdEM0v/+dTIA9FXAg=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-/uXXkBcPKVQY7rc9Ys2CrlirBJYbpESEDme7RKiBD6MmqR2w3j0+ZZXRIL2xiaNPsIMMNhP1YnA+jRRxoOAFrA=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-+OmT4dsX2eTfhD5crUOPw3RPhaR+SKVspvGVmSdZ9y9O/AgL8pla6T4hOn1q+VAFBHuHhsdxDRJgFCSC7RaMOw=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-fh7nnvbweDPm2xEmFjfmq7zSUiox88plgdHF9OIW4i99WnXrAC3o2P3ag9judoUMv8FCSUnlwJCM1B64nO5Fbg=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-6eoRdF2yW5FnW9Lpeivh7Mayhq0KDdaDMYOJnH9aT02KuSIX5V1HmWJCQQPwIQbhDh68Zrcpl8inRlTEan0SXw=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-l4xkGa9E7Uc0/05qU2lMYfN1H+fzzkHgaJoy98wO+b/7Gl78srbCRRgwYSW+BTLixTBrM6Ede5NSBwt7rd/i6g=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-egKpOa+4FL9YO+SMUMLUvf543cprjevNc3CAgDNFLcjknuNMcZ0GLJYa3EGTCR2xIkIUJDVneBV3O9OcIlCEZQ=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-XPSQ+XIPZMLaZ6zveQdwNjbX+QdROEd1zPgMwD47zvHV+tCGB88VH+aynyGxAHdzL+Tm/+DtKST5SECs4iwCLg=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-5UmQx/OZAfJfi25zAnAGHUMuOd+LOsliIt119x2soA2gLggQYrVPA+2kMUxR6Mw5M1deUF/AWWP2qpxgH7Nyfw=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.11", "", { "os": "linux", "cpu": "x64" }, "sha512-/1s9V/H3cSe0r0Mv/Z8JryF5x9ywRxywomqZVLHAoa/uN0eY7F8gEngWKNS5vbbN/BsfpCG5yeBT5ENh50Frxg=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-I5J85yWwUWpgJyC1CcytNSGusu2p9HjDnOPAFG4Y515hwRD0jpR9sT9/T1cKHtuCvEQ/sBvx+6zhz9l9wEJGAg=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.11", "", { "os": "linux", "cpu": "x64" }, "sha512-vU7a8wLs5C9yJ4CB8a44r12aXYb8yYgBn+WeyzbMjaCMklzCv1oXr8x+VEyWodgJt9bDmhiaW/I0RHbn7rsNmw=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.2.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-n9a1/f2CwIDmNMNkFs+JI0ZjFnMO0jdOyGNtihgUNFnlmd84yIYY2KMTBmMV58ZlVHjgmY5Y6E1hVTnSRieggA=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-PZQ6ElCOnkYapSsysiTy0+fYX+agXPlWugh6+eQ6uPKI3vKAqNp6TnMhoM3oY2NltSB89hz59o8xIfOdyhi9Iw=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Nawu5nHjP/zPKTIryh2AavzTc/KEg4um/MxWdXW0A6P/RZOyIpa7+QSjeXwAwX/utJGaCoXRPWtF3m5U/bB3Ww=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.11", "", { "os": "win32", "cpu": "x64" }, "sha512-43VrG813EW+b5+YbDbz31uUsheX+qFKCpXeY9kfdAx+ww3naKxeVkTD9zLIWxUPfJquANMHrmW3wbe/037G0Qg=="], "@csstools/color-helpers": ["@csstools/color-helpers@5.0.2", "", {}, "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA=="], @@ -274,6 +287,8 @@ "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + "@joshwooding/vite-plugin-react-docgen-typescript": ["@joshwooding/vite-plugin-react-docgen-typescript@0.5.0", "", { "dependencies": { "glob": "^10.0.0", "magic-string": "^0.27.0", "react-docgen-typescript": "^2.2.2" }, "peerDependencies": { "typescript": ">= 4.3.x", "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["typescript"] }, "sha512-qYDdL7fPwLRI+bJNurVcis+tNgJmvWjH4YTBGXTA8xMuxFrnAz6E5o35iyzyKbq5J5Lr8mJGfrR5GXl+WGwhgQ=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="], "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], @@ -282,20 +297,14 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], - "@lambdacurry/forms": ["@lambdacurry/forms@0.19.2", "", { "dependencies": { "@hookform/resolvers": "^3.9.1", "@radix-ui/react-alert-dialog": "^1.1.4", "@radix-ui/react-avatar": "^1.1.2", "@radix-ui/react-checkbox": "^1.3.1", "@radix-ui/react-dialog": "^1.1.13", "@radix-ui/react-dropdown-menu": "^2.1.14", "@radix-ui/react-icons": "^1.3.2", "@radix-ui/react-label": "^2.1.6", "@radix-ui/react-popover": "^1.1.13", "@radix-ui/react-radio-group": "^1.2.2", "@radix-ui/react-scroll-area": "^1.2.2", "@radix-ui/react-separator": "^1.1.6", "@radix-ui/react-slider": "^1.3.4", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-switch": "^1.1.2", "@radix-ui/react-tabs": "^1.1.11", "@radix-ui/react-tooltip": "^1.1.6", "@tanstack/react-table": "^8.21.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "date-fns": "^4.1.0", "input-otp": "^1.4.1", "lucide-react": "^0.468.0", "next-themes": "^0.4.4", "react-day-picker": "^9.7.0", "react-hook-form": "^7.53.1", "react-router": "^7.6.3", "react-router-dom": "^7.6.3", "remix-hook-form": "7.1.0", "sonner": "^1.7.1", "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7", "zod": "^3.24.1" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-xz+zCp6c37EdstgVuYjaALV94ANSWMUprRCmKzqAmuGs0awsHdeDoMnGgC8TPWG7+r8G7qJDhTX2qaGKjQdgOA=="], - - "@mjackson/node-fetch-server": ["@mjackson/node-fetch-server@0.2.0", "", {}, "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng=="], - - "@npmcli/git": ["@npmcli/git@4.1.0", "", { "dependencies": { "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", "npm-pick-manifest": "^8.0.0", "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^3.0.0" } }, "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ=="], + "@lambdacurry/forms": ["@lambdacurry/forms@0.19.7", "", { "dependencies": { "@hookform/resolvers": "^3.9.1", "@radix-ui/react-alert-dialog": "^1.1.4", "@radix-ui/react-avatar": "^1.1.2", "@radix-ui/react-checkbox": "^1.3.1", "@radix-ui/react-dialog": "^1.1.13", "@radix-ui/react-dropdown-menu": "^2.1.14", "@radix-ui/react-icons": "^1.3.2", "@radix-ui/react-label": "^2.1.6", "@radix-ui/react-popover": "^1.1.13", "@radix-ui/react-radio-group": "^1.2.2", "@radix-ui/react-scroll-area": "^1.2.2", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-separator": "^1.1.6", "@radix-ui/react-slider": "^1.3.4", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-switch": "^1.1.2", "@radix-ui/react-tabs": "^1.1.11", "@radix-ui/react-tooltip": "^1.1.6", "@tanstack/react-table": "^8.21.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "date-fns": "^4.1.0", "input-otp": "^1.4.1", "lucide-react": "^0.468.0", "next-themes": "^0.4.4", "react-day-picker": "^9.7.0", "react-hook-form": "^7.53.1", "react-router": "^7.6.3", "react-router-dom": "^7.6.3", "remix-hook-form": "7.1.0", "sonner": "^1.7.1", "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7", "zod": "^3.24.1" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-nVRc4zox0srosvU2yNy/UGabqOJngeXEKAOvqx+nEpAiG8qk4s/f2PDVUKarQWOLOjiJs0jKz1m7lDZfXJBAhw=="], - "@npmcli/package-json": ["@npmcli/package-json@4.0.1", "", { "dependencies": { "@npmcli/git": "^4.1.0", "glob": "^10.2.2", "hosted-git-info": "^6.1.1", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^5.0.0", "proc-log": "^3.0.0", "semver": "^7.5.3" } }, "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q=="], + "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], - "@npmcli/promise-spawn": ["@npmcli/promise-spawn@6.0.2", "", { "dependencies": { "which": "^3.0.0" } }, "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg=="], + "@mjackson/node-fetch-server": ["@mjackson/node-fetch-server@0.2.0", "", {}, "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng=="], "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], - "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], "@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], @@ -350,6 +359,8 @@ "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.9", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YSjEfBXnhUELsO2VzjdtYYD4CfQjvao+lhhrX5XsHD7/cyUNzljF1FHEbgTPN7LH2MClfwRMIsYlqTYpKTTe2A=="], + "@radix-ui/react-select": ["@radix-ui/react-select@2.2.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ=="], + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA=="], "@radix-ui/react-slider": ["@radix-ui/react-slider@1.3.5", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw=="], @@ -384,16 +395,20 @@ "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], - "@react-router/dev": ["@react-router/dev@7.8.0", "", { "dependencies": { "@babel/core": "^7.27.7", "@babel/generator": "^7.27.5", "@babel/parser": "^7.27.7", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/preset-typescript": "^7.27.1", "@babel/traverse": "^7.27.7", "@babel/types": "^7.27.7", "@npmcli/package-json": "^4.0.1", "@react-router/node": "7.8.0", "@vitejs/plugin-react": "^4.5.2", "@vitejs/plugin-rsc": "0.4.11", "arg": "^5.0.1", "babel-dead-code-elimination": "^1.0.6", "chokidar": "^4.0.0", "dedent": "^1.5.3", "es-module-lexer": "^1.3.1", "exit-hook": "2.2.1", "isbot": "^5.1.11", "jsesc": "3.0.2", "lodash": "^4.17.21", "pathe": "^1.1.2", "picocolors": "^1.1.1", "prettier": "^3.6.2", "react-refresh": "^0.14.0", "semver": "^7.3.7", "set-cookie-parser": "^2.6.0", "tinyglobby": "^0.2.14", "valibot": "^0.41.0", "vite-node": "^3.2.2" }, "peerDependencies": { "@react-router/serve": "^7.8.0", "react-router": "^7.8.0", "typescript": "^5.1.0", "vite": "^5.1.0 || ^6.0.0 || ^7.0.0", "wrangler": "^3.28.2 || ^4.0.0" }, "optionalPeers": ["@react-router/serve", "typescript", "wrangler"], "bin": { "react-router": "bin.js" } }, "sha512-5NA9yLZComM+kCD3zNPL3rjrAFjzzODY8hjAJlpz/6jpyXoF28W8QTSo8rxc56XVNLONM75Y5nq1wzeEcWFFKA=="], + "@react-router/dev": ["@react-router/dev@7.13.0", "", { "dependencies": { "@babel/core": "^7.27.7", "@babel/generator": "^7.27.5", "@babel/parser": "^7.27.7", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/preset-typescript": "^7.27.1", "@babel/traverse": "^7.27.7", "@babel/types": "^7.27.7", "@react-router/node": "7.13.0", "@remix-run/node-fetch-server": "^0.13.0", "arg": "^5.0.1", "babel-dead-code-elimination": "^1.0.6", "chokidar": "^4.0.0", "dedent": "^1.5.3", "es-module-lexer": "^1.3.1", "exit-hook": "2.2.1", "isbot": "^5.1.11", "jsesc": "3.0.2", "lodash": "^4.17.21", "p-map": "^7.0.3", "pathe": "^1.1.2", "picocolors": "^1.1.1", "pkg-types": "^2.3.0", "prettier": "^3.6.2", "react-refresh": "^0.14.0", "semver": "^7.3.7", "tinyglobby": "^0.2.14", "valibot": "^1.2.0", "vite-node": "^3.2.2" }, "peerDependencies": { "@react-router/serve": "^7.13.0", "@vitejs/plugin-rsc": "~0.5.7", "react-router": "^7.13.0", "react-server-dom-webpack": "^19.2.3", "typescript": "^5.1.0", "vite": "^5.1.0 || ^6.0.0 || ^7.0.0", "wrangler": "^3.28.2 || ^4.0.0" }, "optionalPeers": ["@react-router/serve", "@vitejs/plugin-rsc", "react-server-dom-webpack", "typescript", "wrangler"], "bin": { "react-router": "bin.js" } }, "sha512-0vRfTrS6wIXr9j0STu614Cv2ytMr21evnv1r+DXPv5cJ4q0V2x2kBAXC8TAqEXkpN5vdhbXBlbGQ821zwOfhvg=="], - "@react-router/express": ["@react-router/express@7.8.0", "", { "dependencies": { "@react-router/node": "7.8.0" }, "peerDependencies": { "express": "^4.17.1 || ^5", "react-router": "7.8.0", "typescript": "^5.1.0" }, "optionalPeers": ["typescript"] }, "sha512-lNUwux5IfMqczIL3gXZ/mauPUoVz65fSLPnUTkP7hkh/P7fcsPtYkmcixuaWb+882lY+Glf157OdoIMbcSMBaA=="], + "@react-router/express": ["@react-router/express@7.13.0", "", { "dependencies": { "@react-router/node": "7.13.0" }, "peerDependencies": { "express": "^4.17.1 || ^5", "react-router": "7.13.0", "typescript": "^5.1.0" }, "optionalPeers": ["typescript"] }, "sha512-9az5P7sjbfxb0l4TtS5tlyV2tI8ZY4dWeuddxK2JLtgWwe+MGGSEO62fY87PidmgTqpQXguT6iyR5RXP9gJucA=="], - "@react-router/node": ["@react-router/node@7.8.0", "", { "dependencies": { "@mjackson/node-fetch-server": "^0.2.0" }, "peerDependencies": { "react-router": "7.8.0", "typescript": "^5.1.0" }, "optionalPeers": ["typescript"] }, "sha512-/FFN9vqI2EHPwDCHTvsMInhrYvwJ5SlCeyUr1oWUxH47JyYkooVFks5++M4VkrTgj2ZBsMjPPKy0xRNTQdtBDA=="], + "@react-router/node": ["@react-router/node@7.13.0", "", { "dependencies": { "@mjackson/node-fetch-server": "^0.2.0" }, "peerDependencies": { "react-router": "7.13.0", "typescript": "^5.1.0" }, "optionalPeers": ["typescript"] }, "sha512-Mhr3fAou19oc/S93tKMIBHwCPfqLpWyWM/m0NWd3pJh/wZin8/9KhAdjwxhYbXw1TrTBZBLDENa35uZ+Y7oh3A=="], - "@react-router/serve": ["@react-router/serve@7.8.0", "", { "dependencies": { "@react-router/express": "7.8.0", "@react-router/node": "7.8.0", "compression": "^1.7.4", "express": "^4.19.2", "get-port": "5.1.1", "morgan": "^1.10.0", "source-map-support": "^0.5.21" }, "peerDependencies": { "react-router": "7.8.0" }, "bin": { "react-router-serve": "bin.js" } }, "sha512-DokCv1GfOMt9KHu+k3WYY9sP5nOEzq7za+Vi3dWPHoY5oP0wgv8S4DnTPU08ASY8iFaF38NAzapbSFfu6Xfr0Q=="], + "@react-router/serve": ["@react-router/serve@7.13.0", "", { "dependencies": { "@mjackson/node-fetch-server": "^0.2.0", "@react-router/express": "7.13.0", "@react-router/node": "7.13.0", "compression": "^1.8.1", "express": "^4.19.2", "get-port": "5.1.1", "morgan": "^1.10.1", "source-map-support": "^0.5.21" }, "peerDependencies": { "react-router": "7.13.0" }, "bin": { "react-router-serve": "bin.js" } }, "sha512-bgpA3YdUvuSAQa0vRM9xeZaBsglgUvxsVCUqdJpxF87ZF9pT5uoAITrWYd1soDB8jSksnH3btJEXHasvG7cikA=="], + + "@remix-run/node-fetch-server": ["@remix-run/node-fetch-server@0.13.0", "", {}, "sha512-1EsNo0ZpgXu/90AWoRZf/oE3RVTUS80tiTUpt+hv5pjtAkw7icN4WskDwz/KdAw5ARbJLMhZBrO1NqThmy/McA=="], "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], + "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.46.2", "", { "os": "android", "cpu": "arm" }, "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA=="], "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.46.2", "", { "os": "android", "cpu": "arm64" }, "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ=="], @@ -434,6 +449,58 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.46.2", "", { "os": "win32", "cpu": "x64" }, "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg=="], + "@storybook/addon-actions": ["@storybook/addon-actions@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "@types/uuid": "^9.0.1", "dequal": "^2.0.2", "polished": "^4.2.2", "uuid": "^9.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-mDQxylxGGCQSK7tJPkD144J8jWh9IU9ziJMHfB84PKpI/V5ZgqMDnpr2bssTrUaGDqU5e1/z8KcRF+Melhs9pQ=="], + + "@storybook/addon-backgrounds": ["@storybook/addon-backgrounds@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-l9xS8qWe5n4tvMwth09QxH2PmJbCctEvBAc1tjjRasAfrd69f7/uFK4WhwJAstzBTNgTc8VXI4w8ZR97i1sFbg=="], + + "@storybook/addon-controls": ["@storybook/addon-controls@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "dequal": "^2.0.2", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-IiQpkNJdiRyA4Mq9mzjZlvQugL/aE7hNgVxBBGPiIZG6wb6Ht9hNnBYpap5ZXXFKV9p2qVI0FZK445ONmAa+Cw=="], + + "@storybook/addon-docs": ["@storybook/addon-docs@8.6.14", "", { "dependencies": { "@mdx-js/react": "^3.0.0", "@storybook/blocks": "8.6.14", "@storybook/csf-plugin": "8.6.14", "@storybook/react-dom-shim": "8.6.14", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-Obpd0OhAF99JyU5pp5ci17YmpcQtMNgqW2pTXV8jAiiipWpwO++hNDeQmLmlSXB399XjtRDOcDVkoc7rc6JzdQ=="], + + "@storybook/addon-essentials": ["@storybook/addon-essentials@8.6.14", "", { "dependencies": { "@storybook/addon-actions": "8.6.14", "@storybook/addon-backgrounds": "8.6.14", "@storybook/addon-controls": "8.6.14", "@storybook/addon-docs": "8.6.14", "@storybook/addon-highlight": "8.6.14", "@storybook/addon-measure": "8.6.14", "@storybook/addon-outline": "8.6.14", "@storybook/addon-toolbars": "8.6.14", "@storybook/addon-viewport": "8.6.14", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-5ZZSHNaW9mXMOFkoPyc3QkoNGdJHETZydI62/OASR0lmPlJ1065TNigEo5dJddmZNn0/3bkE8eKMAzLnO5eIdA=="], + + "@storybook/addon-highlight": ["@storybook/addon-highlight@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-4H19OJlapkofiE9tM6K/vsepf4ir9jMm9T+zw5L85blJZxhKZIbJ6FO0TCG9PDc4iPt3L6+aq5B0X29s9zicNQ=="], + + "@storybook/addon-links": ["@storybook/addon-links@8.6.15", "", { "dependencies": { "@storybook/global": "^5.0.0", "ts-dedent": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "storybook": "^8.6.15" }, "optionalPeers": ["react"] }, "sha512-abRWnDPBTwnj6sQYfAjUnYCNuUQbrVLLOyuormbDUqOcvZ+OqehNYo4BKXx0/lz61h0A2dOD1IuDo40uWyYVFQ=="], + + "@storybook/addon-measure": ["@storybook/addon-measure@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "tiny-invariant": "^1.3.1" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-1Tlyb72NX8aAqm6I6OICsUuGOP6hgnXcuFlXucyhKomPa6j3Eu2vKu561t/f0oGtAK2nO93Z70kVaEh5X+vaGw=="], + + "@storybook/addon-outline": ["@storybook/addon-outline@8.6.14", "", { "dependencies": { "@storybook/global": "^5.0.0", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-CW857JvN6OxGWElqjlzJO2S69DHf+xO3WsEfT5mT3ZtIjmsvRDukdWfDU9bIYUFyA2lFvYjncBGjbK+I91XR7w=="], + + "@storybook/addon-toolbars": ["@storybook/addon-toolbars@8.6.14", "", { "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-W/wEXT8h3VyZTVfWK/84BAcjAxTdtRiAkT2KAN0nbSHxxB5KEM1MjKpKu2upyzzMa3EywITqbfy4dP6lpkVTwQ=="], + + "@storybook/addon-viewport": ["@storybook/addon-viewport@8.6.14", "", { "dependencies": { "memoizerific": "^1.11.3" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-gNzVQbMqRC+/4uQTPI2ZrWuRHGquTMZpdgB9DrD88VTEjNudP+J6r8myLfr2VvGksBbUMHkGHMXHuIhrBEnXYA=="], + + "@storybook/blocks": ["@storybook/blocks@8.6.14", "", { "dependencies": { "@storybook/icons": "^1.2.12", "ts-dedent": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^8.6.14" }, "optionalPeers": ["react", "react-dom"] }, "sha512-rBMHAfA39AGHgkrDze4RmsnQTMw1ND5fGWobr9pDcJdnDKWQWNRD7Nrlxj0gFlN3n4D9lEZhWGdFrCbku7FVAQ=="], + + "@storybook/builder-vite": ["@storybook/builder-vite@8.6.15", "", { "dependencies": { "@storybook/csf-plugin": "8.6.15", "browser-assert": "^1.2.1", "ts-dedent": "^2.0.0" }, "peerDependencies": { "storybook": "^8.6.15", "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" } }, "sha512-9Y05/ndZE6/eI7ZIUCD/QtH2htRIUs9j1gxE6oW0zRo9TJO1iqxfLNwgzd59KEkId7gdZxPei0l+LGTUGXYKRg=="], + + "@storybook/components": ["@storybook/components@8.6.15", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-+9GVKXPEW8Kl9zvNSTm9+VrJtx/puMZiO7gxCML63nK4aTWJXHQr4t9YUoGammSBM3AV1JglsKm6dBgJEeCoiA=="], + + "@storybook/core": ["@storybook/core@8.6.15", "", { "dependencies": { "@storybook/theming": "8.6.15", "better-opn": "^3.0.2", "browser-assert": "^1.2.1", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", "esbuild-register": "^3.5.0", "jsdoc-type-pratt-parser": "^4.0.0", "process": "^0.11.10", "recast": "^0.23.5", "semver": "^7.6.2", "util": "^0.12.5", "ws": "^8.2.3" }, "peerDependencies": { "prettier": "^2 || ^3" }, "optionalPeers": ["prettier"] }, "sha512-VFpKcphNurJpSC4fpUfKL3GTXVoL53oytghGR30QIw5jKWwaT50HVbTyb41BLOUuZjmMhUQA8weiQEew6RX0gw=="], + + "@storybook/csf-plugin": ["@storybook/csf-plugin@8.6.14", "", { "dependencies": { "unplugin": "^1.3.1" }, "peerDependencies": { "storybook": "^8.6.14" } }, "sha512-dErtc9teAuN+eelN8FojzFE635xlq9cNGGGEu0WEmMUQ4iJ8pingvBO1N8X3scz4Ry7KnxX++NNf3J3gpxS8qQ=="], + + "@storybook/global": ["@storybook/global@5.0.0", "", {}, "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ=="], + + "@storybook/icons": ["@storybook/icons@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" } }, "sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw=="], + + "@storybook/instrumenter": ["@storybook/instrumenter@8.6.15", "", { "dependencies": { "@storybook/global": "^5.0.0", "@vitest/utils": "^2.1.1" }, "peerDependencies": { "storybook": "^8.6.15" } }, "sha512-TvHR/+yyIAOp/1bLulFai2kkhIBtAlBw7J6Jd9DKyInoGhTWNE1G1Y61jD5GWXX29AlwaHfzGUaX5NL1K+FJpg=="], + + "@storybook/manager-api": ["@storybook/manager-api@8.6.15", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-ZOFtH821vFcwzECbFYFTKtSVO96Cvwwg45dMh3M/9bZIdN7klsloX7YNKw8OKvwE6XLFLsi2OvsNNcmTW6g88w=="], + + "@storybook/preview-api": ["@storybook/preview-api@8.6.15", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-oqsp8f7QekB9RzpDqOXZQcPPRXXd/mTsnZSdAAQB/pBVqUpC9h/y5hgovbYnJ6DWXcpODbMwH+wbJHZu5lvm+w=="], + + "@storybook/react": ["@storybook/react@8.6.15", "", { "dependencies": { "@storybook/components": "8.6.15", "@storybook/global": "^5.0.0", "@storybook/manager-api": "8.6.15", "@storybook/preview-api": "8.6.15", "@storybook/react-dom-shim": "8.6.15", "@storybook/theming": "8.6.15" }, "peerDependencies": { "@storybook/test": "8.6.15", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "storybook": "^8.6.15", "typescript": ">= 4.2.x" }, "optionalPeers": ["@storybook/test", "typescript"] }, "sha512-hdnhlJg+YkpPMOw2hvK7+mhdxAbguA+TFTIAzVV9CeUYoHDIZAsgeKVhRmgZGN20NGjRN5ZcwkplAMJnF9v+6w=="], + + "@storybook/react-dom-shim": ["@storybook/react-dom-shim@8.6.15", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "storybook": "^8.6.15" } }, "sha512-m2trBmmd4iom1qwrp1F109zjRDc0cPaHYhDQxZR4Qqdz8pYevYJTlipDbH/K4NVB6Rn687RT29OoOPfJh6vkFA=="], + + "@storybook/react-vite": ["@storybook/react-vite@8.6.15", "", { "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "0.5.0", "@rollup/pluginutils": "^5.0.2", "@storybook/builder-vite": "8.6.15", "@storybook/react": "8.6.15", "find-up": "^5.0.0", "magic-string": "^0.30.0", "react-docgen": "^7.0.0", "resolve": "^1.22.8", "tsconfig-paths": "^4.2.0" }, "peerDependencies": { "@storybook/test": "8.6.15", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "storybook": "^8.6.15", "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" }, "optionalPeers": ["@storybook/test"] }, "sha512-9st+2NCemzzBwmindpDrRLEqYJmwwd2RnXMoj+Wt4Y1r4MGoRe1l837ciT2tmstaqekY2mVUSYd6879NzeeMYw=="], + + "@storybook/test": ["@storybook/test@8.6.15", "", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/instrumenter": "8.6.15", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "6.5.0", "@testing-library/user-event": "14.5.2", "@vitest/expect": "2.0.5", "@vitest/spy": "2.0.5" }, "peerDependencies": { "storybook": "^8.6.15" } }, "sha512-EwquDRUDVvWcZds3T2abmB5wSN/Vattal4YtZ6fpBlIUqONV4o/cOBX39cFfQSUCBrIXIjQ6RmapQCHK/PvBYw=="], + + "@storybook/theming": ["@storybook/theming@8.6.15", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-dAbL0XOekyT6XsF49R6Etj3WxQ/LpdJDIswUUeHgVJ6/yd2opZOGbPxnwA3zlmAh1c0tvpPyhSDXxSG79u8e4Q=="], + "@tailwindcss/node": ["@tailwindcss/node@4.1.11", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.11" } }, "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q=="], "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.11", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.11", "@tailwindcss/oxide-darwin-arm64": "4.1.11", "@tailwindcss/oxide-darwin-x64": "4.1.11", "@tailwindcss/oxide-freebsd-x64": "4.1.11", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", "@tailwindcss/oxide-linux-x64-musl": "4.1.11", "@tailwindcss/oxide-wasm32-wasi": "4.1.11", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg=="], @@ -474,6 +541,8 @@ "@testing-library/react": ["@testing-library/react@16.3.0", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "@testing-library/dom": "^10.0.0", "@types/react": "^18.0.0 || ^19.0.0", "@types/react-dom": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw=="], + "@testing-library/user-event": ["@testing-library/user-event@14.6.1", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw=="], + "@todo-starter/ui": ["@todo-starter/ui@workspace:packages/ui"], "@todo-starter/utils": ["@todo-starter/utils@workspace:packages/utils"], @@ -488,40 +557,40 @@ "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], - "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], - - "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], + "@types/doctrine": ["@types/doctrine@0.0.9", "", {}, "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA=="], "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - "@types/node": ["@types/node@20.19.10", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-iAFpG6DokED3roLSP0K+ybeDdIX6Bc0Vd3mLW5uDqThPWtNos3E+EqOM11mPQHKzfWHqEBuLjIlsBQQ8CsISmQ=="], + "@types/jsdom": ["@types/jsdom@21.1.7", "", { "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", "parse5": "^7.0.0" } }, "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA=="], - "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="], + "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], - "@types/react-dom": ["@types/react-dom@19.1.5", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg=="], + "@types/node": ["@types/node@20.19.30", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g=="], - "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "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" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], + "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="], - "@vitejs/plugin-rsc": ["@vitejs/plugin-rsc@0.4.11", "", { "dependencies": { "@mjackson/node-fetch-server": "^0.7.0", "es-module-lexer": "^1.7.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.17", "periscopic": "^4.0.2", "turbo-stream": "^3.1.0", "vitefu": "^1.1.1" }, "peerDependencies": { "react": "*", "react-dom": "*", "vite": "*" } }, "sha512-+4H4wLi+Y9yF58znBfKgGfX8zcqUGt8ngnmNgzrdGdF1SVz7EO0sg7WnhK5fFVHt6fUxsVEjmEabsCWHKPL1Tw=="], + "@types/react-dom": ["@types/react-dom@19.1.5", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg=="], - "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + "@types/resolve": ["@types/resolve@1.20.6", "", {}, "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ=="], - "@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="], - "@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + "@types/uuid": ["@types/uuid@9.0.8", "", {}, "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA=="], - "@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "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" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], - "@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + "@vitest/expect": ["@vitest/expect@2.0.5", "", { "dependencies": { "@vitest/spy": "2.0.5", "@vitest/utils": "2.0.5", "chai": "^5.1.1", "tinyrainbow": "^1.2.0" } }, "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA=="], - "@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + "@vitest/pretty-format": ["@vitest/pretty-format@2.1.9", "", { "dependencies": { "tinyrainbow": "^1.2.0" } }, "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ=="], - "@vitest/ui": ["@vitest/ui@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "fflate": "^0.8.2", "flatted": "^3.3.3", "pathe": "^2.0.3", "sirv": "^3.0.1", "tinyglobby": "^0.2.14", "tinyrainbow": "^2.0.0" }, "peerDependencies": { "vitest": "3.2.4" } }, "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA=="], + "@vitest/spy": ["@vitest/spy@2.0.5", "", { "dependencies": { "tinyspy": "^3.0.0" } }, "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA=="], - "@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + "@vitest/utils": ["@vitest/utils@2.1.9", "", { "dependencies": { "@vitest/pretty-format": "2.1.9", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" } }, "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ=="], "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], @@ -532,30 +601,42 @@ "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], - "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + "aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.10", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "basic-auth": ["basic-auth@2.0.1", "", { "dependencies": { "safe-buffer": "5.1.2" } }, "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg=="], + "better-opn": ["better-opn@3.0.2", "", { "dependencies": { "open": "^8.0.4" } }, "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ=="], + "body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "browser-assert": ["browser-assert@1.2.1", "", {}, "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ=="], + "browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="], "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + "bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="], + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], @@ -564,6 +645,8 @@ "chai": ["chai@5.2.1", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A=="], + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], @@ -584,6 +667,8 @@ "compression": ["compression@1.8.1", "", { "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" } }, "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="], + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], @@ -616,6 +701,10 @@ "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], @@ -626,7 +715,9 @@ "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], - "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], + "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], + + "dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], @@ -644,8 +735,6 @@ "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], - "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], @@ -656,27 +745,33 @@ "esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], + "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="], + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], - "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], "exit-hook": ["exit-hook@2.2.1", "", {}, "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="], - "expect-type": ["expect-type@1.2.2", "", {}, "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA=="], - "express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], - "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], + "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], - "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], "finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], - "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], @@ -684,12 +779,14 @@ "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], - "fs-extra": ["fs-extra@11.3.1", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g=="], + "fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], "get-intrinsic": ["get-intrinsic@1.3.0", "", { "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" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], @@ -700,7 +797,7 @@ "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], "globrex": ["globrex@0.1.2", "", {}, "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="], @@ -708,11 +805,15 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], - "hosted-git-info": ["hosted-git-info@6.1.3", "", { "dependencies": { "lru-cache": "^7.5.1" } }, "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw=="], + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], "html-encoding-sniffer": ["html-encoding-sniffer@4.0.0", "", { "dependencies": { "whatwg-encoding": "^3.1.1" } }, "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="], @@ -732,15 +833,27 @@ "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "is-generator-function": ["is-generator-function@1.1.2", "", { "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" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], + "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], - "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - "isbot": ["isbot@5.1.29", "", {}, "sha512-DelDWWoa3mBoyWTq3wjp+GIWx/yZdN7zLUE7NFhKjAiJ+uJVRkbLlwykdduCE4sPUUy8mlTYTmdhBUYu91F+sw=="], + "isbot": ["isbot@5.1.34", "", {}, "sha512-aCMIBSKd/XPRYdiCQTLC8QHH4YT8B3JUADu+7COgYIZPvkeoMcUHMRjZLM9/7V8fCj+l7FSREc1lOPNjzogo/A=="], "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], @@ -750,12 +863,12 @@ "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@4.8.0", "", {}, "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw=="], + "jsdom": ["jsdom@26.1.0", "", { "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", "decimal.js": "^10.5.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.16", "parse5": "^7.2.1", "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^5.1.1", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.1.1", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg=="], "jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], - "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], @@ -782,6 +895,8 @@ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], "loupe": ["loupe@3.2.0", "", {}, "sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw=="], @@ -794,10 +909,14 @@ "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + "map-or-similar": ["map-or-similar@1.5.0", "", {}, "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + "memoizerific": ["memoizerific@1.11.3", "", { "dependencies": { "map-or-similar": "^1.5.0" } }, "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog=="], + "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], @@ -812,6 +931,8 @@ "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], @@ -820,8 +941,6 @@ "morgan": ["morgan@1.10.1", "", { "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", "depd": "~2.0.0", "on-finished": "~2.3.0", "on-headers": "~1.1.0" } }, "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A=="], - "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], @@ -832,16 +951,6 @@ "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], - "normalize-package-data": ["normalize-package-data@5.0.0", "", { "dependencies": { "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q=="], - - "npm-install-checks": ["npm-install-checks@6.3.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw=="], - - "npm-normalize-package-bin": ["npm-normalize-package-bin@3.0.1", "", {}, "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ=="], - - "npm-package-arg": ["npm-package-arg@10.1.0", "", { "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA=="], - - "npm-pick-manifest": ["npm-pick-manifest@8.0.2", "", { "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "npm-package-arg": "^10.0.0", "semver": "^7.3.5" } }, "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg=="], - "nwsapi": ["nwsapi@2.2.21", "", {}, "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA=="], "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], @@ -850,14 +959,26 @@ "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], + "open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "p-map": ["p-map@7.0.4", "", {}, "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="], + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], @@ -866,23 +987,23 @@ "pathval": ["pathval@2.0.1", "", {}, "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ=="], - "periscopic": ["periscopic@4.0.2", "", { "dependencies": { "@types/estree": "*", "is-reference": "^3.0.2", "zimmerframe": "^1.0.0" } }, "sha512-sqpQDUy8vgB7ycLkendSKS6HnVz1Rneoc3Rc+ZBUCe2pbqlVuCC5vF52l0NJ1aiMg/r1qfYF9/myz8CZeI2rjA=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], + + "polished": ["polished@4.3.1", "", { "dependencies": { "@babel/runtime": "^7.17.8" } }, "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - "proc-log": ["proc-log@3.0.0", "", {}, "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A=="], - - "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="], - - "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], @@ -894,13 +1015,17 @@ "raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], - "react": ["react@19.1.1", "", {}, "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ=="], + "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], "react-day-picker": ["react-day-picker@9.8.1", "", { "dependencies": { "@date-fns/tz": "^1.2.0", "date-fns": "^4.1.0", "date-fns-jalali": "^4.1.0-0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-kMcLrp3PfN/asVJayVv82IjF3iLOOxuH5TNFWezX6lS/T8iVRFPTETpHl3TUSTH99IDMZLubdNPJr++rQctkEw=="], - "react-dom": ["react-dom@19.1.1", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.1" } }, "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw=="], + "react-docgen": ["react-docgen@7.1.1", "", { "dependencies": { "@babel/core": "^7.18.9", "@babel/traverse": "^7.18.9", "@babel/types": "^7.18.9", "@types/babel__core": "^7.18.0", "@types/babel__traverse": "^7.18.0", "@types/doctrine": "^0.0.9", "@types/resolve": "^1.20.2", "doctrine": "^3.0.0", "resolve": "^1.22.1", "strip-indent": "^4.0.0" } }, "sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg=="], + + "react-docgen-typescript": ["react-docgen-typescript@2.4.0", "", { "peerDependencies": { "typescript": ">= 4.3.x" } }, "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg=="], - "react-hook-form": ["react-hook-form@7.62.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA=="], + "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], + + "react-hook-form": ["react-hook-form@7.71.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w=="], "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], @@ -910,19 +1035,21 @@ "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], - "react-router": ["react-router@7.8.0", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-r15M3+LHKgM4SOapNmsH3smAizWds1vJ0Z9C4mWaKnT9/wD7+d/0jYcj6LmOvonkrO4Rgdyp4KQ/29gWN2i1eg=="], + "react-router": ["react-router@7.13.0", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw=="], - "react-router-dom": ["react-router-dom@7.8.0", "", { "dependencies": { "react-router": "7.8.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-ntInsnDVnVRdtSu6ODmTQ41cbluak/ENeTif7GBce0L6eztFg6/e1hXAysFQI8X25C8ipKmT9cClbJwxx3Kaqw=="], + "react-router-dom": ["react-router-dom@7.13.0", "", { "dependencies": { "react-router": "7.13.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g=="], "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], + "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], "remix-hook-form": ["remix-hook-form@7.1.0", "", { "peerDependencies": { "react": "^18.2.0 || ^19.0.0", "react-dom": "^18.2.0 || ^19.0.0", "react-hook-form": "^7.55.0", "react-router": ">=7.5.0" } }, "sha512-RyuYq4tKHw/GH8FdKDEGRul8qFJLspZwbDRGehj9hKbVvhREaxROu2zpv0Yqt6drUaYCW1jH2vltL+n5vGmIag=="], - "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], "rollup": ["rollup@4.46.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.46.2", "@rollup/rollup-android-arm64": "4.46.2", "@rollup/rollup-darwin-arm64": "4.46.2", "@rollup/rollup-darwin-x64": "4.46.2", "@rollup/rollup-freebsd-arm64": "4.46.2", "@rollup/rollup-freebsd-x64": "4.46.2", "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", "@rollup/rollup-linux-arm-musleabihf": "4.46.2", "@rollup/rollup-linux-arm64-gnu": "4.46.2", "@rollup/rollup-linux-arm64-musl": "4.46.2", "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", "@rollup/rollup-linux-ppc64-gnu": "4.46.2", "@rollup/rollup-linux-riscv64-gnu": "4.46.2", "@rollup/rollup-linux-riscv64-musl": "4.46.2", "@rollup/rollup-linux-s390x-gnu": "4.46.2", "@rollup/rollup-linux-x64-gnu": "4.46.2", "@rollup/rollup-linux-x64-musl": "4.46.2", "@rollup/rollup-win32-arm64-msvc": "4.46.2", "@rollup/rollup-win32-ia32-msvc": "4.46.2", "@rollup/rollup-win32-x64-msvc": "4.46.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg=="], @@ -930,11 +1057,13 @@ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="], - "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], @@ -944,6 +1073,8 @@ "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], + "set-function-length": ["set-function-length@1.2.2", "", { "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" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], @@ -958,12 +1089,8 @@ "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "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" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - "sirv": ["sirv@3.0.1", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A=="], - "sonner": ["sonner@1.7.4", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw=="], "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -972,31 +1099,25 @@ "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], - "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], - - "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], - - "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], - - "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="], - - "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], - "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], - "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], + "storybook": ["storybook@8.6.15", "", { "dependencies": { "@storybook/core": "8.6.15" }, "peerDependencies": { "prettier": "^2 || ^3" }, "optionalPeers": ["prettier"], "bin": { "sb": "./bin/index.cjs", "storybook": "./bin/index.cjs", "getstorybook": "./bin/index.cjs" } }, "sha512-Ob7DMlwWx8s7dMvcQ3xPc02TvUeralb+xX3oaPRk9wY9Hc6M1IBC/7cEoITkSmRS2v38DHubC+mtEKNc1u2gQg=="], "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], - "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], @@ -1010,17 +1131,13 @@ "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], - "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], - - "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], - "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], - - "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + "tinyrainbow": ["tinyrainbow@1.2.0", "", {}, "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ=="], - "tinyspy": ["tinyspy@4.0.3", "", {}, "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A=="], + "tinyspy": ["tinyspy@3.0.2", "", {}, "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q=="], "tldts": ["tldts@6.1.86", "", { "dependencies": { "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ=="], @@ -1030,35 +1147,35 @@ "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], - "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], - "tough-cookie": ["tough-cookie@5.1.2", "", { "dependencies": { "tldts": "^6.1.32" } }, "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A=="], "tr46": ["tr46@5.1.1", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="], + "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], + "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="], - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], - "turbo": ["turbo@2.5.5", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.5", "turbo-darwin-arm64": "2.5.5", "turbo-linux-64": "2.5.5", "turbo-linux-arm64": "2.5.5", "turbo-windows-64": "2.5.5", "turbo-windows-arm64": "2.5.5" }, "bin": { "turbo": "bin/turbo" } }, "sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "turbo-darwin-64": ["turbo-darwin-64@2.5.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-RYnTz49u4F5tDD2SUwwtlynABNBAfbyT2uU/brJcyh5k6lDLyNfYKdKmqd3K2ls4AaiALWrFKVSBsiVwhdFNzQ=="], + "turbo": ["turbo@2.8.1", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.1", "turbo-darwin-arm64": "2.8.1", "turbo-linux-64": "2.8.1", "turbo-linux-arm64": "2.8.1", "turbo-windows-64": "2.8.1", "turbo-windows-arm64": "2.8.1" }, "bin": { "turbo": "bin/turbo" } }, "sha512-pbSMlRflA0RAuk/0jnAt8pzOYh1+sKaT8nVtcs75OFGVWD0evleQRmKtHJJV42QOhaC3Hx9mUUSOom/irasbjA=="], - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Tk+ZeSNdBobZiMw9aFypQt0DlLsWSFWu1ymqsAdJLuPoAH05qCfYtRxE1pJuYHcJB5pqI+/HOxtJoQ40726Btw=="], + "turbo-darwin-64": ["turbo-darwin-64@2.8.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-FQ6Uqxty/H1Nvn1dpBe8KUlMRclTuiyNSc1PCeDL/ad7M9ykpWutB51YpMpf9ibTA32M6wLdIRf+D96W6hDAtQ=="], - "turbo-linux-64": ["turbo-linux-64@2.5.5", "", { "os": "linux", "cpu": "x64" }, "sha512-2/XvMGykD7VgsvWesZZYIIVXMlgBcQy+ZAryjugoTcvJv8TZzSU/B1nShcA7IAjZ0q7OsZ45uP2cOb8EgKT30w=="], + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4bCcEpGP2/aSXmeN2gl5SuAmS1q5ykjubnFvSoXjQoCKtDOV+vc4CTl/DduZzUUutCVUWXjl8OyfIQ+DGCaV4A=="], - "turbo-linux-arm64": ["turbo-linux-arm64@2.5.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-DW+8CjCjybu0d7TFm9dovTTVg1VRnlkZ1rceO4zqsaLrit3DgHnN4to4uwyuf9s2V/BwS3IYcRy+HG9BL596Iw=="], + "turbo-linux-64": ["turbo-linux-64@2.8.1", "", { "os": "linux", "cpu": "x64" }, "sha512-m99JRlWlEgXPR7mkThAbKh6jbTmWSOXM/c6rt8yd4Uxh0+wjq7+DYcQbead6aoOqmCP9akswZ8EXIv1ogKBblg=="], - "turbo-stream": ["turbo-stream@3.1.0", "", {}, "sha512-tVI25WEXl4fckNEmrq70xU1XumxUwEx/FZD5AgEcV8ri7Wvrg2o7GEq8U7htrNx3CajciGm+kDyhRf5JB6t7/A=="], + "turbo-linux-arm64": ["turbo-linux-arm64@2.8.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-AsPlza3AsavJdl2o7FE67qyv0aLfmT1XwFQGzvwpoAO6Bj7S4a03tpUchZKNuGjNAkKVProQRFnB7PgUAScFXA=="], - "turbo-windows-64": ["turbo-windows-64@2.5.5", "", { "os": "win32", "cpu": "x64" }, "sha512-q5p1BOy8ChtSZfULuF1BhFMYIx6bevXu4fJ+TE/hyNfyHJIfjl90Z6jWdqAlyaFLmn99X/uw+7d6T/Y/dr5JwQ=="], + "turbo-windows-64": ["turbo-windows-64@2.8.1", "", { "os": "win32", "cpu": "x64" }, "sha512-GdqNO6bYShRsr79B+2G/2ssjLEp9uBTvLBJSWRtRCiac/SEmv8T6RYv9hu+h5oGbFALtnKNp6BQBw78RJURsPw=="], - "turbo-windows-arm64": ["turbo-windows-arm64@2.5.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q=="], + "turbo-windows-arm64": ["turbo-windows-arm64@2.8.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-n40E6IpkzrShRo3yMdRpgnn1/sAbGC6tZXwyNu8fe9RsufeD7KBiaoRSvw8xLyqV3pd2yoTL2rdCXq24MnTCWA=="], "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], - "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], @@ -1066,6 +1183,8 @@ "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + "unplugin": ["unplugin@1.16.1", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w=="], + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], @@ -1074,39 +1193,37 @@ "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], - "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], - "valibot": ["valibot@0.41.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng=="], + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], - "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], + "uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], + "valibot": ["valibot@1.2.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg=="], "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], - "vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="], + "vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], "vite-tsconfig-paths": ["vite-tsconfig-paths@5.1.4", "", { "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^3.0.3" }, "peerDependencies": { "vite": "*" }, "optionalPeers": ["vite"] }, "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w=="], - "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="], - - "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], - "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="], "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="], "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], "whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="], - "which": ["which@3.0.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], @@ -1120,7 +1237,7 @@ "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], - "zimmerframe": ["zimmerframe@1.1.2", "", {}, "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="], + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -1132,9 +1249,29 @@ "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@joshwooding/vite-plugin-react-docgen-typescript/magic-string": ["magic-string@0.27.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" } }, "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA=="], + "@lambdacurry/forms/lucide-react": ["lucide-react@0.468.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, "sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA=="], - "@npmcli/git/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + "@lambdacurry/forms/react-router-dom": ["react-router-dom@7.8.0", "", { "dependencies": { "react-router": "7.8.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-ntInsnDVnVRdtSu6ODmTQ41cbluak/ENeTif7GBce0L6eztFg6/e1hXAysFQI8X25C8ipKmT9cClbJwxx3Kaqw=="], + + "@radix-ui/react-select/@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], + + "@radix-ui/react-select/@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="], + + "@radix-ui/react-select/@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="], + + "@radix-ui/react-select/@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="], + + "@storybook/addon-docs/@storybook/react-dom-shim": ["@storybook/react-dom-shim@8.6.14", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "storybook": "^8.6.14" } }, "sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw=="], + + "@storybook/builder-vite/@storybook/csf-plugin": ["@storybook/csf-plugin@8.6.15", "", { "dependencies": { "unplugin": "^1.3.1" }, "peerDependencies": { "storybook": "^8.6.15" } }, "sha512-ZLz/mtOoE1Jj2lE4pK3U7MmYrv5+lot3mGtwxGb832tcABMc97j9O+reCVxZYc7DeFbBuuEdMT9rBL/O3kXYmw=="], + + "@storybook/test/@testing-library/dom": ["@testing-library/dom@10.4.0", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" } }, "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ=="], + + "@storybook/test/@testing-library/jest-dom": ["@testing-library/jest-dom@6.5.0", "", { "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", "lodash": "^4.17.21", "redent": "^3.0.0" } }, "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA=="], + + "@storybook/test/@testing-library/user-event": ["@testing-library/user-event@14.5.2", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.5", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.4", "tslib": "^2.4.0" }, "bundled": true }, "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q=="], @@ -1148,19 +1285,13 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], + "@testing-library/jest-dom/aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], + "@testing-library/jest-dom/dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], "@vitejs/plugin-react/react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], - "@vitejs/plugin-rsc/@mjackson/node-fetch-server": ["@mjackson/node-fetch-server@0.7.0", "", {}, "sha512-un8diyEBKU3BTVj3GzlTPA1kIjCkGdD+AMYQy31Gf9JCkfoZzwgJ79GUtHrF2BN3XPNMLpubbzPcxys+a3uZEw=="], - - "@vitest/runner/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - - "@vitest/snapshot/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - - "@vitest/ui/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "@vitest/expect/@vitest/utils": ["@vitest/utils@2.0.5", "", { "dependencies": { "@vitest/pretty-format": "2.0.5", "estree-walker": "^3.0.3", "loupe": "^3.1.1", "tinyrainbow": "^1.2.0" } }, "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ=="], "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], @@ -1170,9 +1301,9 @@ "body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + "chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], @@ -1180,8 +1311,6 @@ "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - "hosted-git-info/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], - "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], "mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], @@ -1192,8 +1321,12 @@ "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + "react-docgen/strip-indent": ["strip-indent@4.1.1", "", {}, "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA=="], + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], @@ -1202,15 +1335,13 @@ "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], - - "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + "strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "vite-node/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "vitest/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "vite-node/vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="], - "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -1218,8 +1349,20 @@ "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@lambdacurry/forms/react-router-dom/react-router": ["react-router@7.8.0", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-r15M3+LHKgM4SOapNmsH3smAizWds1vJ0Z9C4mWaKnT9/wD7+d/0jYcj6LmOvonkrO4Rgdyp4KQ/29gWN2i1eg=="], + + "@storybook/test/@testing-library/jest-dom/aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "@storybook/test/@testing-library/jest-dom/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], + + "@storybook/test/@testing-library/jest-dom/dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], + "@vitest/expect/@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@2.0.5", "", { "dependencies": { "tinyrainbow": "^1.2.0" } }, "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ=="], + + "@vitest/expect/@vitest/utils/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], @@ -1233,5 +1376,7 @@ "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "@storybook/test/@testing-library/jest-dom/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], } } diff --git a/package.json b/package.json index 4ba3c08..05f5526 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,10 @@ "build": "bun run turbo build", "start": "bun run turbo start", "dev": "bun run turbo dev", + "dev:all": "bun run dev & bun run storybook", "lint": "bun run turbo lint", "format": "bun run turbo run format", + "storybook": "bun run turbo run storybook", "clean": "rm -rf node_modules apps/*/node_modules packages/*/node_modules .turbo apps/*/.turbo packages/*/.turbo .vercel apps/*/.vercel packages/*/.vercel apps/*/.react-router packages/*/.react-router", "typecheck": "bun run turbo run typecheck", "biome-fix": "bun run biome check --fix", @@ -15,32 +17,33 @@ "test:ci": "bun run turbo run test:ci" }, "dependencies": { - "@hookform/resolvers": "^3.9.1", - "@lambdacurry/forms": "^0.19.1", - "@react-router/node": "^7.7.1", - "@react-router/serve": "^7.7.1", - "fs-extra": "^11.3.0", - "isbot": "^5.1.27", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-hook-form": "^7.53.1", - "react-router": "^7.7.1", + "@hookform/resolvers": "^3.10.0", + "@lambdacurry/forms": "^0.19.7", + "@react-router/node": "^7.13.0", + "@react-router/serve": "^7.13.0", + "fs-extra": "^11.3.3", + "isbot": "^5.1.34", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-hook-form": "^7.71.1", + "react-router": "^7.13.0", + "react-router-dom": "^7.13.0", "remix-hook-form": "7.1.0", - "zod": "^3.24.1" + "zod": "^3.25.76" }, "devDependencies": { - "@biomejs/biome": "2.2.0", - "@react-router/dev": "^7.7.1", - "@types/node": "^20", + "@biomejs/biome": "2.3.11", + "@react-router/dev": "^7.13.0", + "@types/jsdom": "^21.1.7", + "bun-types": "^1.3.5", + "@types/node": "^20.19.30", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.5", "@vitejs/plugin-react": "^4.7.0", - "turbo": "^2.1.2", - "typescript": "^5.8.3", - "vite": "^6.3.3", + "turbo": "^2.8.1", + "typescript": "^5.9.3", + "vite": "^6.4.1", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.2.4", - "@vitest/ui": "^3.2.4", "jsdom": "^26.1.0" }, "engines": { @@ -52,10 +55,10 @@ "@types/react-dom": "19.1.5" }, "resolutions": { - "react": "19.1.0", - "react-dom": "19.1.0", - "vite": "^6.3.3", - "vite-node": "^3.2.3", + "react": "19.2.4", + "react-dom": "19.2.4", + "vite": "6.4.1", + "react-router-dom/react-router": "7.13.0", "yallist": "^3.1.1", "esbuild": "0.24.2", "@types/react": "19.1.8", diff --git a/packages/ui/bunfig.toml b/packages/ui/bunfig.toml new file mode 100644 index 0000000..3fc87eb --- /dev/null +++ b/packages/ui/bunfig.toml @@ -0,0 +1,2 @@ +[test] +preload = ["./src/test/setup.ts"] diff --git a/packages/ui/package.json b/packages/ui/package.json index 928aebf..75bdd05 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -16,16 +16,17 @@ "lint": "biome lint .", "format": "biome format --write .", "typecheck": "tsc --noEmit", - "test": "vitest", - "test:ci": "vitest run --config ./vitest.config.ts" + "test": "bun test", + "test:ci": "bun test" }, "devDependencies": { - "@biomejs/biome": "2.2.0", + "@biomejs/biome": "2.3.11", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.5", + "bun-types": "^1.3.5", "typescript": "^5.8.3", - "vitest": "^3.2.4", "jsdom": "^26.1.0", + "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.1.0", "@testing-library/jest-dom": "^6.6.3" }, diff --git a/packages/ui/src/components/ui/button.test.tsx b/packages/ui/src/components/ui/button.test.tsx index 11c2bff..3c9eabb 100644 --- a/packages/ui/src/components/ui/button.test.tsx +++ b/packages/ui/src/components/ui/button.test.tsx @@ -1,5 +1,5 @@ import { render, screen } from '@testing-library/react'; -import { describe, expect, it } from 'vitest'; +import { describe, expect, it } from 'bun:test'; import { Button, buttonVariants } from './button'; describe('Button component', () => { diff --git a/packages/ui/src/test/bun-jest-dom.d.ts b/packages/ui/src/test/bun-jest-dom.d.ts new file mode 100644 index 0000000..9723d17 --- /dev/null +++ b/packages/ui/src/test/bun-jest-dom.d.ts @@ -0,0 +1,11 @@ +import 'bun:test'; + +declare module 'bun:test' { + interface Matchers<T = unknown> { + toBeDisabled(): T; + toBeInTheDocument(): T; + toHaveAttribute(name: string, value?: string): T; + toHaveClass(...classNames: string[]): T; + toHaveTextContent(text: string | RegExp): T; + } +} diff --git a/packages/ui/src/test/setup.ts b/packages/ui/src/test/setup.ts index b75dd8b..206a8cd 100644 --- a/packages/ui/src/test/setup.ts +++ b/packages/ui/src/test/setup.ts @@ -1,2 +1,195 @@ -// Enable @testing-library/jest-dom matchers for Vitest and provide type augmentation for TS -import '@testing-library/jest-dom/vitest'; +import { afterEach, beforeEach, jest, mock } from 'bun:test'; +import '@testing-library/jest-dom'; +import { within } from '@testing-library/dom'; +import { cleanup, configure, screen } from '@testing-library/react'; +import { JSDOM } from 'jsdom'; + +if (typeof globalThis.window === 'undefined' || typeof globalThis.document === 'undefined') { + const dom = new JSDOM('<!doctype html><html><body></body></html>', { + url: 'http://localhost' + }); + + Object.defineProperty(globalThis, 'window', { + configurable: true, + writable: true, + value: dom.window + }); + + Object.defineProperty(globalThis, 'document', { + configurable: true, + writable: true, + value: dom.window.document + }); + + Object.defineProperty(globalThis, 'navigator', { + configurable: true, + writable: true, + value: dom.window.navigator + }); + + Object.defineProperty(globalThis, 'HTMLElement', { + configurable: true, + writable: true, + value: dom.window.HTMLElement + }); + + Object.defineProperty(globalThis, 'Node', { + configurable: true, + writable: true, + value: dom.window.Node + }); + + Object.defineProperty(globalThis, 'Element', { + configurable: true, + writable: true, + value: dom.window.Element + }); + + Object.defineProperty(globalThis, 'MutationObserver', { + configurable: true, + writable: true, + value: dom.window.MutationObserver + }); + + Object.defineProperty(globalThis, 'CustomEvent', { + configurable: true, + writable: true, + value: dom.window.CustomEvent + }); + + Object.defineProperty(globalThis, 'Event', { + configurable: true, + writable: true, + value: dom.window.Event + }); + + Object.defineProperty(globalThis, 'KeyboardEvent', { + configurable: true, + writable: true, + value: dom.window.KeyboardEvent + }); + + Object.defineProperty(globalThis, 'MouseEvent', { + configurable: true, + writable: true, + value: dom.window.MouseEvent + }); + + Object.defineProperty(globalThis, 'HTMLInputElement', { + configurable: true, + writable: true, + value: dom.window.HTMLInputElement + }); + + Object.defineProperty(globalThis, 'HTMLFormElement', { + configurable: true, + writable: true, + value: dom.window.HTMLFormElement + }); + + Object.defineProperty(globalThis, 'HTMLButtonElement', { + configurable: true, + writable: true, + value: dom.window.HTMLButtonElement + }); + + Object.defineProperty(globalThis, 'HTMLTextAreaElement', { + configurable: true, + writable: true, + value: dom.window.HTMLTextAreaElement + }); + + Object.defineProperty(globalThis, 'DocumentFragment', { + configurable: true, + writable: true, + value: dom.window.DocumentFragment + }); + + Object.defineProperty(globalThis, 'getComputedStyle', { + configurable: true, + writable: true, + value: dom.window.getComputedStyle.bind(dom.window) + }); +} + +if (typeof window !== 'undefined') { + const htmlElementProto = window.HTMLElement.prototype as HTMLElement & { + attachEvent?: (event: string, handler: (...args: unknown[]) => void) => void; + detachEvent?: (event: string, handler: (...args: unknown[]) => void) => void; + }; + + if (typeof htmlElementProto.attachEvent !== 'function') { + htmlElementProto.attachEvent = () => {}; + } + + if (typeof htmlElementProto.detachEvent !== 'function') { + htmlElementProto.detachEvent = () => {}; + } + + if (typeof window.matchMedia !== 'function') { + window.matchMedia = (query: string) => ({ + matches: false, + media: query, + onchange: null, + addListener: () => {}, + removeListener: () => {}, + addEventListener: () => {}, + removeEventListener: () => {}, + dispatchEvent: () => false + }); + } + + if (typeof window.requestAnimationFrame !== 'function') { + window.requestAnimationFrame = (callback: FrameRequestCallback) => + setTimeout(() => callback(Date.now()), 16) as unknown as number; + } + + if (typeof window.cancelAnimationFrame !== 'function') { + window.cancelAnimationFrame = (id: number) => clearTimeout(id); + } + + if (typeof globalThis.requestAnimationFrame !== 'function') { + globalThis.requestAnimationFrame = window.requestAnimationFrame.bind(window); + } + + if (typeof globalThis.cancelAnimationFrame !== 'function') { + globalThis.cancelAnimationFrame = window.cancelAnimationFrame.bind(window); + } + + if (!window.HTMLElement.prototype.scrollTo) { + window.HTMLElement.prototype.scrollTo = function (options?: ScrollToOptions | number, y?: number) { + if (typeof options === 'object' && options !== null) { + this.scrollTop = options.top || 0; + this.scrollLeft = options.left || 0; + } else if (typeof options === 'number') { + this.scrollLeft = options; + this.scrollTop = y || 0; + } + }; + } +} + +if (typeof globalThis.ResizeObserver === 'undefined') { + globalThis.ResizeObserver = class ResizeObserver { + observe() {} + unobserve() {} + disconnect() {} + } as typeof ResizeObserver; +} + +(globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; +configure({ asyncUtilTimeout: 1000 }); + +beforeEach(() => { + if (!globalThis.document.body) { + globalThis.document.body = globalThis.document.createElement('body'); + } + + Object.assign(screen, within(globalThis.document.body)); +}); + +afterEach(() => { + cleanup(); + jest.restoreAllMocks(); + mock.restore(); +}); diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index 8123370..0a5efdf 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "types": ["bun-types"], "baseUrl": ".", "paths": { "@todo-starter/ui": ["./src"], @@ -19,4 +20,3 @@ ".turbo" ] } - diff --git a/packages/ui/vitest.config.ts b/packages/ui/vitest.config.ts deleted file mode 100644 index 5a6dd5d..0000000 --- a/packages/ui/vitest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - test: { - environment: 'jsdom', - setupFiles: ['./src/test/setup.ts'], - globals: true, - css: false - } -}); diff --git a/packages/utils/package.json b/packages/utils/package.json index ccd3321..5f4822e 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -16,13 +16,13 @@ "lint": "biome lint .", "format": "biome format --write .", "typecheck": "tsc --noEmit", - "test": "vitest", - "test:ci": "vitest run" + "test": "bun test", + "test:ci": "bun test" }, "devDependencies": { - "@biomejs/biome": "2.2.0", - "typescript": "^5.8.3", - "vitest": "^3.2.4" + "@biomejs/biome": "2.3.11", + "bun-types": "^1.3.5", + "typescript": "^5.8.3" }, "dependencies": { "clsx": "^2.0.0", diff --git a/packages/utils/src/cn.test.ts b/packages/utils/src/cn.test.ts index e07ea9f..b2bc010 100644 --- a/packages/utils/src/cn.test.ts +++ b/packages/utils/src/cn.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from 'vitest'; +import { describe, expect, it } from 'bun:test'; import { cn } from './cn'; // Simplified boolean logic for linter diff --git a/packages/utils/src/types.test.ts b/packages/utils/src/types.test.ts index e812f73..dcb3633 100644 --- a/packages/utils/src/types.test.ts +++ b/packages/utils/src/types.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from 'vitest'; +import { describe, expect, it } from 'bun:test'; import type { Todo, TodoFilter, TodoStore } from './types'; describe('Todo types', () => { diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json index 796bbf1..16d0be6 100644 --- a/packages/utils/tsconfig.json +++ b/packages/utils/tsconfig.json @@ -1,6 +1,9 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "types": [ + "bun-types" + ], "baseUrl": ".", "paths": { "@todo-starter/ui": ["../ui/src"], @@ -19,4 +22,3 @@ ".turbo" ] } - diff --git a/packages/utils/vitest.config.ts b/packages/utils/vitest.config.ts deleted file mode 100644 index 414d975..0000000 --- a/packages/utils/vitest.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - test: { - globals: true, - environment: 'node' - } -});