From 31b4b5a281d41ae5271d5feeccedff78aa0717a8 Mon Sep 17 00:00:00 2001 From: baiyanyun Date: Fri, 5 Jun 2026 15:45:55 +0800 Subject: [PATCH] feat(client): add qimingclaw digital adapter --- .../sgrobot-digital/patches/README.md | 2 + .../embedded/sgrobot-digital/src/lib/api.ts | 6 + .../src/lib/qimingclawAdapter.ts | 678 ++++++++++++++++++ .../sgrobot-digital/assets/index-Brx6-oKs.js | 116 +++ .../sgrobot-digital/assets/index-DX0h8EMp.js | 116 --- .../public/sgrobot-digital/index.html | 2 +- .../scripts/sync-sgrobot-digital.js | 19 + ...ital-employee-frontend-integration-plan.md | 43 ++ 8 files changed, 865 insertions(+), 117 deletions(-) create mode 100644 qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts create mode 100644 qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-Brx6-oKs.js delete mode 100644 qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-DX0h8EMp.js diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/patches/README.md b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/patches/README.md index db2b89a0..dc21a180 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/patches/README.md +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/patches/README.md @@ -5,6 +5,8 @@ This directory records qimingclaw-only adaptations around the sgRobot digital em - `src/main.tsx` mounts the digital employee page directly at `#/digital`. - `src/lib/basePath.ts` fixes static assets under `/sgrobot-digital`. - `src/lib/tauri.ts` disables sgRobot/Tauri gateway detection inside the Electron webview. +- `src/lib/qimingclawAdapter.ts` provides the first qimingclaw-native digital employee API projection. +- `src/lib/api.ts` calls the qimingclaw adapter before falling back to normal HTTP fetch. - `index.html` injects a local token so copied sgRobot pages do not show the pairing screen. Run `npm run sync:sgrobot-digital` from `crates/agent-electron-client` after changing the upstream sgRobot digital UI. diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/api.ts b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/api.ts index 57bbd5f1..b89c3ad7 100644 --- a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/api.ts +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/api.ts @@ -32,6 +32,7 @@ import type { } from '../types/api'; import { clearToken, getToken, setToken } from './auth'; import { apiOrigin, apiBase } from './basePath'; +import { handleQimingclawDigitalApi } from './qimingclawAdapter'; // --------------------------------------------------------------------------- // Base fetch wrapper @@ -55,6 +56,11 @@ export async function apiFetch( path: string, options: ApiFetchOptions = {}, ): Promise { + const adapterData = await handleQimingclawDigitalApi(path, options); + if (adapterData !== undefined) { + return adapterData; + } + const { timeoutMs = API_FETCH_TIMEOUT_MS, ...fetchOptions } = options; const token = getToken(); const headers = new Headers(fetchOptions.headers); diff --git a/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts new file mode 100644 index 00000000..d1ec4a3b --- /dev/null +++ b/qimingclaw/crates/agent-electron-client/embedded/sgrobot-digital/src/lib/qimingclawAdapter.ts @@ -0,0 +1,678 @@ +import type { + CronJob, + DebugPlan, + DebugRun, + DebugTask, + DigitalEmployeeDuty, + DigitalEmployeeRunDetail, + DigitalEmployeeTaskExecutionSummary, + DigitalEmployeeWorkEvent, + DigitalEmployeeWorkdayActionRequest, + DigitalEmployeeWorkdayProjection, + FlowResponse, + PlanDispatchResponse, + SkillSpec, +} from '@/types/api'; + +declare global { + interface Window { + __QIMINGCLAW_EMBEDDED_DIGITAL__?: boolean; + } +} + +const STATE_KEY = 'qimingclaw:digital-employee-adapter-state'; +const DEFAULT_REPORT_TIME = '18:00'; + +interface AdapterState { + selectedDutyIdsByDate: Record; + confirmedDates: Record; + reportScheduleTime: string; + reportGeneratedAtByDate: Record; + profile: { + name: string; + company: string; + position: string; + currentStatus: string; + }; +} + +const SKILLS: SkillSpec[] = [ + { + skill_id: 'qimingclaw-acp-session', + name: 'ACP 会话执行', + version: '1.0.0', + enabled: true, + description: '通过 qimingclaw 的 ACP 引擎创建会话、执行任务并跟踪结果。', + category: '执行', + capability_level: 'core', + }, + { + skill_id: 'qimingclaw-mcp-tools', + name: 'MCP 工具编排', + version: '1.0.0', + enabled: true, + description: '读取已配置 MCP 服务与工具,作为数字员工的工具能力池。', + category: '工具', + capability_level: 'core', + }, + { + skill_id: 'qimingclaw-computer-control', + name: '客户端电脑控制', + version: '1.0.0', + enabled: true, + description: '承接 /computer/chat 执行入口,面向远程任务和本地自动化操作。', + category: '桌面', + capability_level: 'specialized', + }, + { + skill_id: 'qimingclaw-artifact-report', + name: '产物与日报整理', + version: '1.0.0', + enabled: true, + description: '把执行记录、关键产物和异常汇总成数字员工日报。', + category: '汇报', + capability_level: 'standard', + }, +]; + +const PLANS: DebugPlan[] = [ + { + plan_id: 'qimingclaw-client-readiness', + title: '客户端运行状态巡检', + objective: '确认 qimingclaw 客户端、Agent、MCP 和远程接入能力是否处于可执行状态。', + status: 'running', + created_at: todayAt(9, 0), + steps: [ + { + step_id: 'agent-status', + title: '检查 Agent 引擎状态', + depends_on: [], + preferred_skills: ['qimingclaw-acp-session'], + tasks: [{ task_id: 'task-agent-status', title: '读取 Agent 服务状态', status: 'running' }], + }, + { + step_id: 'mcp-status', + title: '检查 MCP 工具能力', + depends_on: ['agent-status'], + preferred_skills: ['qimingclaw-mcp-tools'], + tasks: [{ task_id: 'task-mcp-status', title: '同步 MCP 工具列表', status: 'pending' }], + }, + ], + }, + { + plan_id: 'qimingclaw-remote-task-ingress', + title: '远程任务接入准备', + objective: '检查 lanproxy、computer server 和文件服务,为后端下发数字员工任务做准备。', + status: 'pending', + created_at: todayAt(9, 30), + steps: [ + { + step_id: 'computer-server', + title: '确认 /computer/chat 执行入口', + depends_on: [], + preferred_skills: ['qimingclaw-computer-control'], + tasks: [{ task_id: 'task-computer-server', title: '检查电脑控制服务', status: 'pending' }], + }, + { + step_id: 'file-artifact', + title: '准备产物回传目录', + depends_on: ['computer-server'], + preferred_skills: ['qimingclaw-artifact-report'], + tasks: [{ task_id: 'task-file-artifact', title: '整理执行产物通道', status: 'pending' }], + }, + ], + }, + { + plan_id: 'qimingclaw-daily-report', + title: '数字员工日报生成', + objective: '汇总今日执行记录、服务状态和待介入事项,生成面向业务的日报。', + status: 'pending', + created_at: todayAt(17, 30), + steps: [ + { + step_id: 'collect-events', + title: '汇总运行事件', + depends_on: [], + preferred_skills: ['qimingclaw-artifact-report'], + tasks: [{ task_id: 'task-collect-events', title: '整理今日运行明细', status: 'pending' }], + }, + { + step_id: 'write-report', + title: '生成日报摘要', + depends_on: ['collect-events'], + preferred_skills: ['qimingclaw-artifact-report'], + tasks: [{ task_id: 'task-write-report', title: '生成数字员工日报', status: 'pending' }], + }, + ], + }, +]; + +const PLAN_SCHEDULES: Record = { + 'qimingclaw-client-readiness': { + expression: '0 9 * * *', + nextRun: todayAt(9, 0), + scheduleText: '已定时 09:00 执行', + }, + 'qimingclaw-remote-task-ingress': { + expression: '30 9 * * *', + nextRun: todayAt(9, 30), + scheduleText: '已定时 09:30 执行', + }, + 'qimingclaw-daily-report': { + expression: '0 18 * * *', + nextRun: todayAt(18, 0), + scheduleText: '已定时 18:00 执行', + }, +}; + +export function isQimingclawDigitalApiEnabled(): boolean { + return window.__QIMINGCLAW_EMBEDDED_DIGITAL__ === true; +} + +export async function handleQimingclawDigitalApi( + path: string, + options: RequestInit = {}, +): Promise { + if (!isQimingclawDigitalApiEnabled()) return undefined; + + const url = new URL(path, window.location.origin); + const method = (options.method || 'GET').toUpperCase(); + const pathname = url.pathname; + + if (method === 'GET' && pathname === '/api/digital-employee/workday') { + return buildWorkday(url.searchParams.get('date') || todayInputDate()) as T; + } + if (method === 'POST' && pathname === '/api/digital-employee/workday/actions') { + return handleWorkdayAction(parseJsonBody(options.body)) as T; + } + if (method === 'GET' && pathname === '/api/scheduler/jobs') { + return { jobs: buildSchedulerJobs() } as T; + } + if (method === 'GET' && pathname === '/api/debug/plans') { + return { plans: filterPlans(url.searchParams.get('q')) } as T; + } + if (method === 'GET' && pathname === '/api/debug/tasks') { + const planId = url.searchParams.get('plan_id'); + return buildTasksResponse(planId) as T; + } + if (method === 'GET' && pathname.startsWith('/api/debug/plan/') && pathname.endsWith('/flow')) { + return buildPlanFlow(decodeURIComponent(pathname.split('/')[4] || '')) as T; + } + if (method === 'POST' && pathname.startsWith('/api/debug/plan/') && pathname.endsWith('/dispatch')) { + return dispatchPlan(decodeURIComponent(pathname.split('/')[4] || '')) as T; + } + if (method === 'GET' && pathname.startsWith('/api/plan/') && pathname.endsWith('/messages')) { + return { messages: buildPlanMessages(decodeURIComponent(pathname.split('/')[3] || '')) } as T; + } + if (method === 'GET' && pathname === '/api/skill') { + return { skills: SKILLS } as T; + } + if (method === 'POST' && pathname.startsWith('/api/skill/') && pathname.endsWith('/enabled')) { + const skillId = decodeURIComponent(pathname.split('/')[3] || ''); + const body = parseJsonBody<{ enabled?: boolean }>(options.body); + return { ok: true, skill_id: skillId, enabled: body.enabled ?? true } as T; + } + + return undefined; +} + +function defaultState(): AdapterState { + return { + selectedDutyIdsByDate: {}, + confirmedDates: {}, + reportScheduleTime: DEFAULT_REPORT_TIME, + reportGeneratedAtByDate: {}, + profile: { + name: '飞天数字员工', + company: 'qimingclaw 客户端', + position: '客户端任务执行员', + currentStatus: 'working', + }, + }; +} + +function readState(): AdapterState { + try { + const raw = window.localStorage.getItem(STATE_KEY); + return raw ? { ...defaultState(), ...JSON.parse(raw) as Partial } : defaultState(); + } catch { + return defaultState(); + } +} + +function writeState(state: AdapterState): void { + window.localStorage.setItem(STATE_KEY, JSON.stringify(state)); +} + +function parseJsonBody(body: BodyInit | null | undefined): T { + if (typeof body !== 'string' || !body.trim()) return {} as T; + return JSON.parse(body) as T; +} + +function todayInputDate(): string { + const date = new Date(); + return [ + date.getFullYear(), + String(date.getMonth() + 1).padStart(2, '0'), + String(date.getDate()).padStart(2, '0'), + ].join('-'); +} + +function todayAt(hour: number, minute: number): string { + const date = new Date(); + date.setHours(hour, minute, 0, 0); + return date.toISOString(); +} + +function displayDate(date: string): string { + return date.split('-').join('/'); +} + +function selectedSetForDate(state: AdapterState, date: string): Set { + return new Set(state.selectedDutyIdsByDate[date] ?? []); +} + +function planStatusTone(status: string): string { + if (['completed', 'succeeded', 'success'].includes(status)) return 'success'; + if (['running', 'active'].includes(status)) return 'running'; + if (['failed', 'error'].includes(status)) return 'danger'; + return 'waiting'; +} + +function planStatusLabel(status: string): string { + if (status === 'running') return '执行中'; + if (status === 'completed' || status === 'succeeded') return '已完成'; + if (status === 'failed') return '异常'; + return '待执行'; +} + +function buildSchedulerJobs(): CronJob[] { + return PLANS.map((plan) => { + const schedule = PLAN_SCHEDULES[plan.plan_id] ?? PLAN_SCHEDULES['qimingclaw-client-readiness']!; + return { + id: `schedule-${plan.plan_id}`, + name: plan.title, + expression: schedule.expression, + command: `digital-employee:${plan.plan_id}`, + prompt: plan.objective ?? null, + job_type: 'plan_template', + schedule: { expression: schedule.expression, template_id: plan.plan_id }, + enabled: true, + delivery: { mode: 'plan_template', template_id: plan.plan_id }, + template_id: plan.plan_id, + trigger_kind: 'scheduled', + step_count: plan.steps?.length ?? 0, + skill_ids: [...new Set((plan.steps ?? []).flatMap((step) => step.preferred_skills ?? []))], + delete_after_run: false, + created_at: plan.created_at, + next_run: schedule.nextRun, + last_run: plan.status === 'running' ? todayAt(9, 5) : null, + last_status: plan.status === 'running' ? 'running' : null, + last_output: null, + }; + }); +} + +function buildDuties(state: AdapterState, date: string): DigitalEmployeeDuty[] { + const selected = selectedSetForDate(state, date); + return PLANS.map((plan) => { + const schedule = PLAN_SCHEDULES[plan.plan_id] ?? PLAN_SCHEDULES['qimingclaw-client-readiness']!; + return { + id: plan.plan_id, + title: plan.title, + summary: plan.objective ?? '等待 qimingclaw 执行链路补充任务说明。', + implemented: true, + selectable: true, + selected: selected.has(plan.plan_id), + status: plan.status, + status_label: planStatusLabel(plan.status), + status_tone: planStatusTone(plan.status), + schedule_text: schedule.scheduleText, + result_text: plan.status === 'running' ? '正在同步客户端运行状态' : '等待任务执行', + conversation_id: plan.plan_id, + }; + }); +} + +function buildTasks(planId?: string | null): DebugTask[] { + return PLANS + .filter((plan) => !planId || plan.plan_id === planId) + .flatMap((plan) => (plan.steps ?? []).flatMap((step) => (step.tasks ?? []).map((task) => ({ + task_id: task.task_id, + title: task.title, + status: task.status, + plan_id: plan.plan_id, + step_id: step.step_id, + assigned_skill_id: step.preferred_skills?.[0] ?? '', + description: `${plan.title} · ${step.title}`, + created_at: plan.created_at, + updated_at: plan.status === 'running' ? new Date().toISOString() : plan.created_at, + started_at: task.status === 'running' ? todayAt(9, 5) : null, + finished_at: task.status === 'completed' ? todayAt(9, 10) : null, + })))); +} + +function buildRuns(tasks: DebugTask[]): DebugRun[] { + return tasks + .filter((task) => task.status === 'running' || task.status === 'completed') + .map((task, index) => ({ + run_id: `qimingclaw-run-${index + 1}`, + task_id: task.task_id, + plan_id: task.plan_id, + skill_id: task.assigned_skill_id, + attempt_no: 1, + lifecycle: task.status === 'running' ? 'Running' : 'Succeeded', + created_at: task.started_at ?? task.created_at, + completed_at: task.finished_at, + events: [ + { + event_id: `${task.task_id}-event-start`, + kind: 'RunStarted', + occurred_at: task.started_at ?? task.created_at, + message: `${task.title} 已进入 qimingclaw 执行链路`, + }, + ], + })); +} + +function buildTasksResponse(planId?: string | null): { tasks: DebugTask[]; runs: DebugRun[]; total: number; truncated: boolean } { + const tasks = buildTasks(planId); + return { tasks, runs: buildRuns(tasks), total: tasks.length, truncated: false }; +} + +function filterPlans(query?: string | null): DebugPlan[] { + const normalized = (query ?? '').trim().toLowerCase(); + if (!normalized) return PLANS; + return PLANS.filter((plan) => ( + plan.title.toLowerCase().includes(normalized) + || plan.plan_id.toLowerCase().includes(normalized) + || (plan.objective ?? '').toLowerCase().includes(normalized) + )); +} + +function buildEvents(duties: DigitalEmployeeDuty[], confirmed: boolean): DigitalEmployeeWorkEvent[] { + if (!confirmed) { + return [{ + id: 'event-await-confirmation', + time: '待确认', + plan_title: '任务设置', + task_title: '等待确认今日任务', + step_title: '选择职责', + detail: '请先确认今天要执行的任务,确认后数字员工会开始执行。', + status: 'pending', + status_label: '待确认', + status_tone: 'waiting', + updated_at: new Date().toISOString(), + conversation_id: null, + }]; + } + + const selectedDuties = duties.filter((duty) => duty.selected); + return selectedDuties.map((duty, index) => ({ + id: `event-${duty.id}`, + time: index === 0 ? '09:05' : '待执行', + plan_title: duty.title, + task_title: duty.title, + step_title: index === 0 ? '接入 qimingclaw 执行链路' : '等待调度', + detail: index === 0 + ? '已接入 qimingclaw 客户端服务状态与执行入口,等待后续绑定真实 Run 事件。' + : '任务已确认,将在后续阶段接入 ACP/MCP 真实执行事件。', + status: index === 0 ? 'running' : 'pending', + status_label: index === 0 ? '执行中' : '待执行', + status_tone: index === 0 ? 'running' : 'waiting', + updated_at: new Date().toISOString(), + conversation_id: duty.conversation_id, + })); +} + +function buildExecutionSummaries(duties: DigitalEmployeeDuty[], events: DigitalEmployeeWorkEvent[]): DigitalEmployeeTaskExecutionSummary[] { + return duties.filter((duty) => duty.selected).map((duty) => { + const related = events.filter((event) => event.conversation_id === duty.conversation_id); + const running = related.filter((event) => event.status === 'running').length; + const success = related.filter((event) => event.status === 'completed').length; + return { + id: duty.id, + plan_id: duty.id, + title: duty.title, + description: duty.summary, + selected: duty.selected, + total_count: Math.max(related.length, 1), + success_count: success, + failure_count: 0, + running_count: running, + waiting_count: running > 0 ? 0 : 1, + latest_status_label: running > 0 ? '执行中' : '待执行', + latest_status_tone: running > 0 ? 'running' : 'waiting', + business_summary: duty.result_text, + ai_summary: '当前由 qimingclaw adapter 生成,后续接入真实执行日志。', + }; + }); +} + +function buildRunDetails(events: DigitalEmployeeWorkEvent[]): DigitalEmployeeRunDetail[] { + return events.map((event) => ({ + id: `run-detail-${event.id}`, + time: event.time, + task_name: event.task_title, + step_name: event.step_title, + operation_name: event.plan_title, + status_label: event.status_label, + status_tone: event.status_tone, + business_detail: event.detail, + raw_detail: event.detail, + updated_at: event.updated_at, + conversation_id: event.conversation_id, + })); +} + +function buildWorkday(date: string): DigitalEmployeeWorkdayProjection { + const state = readState(); + const confirmedAt = state.confirmedDates[date] ?? null; + const confirmed = Boolean(confirmedAt); + const duties = buildDuties(state, date); + const events = buildEvents(duties, confirmed); + const executionSummaries = buildExecutionSummaries(duties, events); + const generatedAt = state.reportGeneratedAtByDate[date] ?? null; + const selectedCount = duties.filter((duty) => duty.selected).length; + const runningCount = events.filter((event) => event.status === 'running').length; + + return { + source: 'live', + date, + employee: { + name: state.profile.name, + title: '数字员工', + major: 'qimingclaw 客户端任务执行', + company: state.profile.company, + position: state.profile.position, + current_status: state.profile.currentStatus, + current_status_label: state.profile.currentStatus === 'resting' ? '休息中' : '工作中', + motto: '承接客户端任务,调度 ACP 与 MCP 能力完成执行。', + }, + workday: { + confirmed, + confirmed_at: confirmedAt, + current_status: state.profile.currentStatus, + current_status_label: state.profile.currentStatus === 'resting' ? '休息中' : '工作中', + status_label: confirmed ? '运行中' : '待确认', + status_tone: confirmed ? 'running' : 'waiting', + summary: confirmed + ? `当前日期 ${displayDate(date)} 已确认 ${selectedCount} 项任务。` + : `当前日期 ${displayDate(date)} 待确认今日任务。`, + bubble_text: confirmed + ? '我已接入 qimingclaw 客户端执行链路,正在等待真实 Run/Event 数据接入。' + : '请先确认今天要执行的任务,我会把它们映射到 qimingclaw 执行链路。', + }, + overview: { + title: '今日执行', + status_label: confirmed ? '真实数据' : '待确认', + status_tone: confirmed ? 'success' : 'waiting', + metrics: [ + { label: '已选任务', value: String(selectedCount) }, + { label: '运行记录', value: String(events.length) }, + { label: '执行中', value: String(runningCount) }, + { label: '异常', value: '0' }, + ], + }, + duties, + events, + execution_summaries: executionSummaries, + run_details: buildRunDetails(events), + decisions: [], + delivery: { + headline: confirmed ? 'qimingclaw 执行链路已接入' : '等待确认任务设置', + summary: '当前阶段已将数字员工页面切换到 qimingclaw adapter,下一阶段接入真实 ACP/MCP Run 事件。', + lines: [ + '已吸收 sgRobot 数字员工 UI 和核心展示模型。', + '已建立 qimingclaw workday/plans/tasks/skills API adapter。', + '后续将把客户端服务状态、会话和执行事件写入真实状态模型。', + ], + artifacts: [ + { name: '数字员工运行摘要', status: generatedAt ? 'ready' : 'pending' }, + ], + }, + daily_report: { + date, + title: `${displayDate(date)} 飞天数字员工日报`, + report_schedule_time: state.reportScheduleTime, + status: generatedAt ? 'ready' : 'not_generated', + generated_at: generatedAt, + generated_by: generatedAt ? 'ai' : 'fallback', + model: 'qimingclaw-adapter', + source: 'qimingclaw', + summary: generatedAt + ? '今日已完成数字员工页面到 qimingclaw adapter 的接入,可继续接入真实执行事件。' + : '日报将在生成后汇总任务选择、运行明细和后续接入建议。', + totals: { + task_count: selectedCount, + execution_count: events.length, + success_count: 0, + failure_count: 0, + running_count: runningCount, + }, + task_sections: executionSummaries, + detail_lines: events.map((event) => `${event.time} ${event.task_title}:${event.detail}`), + pdf_available: false, + pdf_url: null, + }, + }; +} + +function handleWorkdayAction(body: DigitalEmployeeWorkdayActionRequest): DigitalEmployeeWorkdayProjection { + const state = readState(); + const date = body.date || todayInputDate(); + + if (body.action === 'confirm_workday') { + state.selectedDutyIdsByDate[date] = body.duty_ids ?? []; + state.confirmedDates[date] = new Date().toISOString(); + } + if (body.action === 'update_profile') { + state.profile = { + name: body.name || state.profile.name, + company: body.company || state.profile.company, + position: body.position || state.profile.position, + currentStatus: body.current_status || state.profile.currentStatus, + }; + } + if (body.action === 'update_report_schedule') { + state.reportScheduleTime = body.report_schedule_time || state.reportScheduleTime; + } + if (body.action === 'generate_daily_report') { + if (body.duty_ids) state.selectedDutyIdsByDate[date] = body.duty_ids; + if (body.report_schedule_time) state.reportScheduleTime = body.report_schedule_time; + state.reportGeneratedAtByDate[date] = new Date().toISOString(); + } + + writeState(state); + return buildWorkday(date); +} + +function buildPlanFlow(planId: string): FlowResponse { + const plan = PLANS.find((candidate) => candidate.plan_id === planId) ?? PLANS[0]!; + const timestamp = new Date().toISOString(); + return { + plan_id: plan.plan_id, + plan_title: plan.title, + plan_status: plan.status, + plan_objective: plan.objective, + lanes: [ + { key: 'intent', label: '目标', color: '#38bdf8' }, + { key: 'qimingclaw', label: 'qimingclaw', color: '#22c55e' }, + { key: 'execution', label: '执行', color: '#f59e0b' }, + ], + steps: [ + { + seq: 1, + lane: 'intent', + label: plan.title, + sub_label: plan.objective, + timestamp: plan.created_at, + color: '#38bdf8', + source_type: 'plan', + }, + { + seq: 2, + lane: 'qimingclaw', + label: '接入客户端能力', + sub_label: 'ACP / MCP / computer server adapter', + timestamp, + color: '#22c55e', + source_type: 'adapter', + }, + { + seq: 3, + lane: 'execution', + label: plan.status === 'running' ? '等待真实 Run 事件' : '等待调度', + sub_label: '后续阶段接入 qimingclaw 本地状态模型', + timestamp, + color: '#f59e0b', + source_type: 'run', + }, + ], + events: [ + { + event_id: `${plan.plan_id}-adapter-event`, + kind: 'qimingclaw_adapter', + occurred_at: timestamp, + message: '数字员工页面已通过 qimingclaw adapter 获取数据。', + }, + ], + }; +} + +function dispatchPlan(planId: string): PlanDispatchResponse { + const state = readState(); + const date = todayInputDate(); + const selected = new Set(state.selectedDutyIdsByDate[date] ?? []); + selected.add(planId); + state.selectedDutyIdsByDate[date] = [...selected]; + state.confirmedDates[date] = state.confirmedDates[date] ?? new Date().toISOString(); + writeState(state); + + return { + ok: true, + plan_id: planId, + source_plan_id: planId, + dispatched_tasks: buildTasks(planId).map((task) => ({ + task_id: task.task_id, + title: task.title, + status: task.status === 'pending' ? 'running' : task.status, + })), + }; +} + +function buildPlanMessages(planId: string): Array<{ role: string; content: string; created_at?: string | null }> { + const plan = PLANS.find((candidate) => candidate.plan_id === planId) ?? PLANS[0]!; + return [ + { + role: 'user', + content: `执行数字员工任务:${plan.title}`, + created_at: plan.created_at, + }, + { + role: 'assistant', + content: `已接入 qimingclaw adapter。目标:${plan.objective ?? plan.title}`, + created_at: new Date().toISOString(), + }, + ]; +} diff --git a/qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-Brx6-oKs.js b/qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-Brx6-oKs.js new file mode 100644 index 00000000..2223ac73 --- /dev/null +++ b/qimingclaw/crates/agent-electron-client/public/sgrobot-digital/assets/index-Brx6-oKs.js @@ -0,0 +1,116 @@ +(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))u(f);new MutationObserver(f=>{for(const h of f)if(h.type==="childList")for(const p of h.addedNodes)p.tagName==="LINK"&&p.rel==="modulepreload"&&u(p)}).observe(document,{childList:!0,subtree:!0});function o(f){const h={};return f.integrity&&(h.integrity=f.integrity),f.referrerPolicy&&(h.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?h.credentials="include":f.crossOrigin==="anonymous"?h.credentials="omit":h.credentials="same-origin",h}function u(f){if(f.ep)return;f.ep=!0;const h=o(f);fetch(f.href,h)}})();function Sv(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var lo={exports:{}},Xi={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ah;function xv(){if(Ah)return Xi;Ah=1;var n=Symbol.for("react.transitional.element"),s=Symbol.for("react.fragment");function o(u,f,h){var p=null;if(h!==void 0&&(p=""+h),f.key!==void 0&&(p=""+f.key),"key"in f){h={};for(var j in f)j!=="key"&&(h[j]=f[j])}else h=f;return f=h.ref,{$$typeof:n,type:u,key:p,ref:f!==void 0?f:null,props:h}}return Xi.Fragment=s,Xi.jsx=o,Xi.jsxs=o,Xi}var Dh;function jv(){return Dh||(Dh=1,lo.exports=xv()),lo.exports}var c=jv(),no={exports:{}},me={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var zh;function Ev(){if(zh)return me;zh=1;var n=Symbol.for("react.transitional.element"),s=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),h=Symbol.for("react.consumer"),p=Symbol.for("react.context"),j=Symbol.for("react.forward_ref"),g=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),w=Symbol.for("react.lazy"),S=Symbol.for("react.activity"),T=Symbol.iterator;function B(x){return x===null||typeof x!="object"?null:(x=T&&x[T]||x["@@iterator"],typeof x=="function"?x:null)}var M={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},$=Object.assign,q={};function X(x,R,K){this.props=x,this.context=R,this.refs=q,this.updater=K||M}X.prototype.isReactComponent={},X.prototype.setState=function(x,R){if(typeof x!="object"&&typeof x!="function"&&x!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,x,R,"setState")},X.prototype.forceUpdate=function(x){this.updater.enqueueForceUpdate(this,x,"forceUpdate")};function I(){}I.prototype=X.prototype;function J(x,R,K){this.props=x,this.context=R,this.refs=q,this.updater=K||M}var le=J.prototype=new I;le.constructor=J,$(le,X.prototype),le.isPureReactComponent=!0;var ie=Array.isArray;function he(){}var Z={H:null,A:null,T:null,S:null},ee=Object.prototype.hasOwnProperty;function Te(x,R,K){var F=K.ref;return{$$typeof:n,type:x,key:R,ref:F!==void 0?F:null,props:K}}function at(x,R){return Te(x.type,R,x.props)}function Xe(x){return typeof x=="object"&&x!==null&&x.$$typeof===n}function oe(x){var R={"=":"=0",":":"=2"};return"$"+x.replace(/[=:]/g,function(K){return R[K]})}var Q=/\/+/g;function se(x,R){return typeof x=="object"&&x!==null&&x.key!=null?oe(""+x.key):R.toString(36)}function H(x){switch(x.status){case"fulfilled":return x.value;case"rejected":throw x.reason;default:switch(typeof x.status=="string"?x.then(he,he):(x.status="pending",x.then(function(R){x.status==="pending"&&(x.status="fulfilled",x.value=R)},function(R){x.status==="pending"&&(x.status="rejected",x.reason=R)})),x.status){case"fulfilled":return x.value;case"rejected":throw x.reason}}throw x}function A(x,R,K,F,re){var ge=typeof x;(ge==="undefined"||ge==="boolean")&&(x=null);var Ne=!1;if(x===null)Ne=!0;else switch(ge){case"bigint":case"string":case"number":Ne=!0;break;case"object":switch(x.$$typeof){case n:case s:Ne=!0;break;case w:return Ne=x._init,A(Ne(x._payload),R,K,F,re)}}if(Ne)return re=re(x),Ne=F===""?"."+se(x,0):F,ie(re)?(K="",Ne!=null&&(K=Ne.replace(Q,"$&/")+"/"),A(re,R,K,"",function(V){return V})):re!=null&&(Xe(re)&&(re=at(re,K+(re.key==null||x&&x.key===re.key?"":(""+re.key).replace(Q,"$&/")+"/")+Ne)),R.push(re)),1;Ne=0;var Ze=F===""?".":F+":";if(ie(x))for(var G=0;G>>1,be=A[de];if(0>>1;def(K,te))Ff(re,K)?(A[de]=re,A[F]=te,de=F):(A[de]=K,A[R]=te,de=R);else if(Ff(re,te))A[de]=re,A[F]=te,de=F;else break e}}return Y}function f(A,Y){var te=A.sortIndex-Y.sortIndex;return te!==0?te:A.id-Y.id}if(n.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var h=performance;n.unstable_now=function(){return h.now()}}else{var p=Date,j=p.now();n.unstable_now=function(){return p.now()-j}}var g=[],y=[],w=1,S=null,T=3,B=!1,M=!1,$=!1,q=!1,X=typeof setTimeout=="function"?setTimeout:null,I=typeof clearTimeout=="function"?clearTimeout:null,J=typeof setImmediate<"u"?setImmediate:null;function le(A){for(var Y=o(y);Y!==null;){if(Y.callback===null)u(y);else if(Y.startTime<=A)u(y),Y.sortIndex=Y.expirationTime,s(g,Y);else break;Y=o(y)}}function ie(A){if($=!1,le(A),!M)if(o(g)!==null)M=!0,he||(he=!0,oe());else{var Y=o(y);Y!==null&&H(ie,Y.startTime-A)}}var he=!1,Z=-1,ee=5,Te=-1;function at(){return q?!0:!(n.unstable_now()-TeA&&at());){var de=S.callback;if(typeof de=="function"){S.callback=null,T=S.priorityLevel;var be=de(S.expirationTime<=A);if(A=n.unstable_now(),typeof be=="function"){S.callback=be,le(A),Y=!0;break t}S===o(g)&&u(g),le(A)}else u(g);S=o(g)}if(S!==null)Y=!0;else{var x=o(y);x!==null&&H(ie,x.startTime-A),Y=!1}}break e}finally{S=null,T=te,B=!1}Y=void 0}}finally{Y?oe():he=!1}}}var oe;if(typeof J=="function")oe=function(){J(Xe)};else if(typeof MessageChannel<"u"){var Q=new MessageChannel,se=Q.port2;Q.port1.onmessage=Xe,oe=function(){se.postMessage(null)}}else oe=function(){X(Xe,0)};function H(A,Y){Z=X(function(){A(n.unstable_now())},Y)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(A){A.callback=null},n.unstable_forceFrameRate=function(A){0>A||125de?(A.sortIndex=te,s(y,A),o(g)===null&&A===o(y)&&($?(I(Z),Z=-1):$=!0,H(ie,te-de))):(A.sortIndex=be,s(g,A),M||B||(M=!0,he||(he=!0,oe()))),A},n.unstable_shouldYield=at,n.unstable_wrapCallback=function(A){var Y=T;return function(){var te=T;T=Y;try{return A.apply(this,arguments)}finally{T=te}}}})(ro)),ro}var Oh;function Tv(){return Oh||(Oh=1,so.exports=Nv()),so.exports}var co={exports:{}},wt={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Lh;function Cv(){if(Lh)return wt;Lh=1;var n=Uo();function s(g){var y="https://react.dev/errors/"+g;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(s){console.error(s)}}return n(),co.exports=Cv(),co.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Hh;function Av(){if(Hh)return Qi;Hh=1;var n=Tv(),s=Uo(),o=kv();function u(e){var t="https://react.dev/errors/"+e;if(1be||(e.current=de[be],de[be]=null,be--)}function K(e,t){be++,de[be]=e.current,e.current=t}var F=x(null),re=x(null),ge=x(null),Ne=x(null);function Ze(e,t){switch(K(ge,t),K(re,e),K(F,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Pm(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Pm(t),e=eh(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}R(F),K(F,e)}function G(){R(F),R(re),R(ge)}function V(e){e.memoizedState!==null&&K(Ne,e);var t=F.current,a=eh(t,e.type);t!==a&&(K(re,e),K(F,a))}function De(e){re.current===e&&(R(F),R(re)),Ne.current===e&&(R(Ne),qi._currentValue=te)}var ze,ot;function _t(e){if(ze===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);ze=t&&t[1]||"",ot=-1)":-1i||_[l]!==k[i]){var O=` +`+_[l].replace(" at new "," at ");return e.displayName&&O.includes("")&&(O=O.replace("",e.displayName)),O}while(1<=l&&0<=i);break}}}finally{oa=!1,Error.prepareStackTrace=a}return(a=e?e.displayName||e.name:"")?_t(a):""}function mt(e,t){switch(e.tag){case 26:case 27:case 5:return _t(e.type);case 16:return _t("Lazy");case 13:return e.child!==t&&t!==null?_t("Suspense Fallback"):_t("Suspense");case 19:return _t("SuspenseList");case 0:case 15:return Re(e.type,!1);case 11:return Re(e.type.render,!1);case 1:return Re(e.type,!0);case 31:return _t("Activity");default:return""}}function Sa(e){try{var t="",a=null;do t+=mt(e,a),a=e,e=e.return;while(e);return t}catch(l){return` +Error generating stack: `+l.message+` +`+l.stack}}var ue=Object.prototype.hasOwnProperty,St=n.unstable_scheduleCallback,lt=n.unstable_cancelCallback,Ma=n.unstable_shouldYield,nn=n.unstable_requestPaint,Ve=n.unstable_now,Nt=n.unstable_getCurrentPriorityLevel,Dl=n.unstable_ImmediatePriority,xa=n.unstable_UserBlockingPriority,ja=n.unstable_NormalPriority,Jn=n.unstable_LowPriority,xt=n.unstable_IdlePriority,Zr=n.log,ts=n.unstable_setDisableYieldValue,Ft=null,Tt=null;function Wt(e){if(typeof Zr=="function"&&ts(e),Tt&&typeof Tt.setStrictMode=="function")try{Tt.setStrictMode(Ft,e)}catch{}}var Ct=Math.clz32?Math.clz32:Fr,Vr=Math.log,Jr=Math.LN2;function Fr(e){return e>>>=0,e===0?32:31-(Vr(e)/Jr|0)|0}var Dt=256,Oe=262144,_e=4194304;function da(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function fe(e,t,a){var l=e.pendingLanes;if(l===0)return 0;var i=0,r=e.suspendedLanes,d=e.pingedLanes;e=e.warmLanes;var m=l&134217727;return m!==0?(l=m&~r,l!==0?i=da(l):(d&=m,d!==0?i=da(d):a||(a=m&~e,a!==0&&(i=da(a))))):(m=l&~r,m!==0?i=da(m):d!==0?i=da(d):a||(a=l&~e,a!==0&&(i=da(a)))),i===0?0:t!==0&&t!==i&&(t&r)===0&&(r=i&-i,a=t&-t,r>=a||r===32&&(a&4194048)!==0)?t:i}function al(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Fn(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function as(){var e=_e;return _e<<=1,(_e&62914560)===0&&(_e=4194304),e}function Ea(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function fa(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Wr(e,t,a,l,i,r){var d=e.pendingLanes;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=a,e.entangledLanes&=a,e.errorRecoveryDisabledLanes&=a,e.shellSuspendCounter=0;var m=e.entanglements,_=e.expirationTimes,k=e.hiddenUpdates;for(a=d&~a;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var ps=/[\n"\\]/g;function dt(e){return e.replace(ps,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function ti(e,t,a,l,i,r,d,m){e.name="",d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"?e.type=d:e.removeAttribute("type"),t!=null?d==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Mt(t)):e.value!==""+Mt(t)&&(e.value=""+Mt(t)):d!=="submit"&&d!=="reset"||e.removeAttribute("value"),t!=null?ai(e,d,Mt(t)):a!=null?ai(e,d,Mt(a)):l!=null&&e.removeAttribute("value"),i==null&&r!=null&&(e.defaultChecked=!!r),i!=null&&(e.checked=i&&typeof i!="function"&&typeof i!="symbol"),m!=null&&typeof m!="function"&&typeof m!="symbol"&&typeof m!="boolean"?e.name=""+Mt(m):e.removeAttribute("name")}function gs(e,t,a,l,i,r,d,m){if(r!=null&&typeof r!="function"&&typeof r!="symbol"&&typeof r!="boolean"&&(e.type=r),t!=null||a!=null){if(!(r!=="submit"&&r!=="reset"||t!=null)){un(e);return}a=a!=null?""+Mt(a):"",t=t!=null?""+Mt(t):a,m||t===e.value||(e.value=t),e.defaultValue=t}l=l??i,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=m?e.checked:!!l,e.defaultChecked=!!l,d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"&&(e.name=d),un(e)}function ai(e,t,a){t==="number"&&sl(e.ownerDocument)===e||e.defaultValue===""+a||(e.defaultValue=""+a)}function Oa(e,t,a,l){if(e=e.options,t){t={};for(var i=0;i"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),lc=!1;if(Ua)try{var ni={};Object.defineProperty(ni,"passive",{get:function(){lc=!0}}),window.addEventListener("test",ni,ni),window.removeEventListener("test",ni,ni)}catch{lc=!1}var rl=null,nc=null,ys=null;function Po(){if(ys)return ys;var e,t=nc,a=t.length,l,i="value"in rl?rl.value:rl.textContent,r=i.length;for(e=0;e=ri),id=" ",sd=!1;function rd(e,t){switch(e){case"keyup":return Gg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function cd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var fn=!1;function Qg(e,t){switch(e){case"compositionend":return cd(t);case"keypress":return t.which!==32?null:(sd=!0,id);case"textInput":return e=t.data,e===id&&sd?null:e;default:return null}}function Kg(e,t){if(fn)return e==="compositionend"||!uc&&rd(e,t)?(e=Po(),ys=nc=rl=null,fn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:a,offset:t-e};e=l}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=gd(a)}}function vd(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?vd(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function bd(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=sl(e.document);t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=sl(e.document)}return t}function fc(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var ey=Ua&&"documentMode"in document&&11>=document.documentMode,mn=null,mc=null,di=null,hc=!1;function _d(e,t,a){var l=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;hc||mn==null||mn!==sl(l)||(l=mn,"selectionStart"in l&&fc(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),di&&oi(di,l)||(di=l,l=or(mc,"onSelect"),0>=d,i-=d,Ta=1<<32-Ct(t)+i|a<ve?(Ee=ae,ae=null):Ee=ae.sibling;var Ae=D(N,ae,C[ve],L);if(Ae===null){ae===null&&(ae=Ee);break}e&&ae&&Ae.alternate===null&&t(N,ae),E=r(Ae,E,ve),ke===null?ne=Ae:ke.sibling=Ae,ke=Ae,ae=Ee}if(ve===C.length)return a(N,ae),we&&Ba(N,ve),ne;if(ae===null){for(;veve?(Ee=ae,ae=null):Ee=ae.sibling;var kl=D(N,ae,Ae.value,L);if(kl===null){ae===null&&(ae=Ee);break}e&&ae&&kl.alternate===null&&t(N,ae),E=r(kl,E,ve),ke===null?ne=kl:ke.sibling=kl,ke=kl,ae=Ee}if(Ae.done)return a(N,ae),we&&Ba(N,ve),ne;if(ae===null){for(;!Ae.done;ve++,Ae=C.next())Ae=U(N,Ae.value,L),Ae!==null&&(E=r(Ae,E,ve),ke===null?ne=Ae:ke.sibling=Ae,ke=Ae);return we&&Ba(N,ve),ne}for(ae=l(ae);!Ae.done;ve++,Ae=C.next())Ae=z(ae,N,ve,Ae.value,L),Ae!==null&&(e&&Ae.alternate!==null&&ae.delete(Ae.key===null?ve:Ae.key),E=r(Ae,E,ve),ke===null?ne=Ae:ke.sibling=Ae,ke=Ae);return e&&ae.forEach(function(_v){return t(N,_v)}),we&&Ba(N,ve),ne}function qe(N,E,C,L){if(typeof C=="object"&&C!==null&&C.type===$&&C.key===null&&(C=C.props.children),typeof C=="object"&&C!==null){switch(C.$$typeof){case B:e:{for(var ne=C.key;E!==null;){if(E.key===ne){if(ne=C.type,ne===$){if(E.tag===7){a(N,E.sibling),L=i(E,C.props.children),L.return=N,N=L;break e}}else if(E.elementType===ne||typeof ne=="object"&&ne!==null&&ne.$$typeof===ee&&Ql(ne)===E.type){a(N,E.sibling),L=i(E,C.props),yi(L,C),L.return=N,N=L;break e}a(N,E);break}else t(N,E);E=E.sibling}C.type===$?(L=ql(C.props.children,N.mode,L,C.key),L.return=N,N=L):(L=Ts(C.type,C.key,C.props,null,N.mode,L),yi(L,C),L.return=N,N=L)}return d(N);case M:e:{for(ne=C.key;E!==null;){if(E.key===ne)if(E.tag===4&&E.stateNode.containerInfo===C.containerInfo&&E.stateNode.implementation===C.implementation){a(N,E.sibling),L=i(E,C.children||[]),L.return=N,N=L;break e}else{a(N,E);break}else t(N,E);E=E.sibling}L=Sc(C,N.mode,L),L.return=N,N=L}return d(N);case ee:return C=Ql(C),qe(N,E,C,L)}if(H(C))return P(N,E,C,L);if(oe(C)){if(ne=oe(C),typeof ne!="function")throw Error(u(150));return C=ne.call(C),ce(N,E,C,L)}if(typeof C.then=="function")return qe(N,E,Rs(C),L);if(C.$$typeof===J)return qe(N,E,As(N,C),L);Os(N,C)}return typeof C=="string"&&C!==""||typeof C=="number"||typeof C=="bigint"?(C=""+C,E!==null&&E.tag===6?(a(N,E.sibling),L=i(E,C),L.return=N,N=L):(a(N,E),L=_c(C,N.mode,L),L.return=N,N=L),d(N)):a(N,E)}return function(N,E,C,L){try{gi=0;var ne=qe(N,E,C,L);return En=null,ne}catch(ae){if(ae===jn||ae===zs)throw ae;var ke=Gt(29,ae,null,N.mode);return ke.lanes=L,ke.return=N,ke}finally{}}}var Zl=Gd(!0),Xd=Gd(!1),fl=!1;function Mc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Rc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function ml(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function hl(e,t,a){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(Me&2)!==0){var i=l.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),l.pending=t,t=Ns(e),Td(e,null,a),t}return ws(e,l,t,a),Ns(e)}function vi(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,kt(e,a)}}function Oc(e,t){var a=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,a===l)){var i=null,r=null;if(a=a.firstBaseUpdate,a!==null){do{var d={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};r===null?i=r=d:r=r.next=d,a=a.next}while(a!==null);r===null?i=r=t:r=r.next=t}else i=r=t;a={baseState:l.baseState,firstBaseUpdate:i,lastBaseUpdate:r,shared:l.shared,callbacks:l.callbacks},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}var Lc=!1;function bi(){if(Lc){var e=xn;if(e!==null)throw e}}function _i(e,t,a,l){Lc=!1;var i=e.updateQueue;fl=!1;var r=i.firstBaseUpdate,d=i.lastBaseUpdate,m=i.shared.pending;if(m!==null){i.shared.pending=null;var _=m,k=_.next;_.next=null,d===null?r=k:d.next=k,d=_;var O=e.alternate;O!==null&&(O=O.updateQueue,m=O.lastBaseUpdate,m!==d&&(m===null?O.firstBaseUpdate=k:m.next=k,O.lastBaseUpdate=_))}if(r!==null){var U=i.baseState;d=0,O=k=_=null,m=r;do{var D=m.lane&-536870913,z=D!==m.lane;if(z?(je&D)===D:(l&D)===D){D!==0&&D===Sn&&(Lc=!0),O!==null&&(O=O.next={lane:0,tag:m.tag,payload:m.payload,callback:null,next:null});e:{var P=e,ce=m;D=t;var qe=a;switch(ce.tag){case 1:if(P=ce.payload,typeof P=="function"){U=P.call(qe,U,D);break e}U=P;break e;case 3:P.flags=P.flags&-65537|128;case 0:if(P=ce.payload,D=typeof P=="function"?P.call(qe,U,D):P,D==null)break e;U=S({},U,D);break e;case 2:fl=!0}}D=m.callback,D!==null&&(e.flags|=64,z&&(e.flags|=8192),z=i.callbacks,z===null?i.callbacks=[D]:z.push(D))}else z={lane:D,tag:m.tag,payload:m.payload,callback:m.callback,next:null},O===null?(k=O=z,_=U):O=O.next=z,d|=D;if(m=m.next,m===null){if(m=i.shared.pending,m===null)break;z=m,m=z.next,z.next=null,i.lastBaseUpdate=z,i.shared.pending=null}}while(!0);O===null&&(_=U),i.baseState=_,i.firstBaseUpdate=k,i.lastBaseUpdate=O,r===null&&(i.shared.lanes=0),bl|=d,e.lanes=d,e.memoizedState=U}}function Qd(e,t){if(typeof e!="function")throw Error(u(191,e));e.call(t)}function Kd(e,t){var a=e.callbacks;if(a!==null)for(e.callbacks=null,e=0;er?r:8;var d=A.T,m={};A.T=m,tu(e,!1,t,a);try{var _=i(),k=A.S;if(k!==null&&k(m,_),_!==null&&typeof _=="object"&&typeof _.then=="function"){var O=uy(_,l);ji(e,t,O,Vt(e))}else ji(e,t,l,Vt(e))}catch(U){ji(e,t,{then:function(){},status:"rejected",reason:U},Vt())}finally{Y.p=r,d!==null&&m.types!==null&&(d.types=m.types),A.T=d}}function py(){}function Pc(e,t,a,l){if(e.tag!==5)throw Error(u(476));var i=wf(e).queue;Ef(e,i,t,te,a===null?py:function(){return Nf(e),a(l)})}function wf(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:te,baseState:te,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ga,lastRenderedState:te},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ga,lastRenderedState:a},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Nf(e){var t=wf(e);t.next===null&&(t=e.alternate.memoizedState),ji(e,t.next.queue,{},Vt())}function eu(){return yt(qi)}function Tf(){return tt().memoizedState}function Cf(){return tt().memoizedState}function gy(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var a=Vt();e=ml(a);var l=hl(t,e,a);l!==null&&(Bt(l,t,a),vi(l,t,a)),t={cache:kc()},e.payload=t;return}t=t.return}}function yy(e,t,a){var l=Vt();a={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Qs(e)?Af(t,a):(a=vc(e,t,a,l),a!==null&&(Bt(a,e,l),Df(a,t,l)))}function kf(e,t,a){var l=Vt();ji(e,t,a,l)}function ji(e,t,a,l){var i={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(Qs(e))Af(t,i);else{var r=e.alternate;if(e.lanes===0&&(r===null||r.lanes===0)&&(r=t.lastRenderedReducer,r!==null))try{var d=t.lastRenderedState,m=r(d,a);if(i.hasEagerState=!0,i.eagerState=m,Yt(m,d))return ws(e,t,i,0),$e===null&&Es(),!1}catch{}finally{}if(a=vc(e,t,i,l),a!==null)return Bt(a,e,l),Df(a,t,l),!0}return!1}function tu(e,t,a,l){if(l={lane:2,revertLane:Mu(),gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},Qs(e)){if(t)throw Error(u(479))}else t=vc(e,a,l,2),t!==null&&Bt(t,e,2)}function Qs(e){var t=e.alternate;return e===ye||t!==null&&t===ye}function Af(e,t){Nn=Hs=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function Df(e,t,a){if((a&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,kt(e,a)}}var Ei={readContext:yt,use:$s,useCallback:Ie,useContext:Ie,useEffect:Ie,useImperativeHandle:Ie,useLayoutEffect:Ie,useInsertionEffect:Ie,useMemo:Ie,useReducer:Ie,useRef:Ie,useState:Ie,useDebugValue:Ie,useDeferredValue:Ie,useTransition:Ie,useSyncExternalStore:Ie,useId:Ie,useHostTransitionStatus:Ie,useFormState:Ie,useActionState:Ie,useOptimistic:Ie,useMemoCache:Ie,useCacheRefresh:Ie};Ei.useEffectEvent=Ie;var zf={readContext:yt,use:$s,useCallback:function(e,t){return At().memoizedState=[e,t===void 0?null:t],e},useContext:yt,useEffect:pf,useImperativeHandle:function(e,t,a){a=a!=null?a.concat([e]):null,Gs(4194308,4,bf.bind(null,t,e),a)},useLayoutEffect:function(e,t){return Gs(4194308,4,e,t)},useInsertionEffect:function(e,t){Gs(4,2,e,t)},useMemo:function(e,t){var a=At();t=t===void 0?null:t;var l=e();if(Vl){Wt(!0);try{e()}finally{Wt(!1)}}return a.memoizedState=[l,t],l},useReducer:function(e,t,a){var l=At();if(a!==void 0){var i=a(t);if(Vl){Wt(!0);try{a(t)}finally{Wt(!1)}}}else i=t;return l.memoizedState=l.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},l.queue=e,e=e.dispatch=yy.bind(null,ye,e),[l.memoizedState,e]},useRef:function(e){var t=At();return e={current:e},t.memoizedState=e},useState:function(e){e=Vc(e);var t=e.queue,a=kf.bind(null,ye,t);return t.dispatch=a,[e.memoizedState,a]},useDebugValue:Wc,useDeferredValue:function(e,t){var a=At();return Ic(a,e,t)},useTransition:function(){var e=Vc(!1);return e=Ef.bind(null,ye,e.queue,!0,!1),At().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,a){var l=ye,i=At();if(we){if(a===void 0)throw Error(u(407));a=a()}else{if(a=t(),$e===null)throw Error(u(349));(je&127)!==0||Id(l,t,a)}i.memoizedState=a;var r={value:a,getSnapshot:t};return i.queue=r,pf(ef.bind(null,l,r,e),[e]),l.flags|=2048,Cn(9,{destroy:void 0},Pd.bind(null,l,r,a,t),null),a},useId:function(){var e=At(),t=$e.identifierPrefix;if(we){var a=Ca,l=Ta;a=(l&~(1<<32-Ct(l)-1)).toString(32)+a,t="_"+t+"R_"+a,a=Bs++,0<\/script>",r=r.removeChild(r.firstChild);break;case"select":r=typeof l.is=="string"?d.createElement("select",{is:l.is}):d.createElement("select"),l.multiple?r.multiple=!0:l.size&&(r.size=l.size);break;default:r=typeof l.is=="string"?d.createElement(i,{is:l.is}):d.createElement(i)}}r[nt]=t,r[jt]=l;e:for(d=t.child;d!==null;){if(d.tag===5||d.tag===6)r.appendChild(d.stateNode);else if(d.tag!==4&&d.tag!==27&&d.child!==null){d.child.return=d,d=d.child;continue}if(d===t)break e;for(;d.sibling===null;){if(d.return===null||d.return===t)break e;d=d.return}d.sibling.return=d.return,d=d.sibling}t.stateNode=r;e:switch(bt(r,i,l),i){case"button":case"input":case"select":case"textarea":l=!!l.autoFocus;break e;case"img":l=!0;break e;default:l=!1}l&&Qa(t)}}return Ge(t),pu(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,a),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==l&&Qa(t);else{if(typeof l!="string"&&t.stateNode===null)throw Error(u(166));if(e=ge.current,bn(t)){if(e=t.stateNode,a=t.memoizedProps,l=null,i=gt,i!==null)switch(i.tag){case 27:case 5:l=i.memoizedProps}e[nt]=t,e=!!(e.nodeValue===a||l!==null&&l.suppressHydrationWarning===!0||Wm(e.nodeValue,a)),e||ol(t,!0)}else e=dr(e).createTextNode(l),e[nt]=t,t.stateNode=e}return Ge(t),null;case 31:if(a=t.memoizedState,e===null||e.memoizedState!==null){if(l=bn(t),a!==null){if(e===null){if(!l)throw Error(u(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(u(557));e[nt]=t}else $l(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ge(t),e=!1}else a=wc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),e=!0;if(!e)return t.flags&256?(Qt(t),t):(Qt(t),null);if((t.flags&128)!==0)throw Error(u(558))}return Ge(t),null;case 13:if(l=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=bn(t),l!==null&&l.dehydrated!==null){if(e===null){if(!i)throw Error(u(318));if(i=t.memoizedState,i=i!==null?i.dehydrated:null,!i)throw Error(u(317));i[nt]=t}else $l(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ge(t),i=!1}else i=wc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(Qt(t),t):(Qt(t),null)}return Qt(t),(t.flags&128)!==0?(t.lanes=a,t):(a=l!==null,e=e!==null&&e.memoizedState!==null,a&&(l=t.child,i=null,l.alternate!==null&&l.alternate.memoizedState!==null&&l.alternate.memoizedState.cachePool!==null&&(i=l.alternate.memoizedState.cachePool.pool),r=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(r=l.memoizedState.cachePool.pool),r!==i&&(l.flags|=2048)),a!==e&&a&&(t.child.flags|=8192),Fs(t,t.updateQueue),Ge(t),null);case 4:return G(),e===null&&Uu(t.stateNode.containerInfo),Ge(t),null;case 10:return $a(t.type),Ge(t),null;case 19:if(R(et),l=t.memoizedState,l===null)return Ge(t),null;if(i=(t.flags&128)!==0,r=l.rendering,r===null)if(i)Ni(l,!1);else{if(Pe!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(r=Us(e),r!==null){for(t.flags|=128,Ni(l,!1),e=r.updateQueue,t.updateQueue=e,Fs(t,e),t.subtreeFlags=0,e=a,a=t.child;a!==null;)Cd(a,e),a=a.sibling;return K(et,et.current&1|2),we&&Ba(t,l.treeForkCount),t.child}e=e.sibling}l.tail!==null&&Ve()>tr&&(t.flags|=128,i=!0,Ni(l,!1),t.lanes=4194304)}else{if(!i)if(e=Us(r),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,Fs(t,e),Ni(l,!0),l.tail===null&&l.tailMode==="hidden"&&!r.alternate&&!we)return Ge(t),null}else 2*Ve()-l.renderingStartTime>tr&&a!==536870912&&(t.flags|=128,i=!0,Ni(l,!1),t.lanes=4194304);l.isBackwards?(r.sibling=t.child,t.child=r):(e=l.last,e!==null?e.sibling=r:t.child=r,l.last=r)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=Ve(),e.sibling=null,a=et.current,K(et,i?a&1|2:a&1),we&&Ba(t,l.treeForkCount),e):(Ge(t),null);case 22:case 23:return Qt(t),Hc(),l=t.memoizedState!==null,e!==null?e.memoizedState!==null!==l&&(t.flags|=8192):l&&(t.flags|=8192),l?(a&536870912)!==0&&(t.flags&128)===0&&(Ge(t),t.subtreeFlags&6&&(t.flags|=8192)):Ge(t),a=t.updateQueue,a!==null&&Fs(t,a.retryQueue),a=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),l=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),l!==a&&(t.flags|=2048),e!==null&&R(Xl),null;case 24:return a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),$a(st),Ge(t),null;case 25:return null;case 30:return null}throw Error(u(156,t.tag))}function xy(e,t){switch(jc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return $a(st),G(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return De(t),null;case 31:if(t.memoizedState!==null){if(Qt(t),t.alternate===null)throw Error(u(340));$l()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Qt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(u(340));$l()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return R(et),null;case 4:return G(),null;case 10:return $a(t.type),null;case 22:case 23:return Qt(t),Hc(),e!==null&&R(Xl),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return $a(st),null;case 25:return null;default:return null}}function am(e,t){switch(jc(t),t.tag){case 3:$a(st),G();break;case 26:case 27:case 5:De(t);break;case 4:G();break;case 31:t.memoizedState!==null&&Qt(t);break;case 13:Qt(t);break;case 19:R(et);break;case 10:$a(t.type);break;case 22:case 23:Qt(t),Hc(),e!==null&&R(Xl);break;case 24:$a(st)}}function Ti(e,t){try{var a=t.updateQueue,l=a!==null?a.lastEffect:null;if(l!==null){var i=l.next;a=i;do{if((a.tag&e)===e){l=void 0;var r=a.create,d=a.inst;l=r(),d.destroy=l}a=a.next}while(a!==i)}}catch(m){Ue(t,t.return,m)}}function yl(e,t,a){try{var l=t.updateQueue,i=l!==null?l.lastEffect:null;if(i!==null){var r=i.next;l=r;do{if((l.tag&e)===e){var d=l.inst,m=d.destroy;if(m!==void 0){d.destroy=void 0,i=t;var _=a,k=m;try{k()}catch(O){Ue(i,_,O)}}}l=l.next}while(l!==r)}}catch(O){Ue(t,t.return,O)}}function lm(e){var t=e.updateQueue;if(t!==null){var a=e.stateNode;try{Kd(t,a)}catch(l){Ue(e,e.return,l)}}}function nm(e,t,a){a.props=Jl(e.type,e.memoizedProps),a.state=e.memoizedState;try{a.componentWillUnmount()}catch(l){Ue(e,t,l)}}function Ci(e,t){try{var a=e.ref;if(a!==null){switch(e.tag){case 26:case 27:case 5:var l=e.stateNode;break;case 30:l=e.stateNode;break;default:l=e.stateNode}typeof a=="function"?e.refCleanup=a(l):a.current=l}}catch(i){Ue(e,t,i)}}function ka(e,t){var a=e.ref,l=e.refCleanup;if(a!==null)if(typeof l=="function")try{l()}catch(i){Ue(e,t,i)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(i){Ue(e,t,i)}else a.current=null}function im(e){var t=e.type,a=e.memoizedProps,l=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&l.focus();break e;case"img":a.src?l.src=a.src:a.srcSet&&(l.srcset=a.srcSet)}}catch(i){Ue(e,e.return,i)}}function gu(e,t,a){try{var l=e.stateNode;Xy(l,e.type,a,t),l[jt]=t}catch(i){Ue(e,e.return,i)}}function sm(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&El(e.type)||e.tag===4}function yu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||sm(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&El(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function vu(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(e,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(e),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=La));else if(l!==4&&(l===27&&El(e.type)&&(a=e.stateNode,t=null),e=e.child,e!==null))for(vu(e,t,a),e=e.sibling;e!==null;)vu(e,t,a),e=e.sibling}function Ws(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(l!==4&&(l===27&&El(e.type)&&(a=e.stateNode),e=e.child,e!==null))for(Ws(e,t,a),e=e.sibling;e!==null;)Ws(e,t,a),e=e.sibling}function rm(e){var t=e.stateNode,a=e.memoizedProps;try{for(var l=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);bt(t,l,a),t[nt]=e,t[jt]=a}catch(r){Ue(e,e.return,r)}}var Ka=!1,ut=!1,bu=!1,cm=typeof WeakSet=="function"?WeakSet:Set,pt=null;function jy(e,t){if(e=e.containerInfo,qu=vr,e=bd(e),fc(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var l=a.getSelection&&a.getSelection();if(l&&l.rangeCount!==0){a=l.anchorNode;var i=l.anchorOffset,r=l.focusNode;l=l.focusOffset;try{a.nodeType,r.nodeType}catch{a=null;break e}var d=0,m=-1,_=-1,k=0,O=0,U=e,D=null;t:for(;;){for(var z;U!==a||i!==0&&U.nodeType!==3||(m=d+i),U!==r||l!==0&&U.nodeType!==3||(_=d+l),U.nodeType===3&&(d+=U.nodeValue.length),(z=U.firstChild)!==null;)D=U,U=z;for(;;){if(U===e)break t;if(D===a&&++k===i&&(m=d),D===r&&++O===l&&(_=d),(z=U.nextSibling)!==null)break;U=D,D=U.parentNode}U=z}a=m===-1||_===-1?null:{start:m,end:_}}else a=null}a=a||{start:0,end:0}}else a=null;for($u={focusedElem:e,selectionRange:a},vr=!1,pt=t;pt!==null;)if(t=pt,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,pt=e;else for(;pt!==null;){switch(t=pt,r=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(a=0;a title"))),bt(r,l,a),r[nt]=e,it(r),l=r;break e;case"link":var d=hh("link","href",i).get(l+(a.href||""));if(d){for(var m=0;mqe&&(d=qe,qe=ce,ce=d);var N=yd(m,ce),E=yd(m,qe);if(N&&E&&(z.rangeCount!==1||z.anchorNode!==N.node||z.anchorOffset!==N.offset||z.focusNode!==E.node||z.focusOffset!==E.offset)){var C=U.createRange();C.setStart(N.node,N.offset),z.removeAllRanges(),ce>qe?(z.addRange(C),z.extend(E.node,E.offset)):(C.setEnd(E.node,E.offset),z.addRange(C))}}}}for(U=[],z=m;z=z.parentNode;)z.nodeType===1&&U.push({element:z,left:z.scrollLeft,top:z.scrollTop});for(typeof m.focus=="function"&&m.focus(),m=0;ma?32:a,A.T=null,a=Nu,Nu=null;var r=Sl,d=Wa;if(ft=0,Mn=Sl=null,Wa=0,(Me&6)!==0)throw Error(u(331));var m=Me;if(Me|=4,bm(r.current),gm(r,r.current,d,a),Me=m,Ri(0,!1),Tt&&typeof Tt.onPostCommitFiberRoot=="function")try{Tt.onPostCommitFiberRoot(Ft,r)}catch{}return!0}finally{Y.p=i,A.T=l,Um(e,t)}}function Bm(e,t,a){t=ea(a,t),t=iu(e.stateNode,t,2),e=hl(e,t,2),e!==null&&(fa(e,2),Aa(e))}function Ue(e,t,a){if(e.tag===3)Bm(e,e,a);else for(;t!==null;){if(t.tag===3){Bm(t,e,a);break}else if(t.tag===1){var l=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof l.componentDidCatch=="function"&&(_l===null||!_l.has(l))){e=ea(a,e),a=qf(2),l=hl(t,a,2),l!==null&&($f(a,l,t,e),fa(l,2),Aa(l));break}}t=t.return}}function Au(e,t,a){var l=e.pingCache;if(l===null){l=e.pingCache=new Ny;var i=new Set;l.set(t,i)}else i=l.get(t),i===void 0&&(i=new Set,l.set(t,i));i.has(a)||(xu=!0,i.add(a),e=Dy.bind(null,e,t,a),t.then(e,e))}function Dy(e,t,a){var l=e.pingCache;l!==null&&l.delete(t),e.pingedLanes|=e.suspendedLanes&a,e.warmLanes&=~a,$e===e&&(je&a)===a&&(Pe===4||Pe===3&&(je&62914560)===je&&300>Ve()-er?(Me&2)===0&&Rn(e,0):ju|=a,zn===je&&(zn=0)),Aa(e)}function qm(e,t){t===0&&(t=as()),e=Bl(e,t),e!==null&&(fa(e,t),Aa(e))}function zy(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),qm(e,a)}function My(e,t){var a=0;switch(e.tag){case 31:case 13:var l=e.stateNode,i=e.memoizedState;i!==null&&(a=i.retryLane);break;case 19:l=e.stateNode;break;case 22:l=e.stateNode._retryCache;break;default:throw Error(u(314))}l!==null&&l.delete(t),qm(e,a)}function Ry(e,t){return St(e,t)}var rr=null,Ln=null,Du=!1,cr=!1,zu=!1,jl=0;function Aa(e){e!==Ln&&e.next===null&&(Ln===null?rr=Ln=e:Ln=Ln.next=e),cr=!0,Du||(Du=!0,Ly())}function Ri(e,t){if(!zu&&cr){zu=!0;do for(var a=!1,l=rr;l!==null;){if(e!==0){var i=l.pendingLanes;if(i===0)var r=0;else{var d=l.suspendedLanes,m=l.pingedLanes;r=(1<<31-Ct(42|e)+1)-1,r&=i&~(d&~m),r=r&201326741?r&201326741|1:r?r|2:0}r!==0&&(a=!0,Xm(l,r))}else r=je,r=fe(l,l===$e?r:0,l.cancelPendingCommit!==null||l.timeoutHandle!==-1),(r&3)===0||al(l,r)||(a=!0,Xm(l,r));l=l.next}while(a);zu=!1}}function Oy(){$m()}function $m(){cr=Du=!1;var e=0;jl!==0&&Ky()&&(e=jl);for(var t=Ve(),a=null,l=rr;l!==null;){var i=l.next,r=Ym(l,t);r===0?(l.next=null,a===null?rr=i:a.next=i,i===null&&(Ln=a)):(a=l,(e!==0||(r&3)!==0)&&(cr=!0)),l=i}ft!==0&&ft!==5||Ri(e),jl!==0&&(jl=0)}function Ym(e,t){for(var a=e.suspendedLanes,l=e.pingedLanes,i=e.expirationTimes,r=e.pendingLanes&-62914561;0m)break;var O=_.transferSize,U=_.initiatorType;O&&Im(U)&&(_=_.responseEnd,d+=O*(_"u"?null:document;function oh(e,t,a){var l=Un;if(l&&typeof t=="string"&&t){var i=dt(t);i='link[rel="'+e+'"][href="'+i+'"]',typeof a=="string"&&(i+='[crossorigin="'+a+'"]'),uh.has(i)||(uh.add(i),e={rel:e,crossOrigin:a,href:t},l.querySelector(i)===null&&(t=l.createElement("link"),bt(t,"link",e),it(t),l.head.appendChild(t)))}}function tv(e){Ia.D(e),oh("dns-prefetch",e,null)}function av(e,t){Ia.C(e,t),oh("preconnect",e,t)}function lv(e,t,a){Ia.L(e,t,a);var l=Un;if(l&&e&&t){var i='link[rel="preload"][as="'+dt(t)+'"]';t==="image"&&a&&a.imageSrcSet?(i+='[imagesrcset="'+dt(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(i+='[imagesizes="'+dt(a.imageSizes)+'"]')):i+='[href="'+dt(e)+'"]';var r=i;switch(t){case"style":r=Hn(e);break;case"script":r=Bn(e)}sa.has(r)||(e=S({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:e,as:t},a),sa.set(r,e),l.querySelector(i)!==null||t==="style"&&l.querySelector(Hi(r))||t==="script"&&l.querySelector(Bi(r))||(t=l.createElement("link"),bt(t,"link",e),it(t),l.head.appendChild(t)))}}function nv(e,t){Ia.m(e,t);var a=Un;if(a&&e){var l=t&&typeof t.as=="string"?t.as:"script",i='link[rel="modulepreload"][as="'+dt(l)+'"][href="'+dt(e)+'"]',r=i;switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":r=Bn(e)}if(!sa.has(r)&&(e=S({rel:"modulepreload",href:e},t),sa.set(r,e),a.querySelector(i)===null)){switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(Bi(r)))return}l=a.createElement("link"),bt(l,"link",e),it(l),a.head.appendChild(l)}}}function iv(e,t,a){Ia.S(e,t,a);var l=Un;if(l&&e){var i=il(l).hoistableStyles,r=Hn(e);t=t||"default";var d=i.get(r);if(!d){var m={loading:0,preload:null};if(d=l.querySelector(Hi(r)))m.loading=5;else{e=S({rel:"stylesheet",href:e,"data-precedence":t},a),(a=sa.get(r))&&Vu(e,a);var _=d=l.createElement("link");it(_),bt(_,"link",e),_._p=new Promise(function(k,O){_.onload=k,_.onerror=O}),_.addEventListener("load",function(){m.loading|=1}),_.addEventListener("error",function(){m.loading|=2}),m.loading|=4,mr(d,t,l)}d={type:"stylesheet",instance:d,count:1,state:m},i.set(r,d)}}}function sv(e,t){Ia.X(e,t);var a=Un;if(a&&e){var l=il(a).hoistableScripts,i=Bn(e),r=l.get(i);r||(r=a.querySelector(Bi(i)),r||(e=S({src:e,async:!0},t),(t=sa.get(i))&&Ju(e,t),r=a.createElement("script"),it(r),bt(r,"link",e),a.head.appendChild(r)),r={type:"script",instance:r,count:1,state:null},l.set(i,r))}}function rv(e,t){Ia.M(e,t);var a=Un;if(a&&e){var l=il(a).hoistableScripts,i=Bn(e),r=l.get(i);r||(r=a.querySelector(Bi(i)),r||(e=S({src:e,async:!0,type:"module"},t),(t=sa.get(i))&&Ju(e,t),r=a.createElement("script"),it(r),bt(r,"link",e),a.head.appendChild(r)),r={type:"script",instance:r,count:1,state:null},l.set(i,r))}}function dh(e,t,a,l){var i=(i=ge.current)?fr(i):null;if(!i)throw Error(u(446));switch(e){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Hn(a.href),a=il(i).hoistableStyles,l=a.get(t),l||(l={type:"style",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){e=Hn(a.href);var r=il(i).hoistableStyles,d=r.get(e);if(d||(i=i.ownerDocument||i,d={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},r.set(e,d),(r=i.querySelector(Hi(e)))&&!r._p&&(d.instance=r,d.state.loading=5),sa.has(e)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},sa.set(e,a),r||cv(i,e,a,d.state))),t&&l===null)throw Error(u(528,""));return d}if(t&&l!==null)throw Error(u(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Bn(a),a=il(i).hoistableScripts,l=a.get(t),l||(l={type:"script",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};default:throw Error(u(444,e))}}function Hn(e){return'href="'+dt(e)+'"'}function Hi(e){return'link[rel="stylesheet"]['+e+"]"}function fh(e){return S({},e,{"data-precedence":e.precedence,precedence:null})}function cv(e,t,a,l){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?l.loading=1:(t=e.createElement("link"),l.preload=t,t.addEventListener("load",function(){return l.loading|=1}),t.addEventListener("error",function(){return l.loading|=2}),bt(t,"link",a),it(t),e.head.appendChild(t))}function Bn(e){return'[src="'+dt(e)+'"]'}function Bi(e){return"script[async]"+e}function mh(e,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var l=e.querySelector('style[data-href~="'+dt(a.href)+'"]');if(l)return t.instance=l,it(l),l;var i=S({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return l=(e.ownerDocument||e).createElement("style"),it(l),bt(l,"style",i),mr(l,a.precedence,e),t.instance=l;case"stylesheet":i=Hn(a.href);var r=e.querySelector(Hi(i));if(r)return t.state.loading|=4,t.instance=r,it(r),r;l=fh(a),(i=sa.get(i))&&Vu(l,i),r=(e.ownerDocument||e).createElement("link"),it(r);var d=r;return d._p=new Promise(function(m,_){d.onload=m,d.onerror=_}),bt(r,"link",l),t.state.loading|=4,mr(r,a.precedence,e),t.instance=r;case"script":return r=Bn(a.src),(i=e.querySelector(Bi(r)))?(t.instance=i,it(i),i):(l=a,(i=sa.get(r))&&(l=S({},a),Ju(l,i)),e=e.ownerDocument||e,i=e.createElement("script"),it(i),bt(i,"link",l),e.head.appendChild(i),t.instance=i);case"void":return null;default:throw Error(u(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(l=t.instance,t.state.loading|=4,mr(l,a.precedence,e));return t.instance}function mr(e,t,a){for(var l=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),i=l.length?l[l.length-1]:null,r=i,d=0;d title"):null)}function uv(e,t,a){if(a===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function gh(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function ov(e,t,a,l){if(a.type==="stylesheet"&&(typeof l.media!="string"||matchMedia(l.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var i=Hn(l.href),r=t.querySelector(Hi(i));if(r){t=r._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=pr.bind(e),t.then(e,e)),a.state.loading|=4,a.instance=r,it(r);return}r=t.ownerDocument||t,l=fh(l),(i=sa.get(i))&&Vu(l,i),r=r.createElement("link"),it(r);var d=r;d._p=new Promise(function(m,_){d.onload=m,d.onerror=_}),bt(r,"link",l),a.instance=r}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(e.count++,a=pr.bind(e),t.addEventListener("load",a),t.addEventListener("error",a))}}var Fu=0;function dv(e,t){return e.stylesheets&&e.count===0&&yr(e,e.stylesheets),0Fu?50:800)+t);return e.unsuspend=a,function(){e.unsuspend=null,clearTimeout(l),clearTimeout(i)}}:null}function pr(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)yr(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var gr=null;function yr(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,gr=new Map,t.forEach(fv,e),gr=null,pr.call(e))}function fv(e,t){if(!(t.state.loading&4)){var a=gr.get(e);if(a)var l=a.get(null);else{a=new Map,gr.set(e,a);for(var i=e.querySelectorAll("link[data-precedence],style[data-precedence]"),r=0;r"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(s){console.error(s)}}return n(),io.exports=Av(),io.exports}var zv=Dv();/** + * react-router v7.17.0 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */var qh="popstate";function $h(n){return typeof n=="object"&&n!=null&&"pathname"in n&&"search"in n&&"hash"in n&&"state"in n&&"key"in n}function Mv(n={}){function s(f,h){let{pathname:p="/",search:j="",hash:g=""}=an(f.location.hash.substring(1));return!p.startsWith("/")&&!p.startsWith(".")&&(p="/"+p),No("",{pathname:p,search:j,hash:g},h.state&&h.state.usr||null,h.state&&h.state.key||"default")}function o(f,h){let p=f.document.querySelector("base"),j="";if(p&&p.getAttribute("href")){let g=f.location.href,y=g.indexOf("#");j=y===-1?g:g.slice(0,y)}return j+"#"+(typeof h=="string"?h:Ji(h))}function u(f,h){ca(f.pathname.charAt(0)==="/",`relative pathnames are not supported in hash history.push(${JSON.stringify(h)})`)}return Ov(s,o,u,n)}function Ke(n,s){if(n===!1||n===null||typeof n>"u")throw new Error(s)}function ca(n,s){if(!n){typeof console<"u"&&console.warn(s);try{throw new Error(s)}catch{}}}function Rv(){return Math.random().toString(36).substring(2,10)}function Yh(n,s){return{usr:n.state,key:n.key,idx:s,masked:n.mask?{pathname:n.pathname,search:n.search,hash:n.hash}:void 0}}function No(n,s,o=null,u,f){return{pathname:typeof n=="string"?n:n.pathname,search:"",hash:"",...typeof s=="string"?an(s):s,state:o,key:s&&s.key||u||Rv(),mask:f}}function Ji({pathname:n="/",search:s="",hash:o=""}){return s&&s!=="?"&&(n+=s.charAt(0)==="?"?s:"?"+s),o&&o!=="#"&&(n+=o.charAt(0)==="#"?o:"#"+o),n}function an(n){let s={};if(n){let o=n.indexOf("#");o>=0&&(s.hash=n.substring(o),n=n.substring(0,o));let u=n.indexOf("?");u>=0&&(s.search=n.substring(u),n=n.substring(0,u)),n&&(s.pathname=n)}return s}function Ov(n,s,o,u={}){let{window:f=document.defaultView,v5Compat:h=!1}=u,p=f.history,j="POP",g=null,y=w();y==null&&(y=0,p.replaceState({...p.state,idx:y},""));function w(){return(p.state||{idx:null}).idx}function S(){j="POP";let q=w(),X=q==null?null:q-y;y=q,g&&g({action:j,location:$.location,delta:X})}function T(q,X){j="PUSH";let I=$h(q)?q:No($.location,q,X);o&&o(I,q),y=w()+1;let J=Yh(I,y),le=$.createHref(I.mask||I);try{p.pushState(J,"",le)}catch(ie){if(ie instanceof DOMException&&ie.name==="DataCloneError")throw ie;f.location.assign(le)}h&&g&&g({action:j,location:$.location,delta:1})}function B(q,X){j="REPLACE";let I=$h(q)?q:No($.location,q,X);o&&o(I,q),y=w();let J=Yh(I,y),le=$.createHref(I.mask||I);p.replaceState(J,"",le),h&&g&&g({action:j,location:$.location,delta:0})}function M(q){return Lv(f,q)}let $={get action(){return j},get location(){return n(f,p)},listen(q){if(g)throw new Error("A history only accepts one active listener");return f.addEventListener(qh,S),g=q,()=>{f.removeEventListener(qh,S),g=null}},createHref(q){return s(f,q)},createURL:M,encodeLocation(q){let X=M(q);return{pathname:X.pathname,search:X.search,hash:X.hash}},push:T,replace:B,go(q){return p.go(q)}};return $}function Lv(n,s,o=!1){let u="http://localhost";n&&(u=n.location.origin!=="null"?n.location.origin:n.location.href),Ke(u,"No window.location.(origin|href) available to create URL");let f=typeof s=="string"?s:Ji(s);return f=f.replace(/ $/,"%20"),!o&&f.startsWith("//")&&(f=u+f),new URL(f,u)}function wp(n,s,o="/"){return Uv(n,s,o,!1)}function Uv(n,s,o,u,f){let h=typeof s=="string"?an(s):s,p=el(h.pathname||"/",o);if(p==null)return null;let j=Hv(n),g=null,y=Fv(p);for(let w=0;g==null&&w{let w={relativePath:y===void 0?p.path||"":y,caseSensitive:p.caseSensitive===!0,childrenIndex:j,route:p};if(w.relativePath.startsWith("/")){if(!w.relativePath.startsWith(u)&&g)return;Ke(w.relativePath.startsWith(u),`Absolute route path "${w.relativePath}" nested under path "${u}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),w.relativePath=w.relativePath.slice(u.length)}let S=ba([u,w.relativePath]),T=o.concat(w);p.children&&p.children.length>0&&(Ke(p.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${S}".`),Np(p.children,s,T,S,g)),!(p.path==null&&!p.index)&&s.push({path:S,score:Kv(S,p.index),routesMeta:T})};return n.forEach((p,j)=>{var g;if(p.path===""||!((g=p.path)!=null&&g.includes("?")))h(p,j);else for(let y of Tp(p.path))h(p,j,!0,y)}),s}function Tp(n){let s=n.split("/");if(s.length===0)return[];let[o,...u]=s,f=o.endsWith("?"),h=o.replace(/\?$/,"");if(u.length===0)return f?[h,""]:[h];let p=Tp(u.join("/")),j=[];return j.push(...p.map(g=>g===""?h:[h,g].join("/"))),f&&j.push(...p),j.map(g=>n.startsWith("/")&&g===""?"/":g)}function Bv(n){n.sort((s,o)=>s.score!==o.score?o.score-s.score:Zv(s.routesMeta.map(u=>u.childrenIndex),o.routesMeta.map(u=>u.childrenIndex)))}var qv=/^:[\w-]+$/,$v=3,Yv=2,Gv=1,Xv=10,Qv=-2,Gh=n=>n==="*";function Kv(n,s){let o=n.split("/"),u=o.length;return o.some(Gh)&&(u+=Qv),s&&(u+=Yv),o.filter(f=>!Gh(f)).reduce((f,h)=>f+(qv.test(h)?$v:h===""?Gv:Xv),u)}function Zv(n,s){return n.length===s.length&&n.slice(0,-1).every((u,f)=>u===s[f])?n[n.length-1]-s[s.length-1]:0}function Vv(n,s,o=!1){let{routesMeta:u}=n,f={},h="/",p=[];for(let j=0;j{if(w==="*"){let M=j[T]||"";p=h.slice(0,h.length-M.length).replace(/(.)\/+$/,"$1")}const B=j[T];return S&&!B?y[w]=void 0:y[w]=(B||"").replace(/%2F/g,"/"),y},{}),pathname:h,pathnameBase:p,pattern:n}}function Jv(n,s=!1,o=!0){ca(n==="*"||!n.endsWith("*")||n.endsWith("/*"),`Route path "${n}" will be treated as if it were "${n.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${n.replace(/\*$/,"/*")}".`);let u=[],f="^"+n.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(p,j,g,y,w)=>{if(u.push({paramName:j,isOptional:g!=null}),g){let S=w.charAt(y+p.length);return S&&S!=="/"?"/([^\\/]*)":"(?:/([^\\/]*))?"}return"/([^\\/]+)"}).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return n.endsWith("*")?(u.push({paramName:"*"}),f+=n==="*"||n==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):o?f+="\\/*$":n!==""&&n!=="/"&&(f+="(?:(?=\\/|$))"),[new RegExp(f,s?void 0:"i"),u]}function Fv(n){try{return n.split("/").map(s=>decodeURIComponent(s).replace(/\//g,"%2F")).join("/")}catch(s){return ca(!1,`The URL path "${n}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${s}).`),n}}function el(n,s){if(s==="/")return n;if(!n.toLowerCase().startsWith(s.toLowerCase()))return null;let o=s.endsWith("/")?s.length-1:s.length,u=n.charAt(o);return u&&u!=="/"?null:n.slice(o)||"/"}var Wv=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function Iv(n,s="/"){let{pathname:o,search:u="",hash:f=""}=typeof n=="string"?an(n):n,h;return o?(o=Cp(o),o.startsWith("/")?h=Xh(o.substring(1),"/"):h=Xh(o,s)):h=s,{pathname:h,search:tb(u),hash:ab(f)}}function Xh(n,s){let o=Rr(s).split("/");return n.split("/").forEach(f=>{f===".."?o.length>1&&o.pop():f!=="."&&o.push(f)}),o.length>1?o.join("/"):"/"}function uo(n,s,o,u){return`Cannot include a '${n}' character in a manually specified \`to.${s}\` field [${JSON.stringify(u)}]. Please separate it out to the \`to.${o}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function Pv(n){return n.filter((s,o)=>o===0||s.route.path&&s.route.path.length>0)}function Ho(n){let s=Pv(n);return s.map((o,u)=>u===s.length-1?o.pathname:o.pathnameBase)}function Br(n,s,o,u=!1){let f;typeof n=="string"?f=an(n):(f={...n},Ke(!f.pathname||!f.pathname.includes("?"),uo("?","pathname","search",f)),Ke(!f.pathname||!f.pathname.includes("#"),uo("#","pathname","hash",f)),Ke(!f.search||!f.search.includes("#"),uo("#","search","hash",f)));let h=n===""||f.pathname==="",p=h?"/":f.pathname,j;if(p==null)j=o;else{let S=s.length-1;if(!u&&p.startsWith("..")){let T=p.split("/");for(;T[0]==="..";)T.shift(),S-=1;f.pathname=T.join("/")}j=S>=0?s[S]:"/"}let g=Iv(f,j),y=p&&p!=="/"&&p.endsWith("/"),w=(h||p===".")&&o.endsWith("/");return!g.pathname.endsWith("/")&&(y||w)&&(g.pathname+="/"),g}var Cp=n=>n.replace(/\/\/+/g,"/"),ba=n=>Cp(n.join("/")),Rr=n=>n.replace(/\/+$/,""),eb=n=>Rr(n).replace(/^\/*/,"/"),tb=n=>!n||n==="?"?"":n.startsWith("?")?n:"?"+n,ab=n=>!n||n==="#"?"":n.startsWith("#")?n:"#"+n,lb=class{constructor(n,s,o,u=!1){this.status=n,this.statusText=s||"",this.internal=u,o instanceof Error?(this.data=o.toString(),this.error=o):this.data=o}};function nb(n){return n!=null&&typeof n.status=="number"&&typeof n.statusText=="string"&&typeof n.internal=="boolean"&&"data"in n}function ib(n){let s=n.map(o=>o.route.path).filter(Boolean);return ba(s)||"/"}var kp=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Ap(n,s){let o=n;if(typeof o!="string"||!Wv.test(o))return{absoluteURL:void 0,isExternal:!1,to:o};let u=o,f=!1;if(kp)try{let h=new URL(window.location.href),p=o.startsWith("//")?new URL(h.protocol+o):new URL(o),j=el(p.pathname,s);p.origin===h.origin&&j!=null?o=j+p.search+p.hash:f=!0}catch{ca(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:u,isExternal:f,to:o}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Dp=["POST","PUT","PATCH","DELETE"];new Set(Dp);var sb=["GET",...Dp];new Set(sb);var Kn=v.createContext(null);Kn.displayName="DataRouter";var qr=v.createContext(null);qr.displayName="DataRouterState";var zp=v.createContext(!1);function rb(){return v.useContext(zp)}var Mp=v.createContext({isTransitioning:!1});Mp.displayName="ViewTransition";var cb=v.createContext(new Map);cb.displayName="Fetchers";var ub=v.createContext(null);ub.displayName="Await";var Jt=v.createContext(null);Jt.displayName="Navigation";var Ii=v.createContext(null);Ii.displayName="Location";var za=v.createContext({outlet:null,matches:[],isDataRoute:!1});za.displayName="Route";var Bo=v.createContext(null);Bo.displayName="RouteError";var Rp="REACT_ROUTER_ERROR",ob="REDIRECT",db="ROUTE_ERROR_RESPONSE";function fb(n){if(n.startsWith(`${Rp}:${ob}:{`))try{let s=JSON.parse(n.slice(28));if(typeof s=="object"&&s&&typeof s.status=="number"&&typeof s.statusText=="string"&&typeof s.location=="string"&&typeof s.reloadDocument=="boolean"&&typeof s.replace=="boolean")return s}catch{}}function mb(n){if(n.startsWith(`${Rp}:${db}:{`))try{let s=JSON.parse(n.slice(40));if(typeof s=="object"&&s&&typeof s.status=="number"&&typeof s.statusText=="string")return new lb(s.status,s.statusText,s.data)}catch{}}function hb(n,{relative:s}={}){Ke(Zn(),"useHref() may be used only in the context of a component.");let{basename:o,navigator:u}=v.useContext(Jt),{hash:f,pathname:h,search:p}=Pi(n,{relative:s}),j=h;return o!=="/"&&(j=h==="/"?o:ba([o,h])),u.createHref({pathname:j,search:p,hash:f})}function Zn(){return v.useContext(Ii)!=null}function _a(){return Ke(Zn(),"useLocation() may be used only in the context of a component."),v.useContext(Ii).location}var Op="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function Lp(n){v.useContext(Jt).static||v.useLayoutEffect(n)}function qo(){let{isDataRoute:n}=v.useContext(za);return n?Tb():pb()}function pb(){Ke(Zn(),"useNavigate() may be used only in the context of a component.");let n=v.useContext(Kn),{basename:s,navigator:o}=v.useContext(Jt),{matches:u}=v.useContext(za),{pathname:f}=_a(),h=JSON.stringify(Ho(u)),p=v.useRef(!1);return Lp(()=>{p.current=!0}),v.useCallback((g,y={})=>{if(ca(p.current,Op),!p.current)return;if(typeof g=="number"){o.go(g);return}let w=Br(g,JSON.parse(h),f,y.relative==="path");n==null&&s!=="/"&&(w.pathname=w.pathname==="/"?s:ba([s,w.pathname])),(y.replace?o.replace:o.push)(w,y.state,y)},[s,o,h,f,n])}v.createContext(null);function Pi(n,{relative:s}={}){let{matches:o}=v.useContext(za),{pathname:u}=_a(),f=JSON.stringify(Ho(o));return v.useMemo(()=>Br(n,JSON.parse(f),u,s==="path"),[n,f,u,s])}function gb(n,s){return Up(n,s)}function Up(n,s,o){var q;Ke(Zn(),"useRoutes() may be used only in the context of a component.");let{navigator:u}=v.useContext(Jt),{matches:f}=v.useContext(za),h=f[f.length-1],p=h?h.params:{},j=h?h.pathname:"/",g=h?h.pathnameBase:"/",y=h&&h.route;{let X=y&&y.path||"";Bp(j,!y||X.endsWith("*")||X.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${j}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. + +Please change the parent to .`)}let w=_a(),S;if(s){let X=typeof s=="string"?an(s):s;Ke(g==="/"||((q=X.pathname)==null?void 0:q.startsWith(g)),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${g}" but pathname "${X.pathname}" was given in the \`location\` prop.`),S=X}else S=w;let T=S.pathname||"/",B=T;if(g!=="/"){let X=g.replace(/^\//,"").split("/");B="/"+T.replace(/^\//,"").split("/").slice(X.length).join("/")}let M=o&&o.state.matches.length?o.state.matches.map(X=>Object.assign(X,{route:o.manifest[X.route.id]||X.route})):wp(n,{pathname:B});ca(y||M!=null,`No routes matched location "${S.pathname}${S.search}${S.hash}" `),ca(M==null||M[M.length-1].route.element!==void 0||M[M.length-1].route.Component!==void 0||M[M.length-1].route.lazy!==void 0,`Matched leaf route at location "${S.pathname}${S.search}${S.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let $=Sb(M&&M.map(X=>Object.assign({},X,{params:Object.assign({},p,X.params),pathname:ba([g,u.encodeLocation?u.encodeLocation(X.pathname.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:X.pathname]),pathnameBase:X.pathnameBase==="/"?g:ba([g,u.encodeLocation?u.encodeLocation(X.pathnameBase.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:X.pathnameBase])})),f,o);return s&&$?v.createElement(Ii.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",mask:void 0,...S},navigationType:"POP"}},$):$}function yb(){let n=Nb(),s=nb(n)?`${n.status} ${n.statusText}`:n instanceof Error?n.message:JSON.stringify(n),o=n instanceof Error?n.stack:null,u="rgba(200,200,200, 0.5)",f={padding:"0.5rem",backgroundColor:u},h={padding:"2px 4px",backgroundColor:u},p=null;return console.error("Error handled by React Router default ErrorBoundary:",n),p=v.createElement(v.Fragment,null,v.createElement("p",null,"💿 Hey developer 👋"),v.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",v.createElement("code",{style:h},"ErrorBoundary")," or"," ",v.createElement("code",{style:h},"errorElement")," prop on your route.")),v.createElement(v.Fragment,null,v.createElement("h2",null,"Unexpected Application Error!"),v.createElement("h3",{style:{fontStyle:"italic"}},s),o?v.createElement("pre",{style:f},o):null,p)}var vb=v.createElement(yb,null),Hp=class extends v.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,s){return s.location!==n.location||s.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:s.error,location:s.location,revalidation:n.revalidation||s.revalidation}}componentDidCatch(n,s){this.props.onError?this.props.onError(n,s):console.error("React Router caught the following error during render",n)}render(){let n=this.state.error;if(this.context&&typeof n=="object"&&n&&"digest"in n&&typeof n.digest=="string"){const o=mb(n.digest);o&&(n=o)}let s=n!==void 0?v.createElement(za.Provider,{value:this.props.routeContext},v.createElement(Bo.Provider,{value:n,children:this.props.component})):this.props.children;return this.context?v.createElement(bb,{error:n},s):s}};Hp.contextType=zp;var oo=new WeakMap;function bb({children:n,error:s}){let{basename:o}=v.useContext(Jt);if(typeof s=="object"&&s&&"digest"in s&&typeof s.digest=="string"){let u=fb(s.digest);if(u){let f=oo.get(s);if(f)throw f;let h=Ap(u.location,o);if(kp&&!oo.get(s))if(h.isExternal||u.reloadDocument)window.location.href=h.absoluteURL||h.to;else{const p=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(h.to,{replace:u.replace}));throw oo.set(s,p),p}return v.createElement("meta",{httpEquiv:"refresh",content:`0;url=${h.absoluteURL||h.to}`})}}return n}function _b({routeContext:n,match:s,children:o}){let u=v.useContext(Kn);return u&&u.static&&u.staticContext&&(s.route.errorElement||s.route.ErrorBoundary)&&(u.staticContext._deepestRenderedBoundaryId=s.route.id),v.createElement(za.Provider,{value:n},o)}function Sb(n,s=[],o){let u=o==null?void 0:o.state;if(n==null){if(!u)return null;if(u.errors)n=u.matches;else if(s.length===0&&!u.initialized&&u.matches.length>0)n=u.matches;else return null}let f=n,h=u==null?void 0:u.errors;if(h!=null){let w=f.findIndex(S=>S.route.id&&(h==null?void 0:h[S.route.id])!==void 0);Ke(w>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(h).join(",")}`),f=f.slice(0,Math.min(f.length,w+1))}let p=!1,j=-1;if(o&&u){p=u.renderFallback;for(let w=0;w=0?f=f.slice(0,j+1):f=[f[0]];break}}}}let g=o==null?void 0:o.onError,y=u&&g?(w,S)=>{var T,B;g(w,{location:u.location,params:((B=(T=u.matches)==null?void 0:T[0])==null?void 0:B.params)??{},pattern:ib(u.matches),errorInfo:S})}:void 0;return f.reduceRight((w,S,T)=>{let B,M=!1,$=null,q=null;u&&(B=h&&S.route.id?h[S.route.id]:void 0,$=S.route.errorElement||vb,p&&(j<0&&T===0?(Bp("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),M=!0,q=null):j===T&&(M=!0,q=S.route.hydrateFallbackElement||null)));let X=s.concat(f.slice(0,T+1)),I=()=>{let J;return B?J=$:M?J=q:S.route.Component?J=v.createElement(S.route.Component,null):S.route.element?J=S.route.element:J=w,v.createElement(_b,{match:S,routeContext:{outlet:w,matches:X,isDataRoute:u!=null},children:J})};return u&&(S.route.ErrorBoundary||S.route.errorElement||T===0)?v.createElement(Hp,{location:u.location,revalidation:u.revalidation,component:$,error:B,children:I(),routeContext:{outlet:null,matches:X,isDataRoute:!0},onError:y}):I()},null)}function $o(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function xb(n){let s=v.useContext(Kn);return Ke(s,$o(n)),s}function jb(n){let s=v.useContext(qr);return Ke(s,$o(n)),s}function Eb(n){let s=v.useContext(za);return Ke(s,$o(n)),s}function Yo(n){let s=Eb(n),o=s.matches[s.matches.length-1];return Ke(o.route.id,`${n} can only be used on routes that contain a unique "id"`),o.route.id}function wb(){return Yo("useRouteId")}function Nb(){var u;let n=v.useContext(Bo),s=jb("useRouteError"),o=Yo("useRouteError");return n!==void 0?n:(u=s.errors)==null?void 0:u[o]}function Tb(){let{router:n}=xb("useNavigate"),s=Yo("useNavigate"),o=v.useRef(!1);return Lp(()=>{o.current=!0}),v.useCallback(async(f,h={})=>{ca(o.current,Op),o.current&&(typeof f=="number"?await n.navigate(f):await n.navigate(f,{fromRouteId:s,...h}))},[n,s])}var Qh={};function Bp(n,s,o){!s&&!Qh[n]&&(Qh[n]=!0,ca(!1,o))}v.memo(Cb);function Cb({routes:n,manifest:s,future:o,state:u,isStatic:f,onError:h}){return Up(n,void 0,{manifest:s,state:u,isStatic:f,onError:h})}function kb({to:n,replace:s,state:o,relative:u}){Ke(Zn()," may be used only in the context of a component.");let{static:f}=v.useContext(Jt);ca(!f," must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.");let{matches:h}=v.useContext(za),{pathname:p}=_a(),j=qo(),g=Br(n,Ho(h),p,u==="path"),y=JSON.stringify(g);return v.useEffect(()=>{j(JSON.parse(y),{replace:s,state:o,relative:u})},[j,y,u,s,o]),null}function To(n){Ke(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function Ab({basename:n="/",children:s=null,location:o,navigationType:u="POP",navigator:f,static:h=!1,useTransitions:p}){Ke(!Zn(),"You cannot render a inside another . You should never have more than one in your app.");let j=n.replace(/^\/*/,"/"),g=v.useMemo(()=>({basename:j,navigator:f,static:h,useTransitions:p,future:{}}),[j,f,h,p]);typeof o=="string"&&(o=an(o));let{pathname:y="/",search:w="",hash:S="",state:T=null,key:B="default",mask:M}=o,$=v.useMemo(()=>{let q=el(y,j);return q==null?null:{location:{pathname:q,search:w,hash:S,state:T,key:B,mask:M},navigationType:u}},[j,y,w,S,T,B,u,M]);return ca($!=null,` is not able to match the URL "${y}${w}${S}" because it does not start with the basename, so the won't render anything.`),$==null?null:v.createElement(Jt.Provider,{value:g},v.createElement(Ii.Provider,{children:s,value:$}))}function Db({children:n,location:s}){return gb(Co(n),s)}function Co(n,s=[]){let o=[];return v.Children.forEach(n,(u,f)=>{if(!v.isValidElement(u))return;let h=[...s,f];if(u.type===v.Fragment){o.push.apply(o,Co(u.props.children,h));return}Ke(u.type===To,`[${typeof u.type=="string"?u.type:u.type.name}] is not a component. All component children of must be a or `),Ke(!u.props.index||!u.props.children,"An index route cannot have child routes.");let p={id:u.props.id||h.join("-"),caseSensitive:u.props.caseSensitive,element:u.props.element,Component:u.props.Component,index:u.props.index,path:u.props.path,middleware:u.props.middleware,loader:u.props.loader,action:u.props.action,hydrateFallbackElement:u.props.hydrateFallbackElement,HydrateFallback:u.props.HydrateFallback,errorElement:u.props.errorElement,ErrorBoundary:u.props.ErrorBoundary,hasErrorBoundary:u.props.hasErrorBoundary===!0||u.props.ErrorBoundary!=null||u.props.errorElement!=null,shouldRevalidate:u.props.shouldRevalidate,handle:u.props.handle,lazy:u.props.lazy};u.props.children&&(p.children=Co(u.props.children,h)),o.push(p)}),o}var Cr="get",kr="application/x-www-form-urlencoded";function $r(n){return typeof HTMLElement<"u"&&n instanceof HTMLElement}function zb(n){return $r(n)&&n.tagName.toLowerCase()==="button"}function Mb(n){return $r(n)&&n.tagName.toLowerCase()==="form"}function Rb(n){return $r(n)&&n.tagName.toLowerCase()==="input"}function Ob(n){return!!(n.metaKey||n.altKey||n.ctrlKey||n.shiftKey)}function Lb(n,s){return n.button===0&&(!s||s==="_self")&&!Ob(n)}var wr=null;function Ub(){if(wr===null)try{new FormData(document.createElement("form"),0),wr=!1}catch{wr=!0}return wr}var Hb=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function fo(n){return n!=null&&!Hb.has(n)?(ca(!1,`"${n}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${kr}"`),null):n}function Bb(n,s){let o,u,f,h,p;if(Mb(n)){let j=n.getAttribute("action");u=j?el(j,s):null,o=n.getAttribute("method")||Cr,f=fo(n.getAttribute("enctype"))||kr,h=new FormData(n)}else if(zb(n)||Rb(n)&&(n.type==="submit"||n.type==="image")){let j=n.form;if(j==null)throw new Error('Cannot submit a