From 37caef239f90229360ea82f03d156d13358d77aa Mon Sep 17 00:00:00 2001 From: Martin Ziegler Date: Mon, 1 Dec 2025 16:25:54 +0100 Subject: [PATCH] Started to implement full printer control --- PLAN_PRINTER_CONTROL.md | 522 +++++++++++ backend/app/api/routes/camera.py | 256 ++++++ backend/app/api/routes/printer_control.py | 555 ++++++++++++ backend/app/main.py | 4 +- backend/app/services/bambu_mqtt.py | 304 +++++++ frontend/src/App.tsx | 2 + frontend/src/api/client.ts | 100 +++ frontend/src/components/Layout.tsx | 3 +- frontend/src/components/control/AMSPanel.tsx | 223 +++++ .../src/components/control/CameraFeed.tsx | 138 +++ .../src/components/control/FanControls.tsx | 135 +++ .../src/components/control/LightToggle.tsx | 68 ++ .../components/control/MovementControls.tsx | 235 +++++ .../src/components/control/PrintControls.tsx | 137 +++ .../src/components/control/PrintStatus.tsx | 90 ++ .../src/components/control/SpeedControl.tsx | 71 ++ .../components/control/TemperaturePanel.tsx | 246 +++++ frontend/src/i18n/locales/de.ts | 1 + frontend/src/i18n/locales/en.ts | 1 + frontend/src/pages/ControlPage.tsx | 207 +++++ static/assets/index-4olH2ask.css | 1 - .../{index-soeWpmRO.js => index-CLsUm3wk.js} | 838 +++++++++--------- static/assets/index-Dqi_M3E3.css | 1 + static/index.html | 4 +- 24 files changed, 3719 insertions(+), 423 deletions(-) create mode 100644 PLAN_PRINTER_CONTROL.md create mode 100644 backend/app/api/routes/camera.py create mode 100644 backend/app/api/routes/printer_control.py create mode 100644 frontend/src/components/control/AMSPanel.tsx create mode 100644 frontend/src/components/control/CameraFeed.tsx create mode 100644 frontend/src/components/control/FanControls.tsx create mode 100644 frontend/src/components/control/LightToggle.tsx create mode 100644 frontend/src/components/control/MovementControls.tsx create mode 100644 frontend/src/components/control/PrintControls.tsx create mode 100644 frontend/src/components/control/PrintStatus.tsx create mode 100644 frontend/src/components/control/SpeedControl.tsx create mode 100644 frontend/src/components/control/TemperaturePanel.tsx create mode 100644 frontend/src/pages/ControlPage.tsx delete mode 100644 static/assets/index-4olH2ask.css rename static/assets/{index-soeWpmRO.js => index-CLsUm3wk.js} (53%) create mode 100644 static/assets/index-Dqi_M3E3.css diff --git a/PLAN_PRINTER_CONTROL.md b/PLAN_PRINTER_CONTROL.md new file mode 100644 index 000000000..501947e46 --- /dev/null +++ b/PLAN_PRINTER_CONTROL.md @@ -0,0 +1,522 @@ +# Full Printer Control - Implementation Plan + +## Overview + +Add a dedicated **Control Page** (`/control`) with full printer control capabilities, including: +- Live camera feed +- Print control (pause/resume/stop) +- Temperature control (bed, nozzle, chamber) +- Speed adjustment +- Fan control +- Light control +- Axis movement +- AMS visualization and operations + +--- + +## Phase 1: Backend - MQTT Control Commands + +### 1.1 Add Control Methods to `bambu_mqtt.py` + +```python +# Print Control +async def pause_print(self) -> bool +async def resume_print(self) -> bool +# stop_print() already exists + +# Temperature Control +async def set_bed_temperature(self, target: int) -> bool +async def set_nozzle_temperature(self, target: int, nozzle: int = 0) -> bool + +# Speed Control +async def set_print_speed(self, mode: int) -> bool # 1=silent, 2=standard, 3=sport, 4=ludicrous + +# Fan Control +async def set_part_fan(self, speed: int) -> bool # 0-255 +async def set_aux_fan(self, speed: int) -> bool # 0-255 +async def set_chamber_fan(self, speed: int) -> bool # 0-255 + +# Light Control +async def set_chamber_light(self, on: bool) -> bool + +# Movement Control +async def home_axes(self, axes: str = "XYZ") -> bool +async def move_axis(self, axis: str, distance: float, speed: int = 3000) -> bool +async def disable_motors(self) -> bool + +# AMS Control +async def ams_load_filament(self, tray_id: int) -> bool +async def ams_unload_filament(self) -> bool + +# G-code +async def send_gcode(self, gcode: str) -> bool +``` + +### 1.2 MQTT Command Formats + +| Command | JSON Payload | +|---------|-------------| +| Pause | `{"print": {"sequence_id": "0", "command": "pause"}}` | +| Resume | `{"print": {"sequence_id": "0", "command": "resume"}}` | +| Bed Temp | `{"print": {"sequence_id": "0", "command": "gcode_line", "param": "M140 S{temp}"}}` | +| Nozzle Temp | `{"print": {"sequence_id": "0", "command": "gcode_line", "param": "M104 S{temp}"}}` | +| Print Speed | `{"print": {"sequence_id": "0", "command": "print_speed", "param": "{1-4}"}}` | +| Fan (P1=part, P2=aux, P3=chamber) | `{"print": {"sequence_id": "0", "command": "gcode_line", "param": "M106 P{n} S{0-255}"}}` | +| Light On | `{"system": {"sequence_id": "0", "command": "ledctrl", "led_node": "chamber_light", "led_mode": "on", ...}}` | +| Home | `{"print": {"sequence_id": "0", "command": "gcode_line", "param": "G28 {axes}"}}` | +| Move | `{"print": {"sequence_id": "0", "command": "gcode_line", "param": "G91\nG0 {axis}{dist} F{speed}\nG90"}}` | +| AMS Load | `{"print": {"sequence_id": "0", "command": "ams_change_filament", "target": {tray_id}}}` | +| AMS Unload | `{"print": {"sequence_id": "0", "command": "ams_change_filament", "target": 255}}` | + +### 1.3 Model-Specific Handling + +- **P1/A1 series**: Use blocking temp commands (M109/M190) instead of M104/M140 +- **H2D**: Handle dual nozzle targeting +- Store printer model in status for frontend to adapt UI + +--- + +## Phase 2: Backend - Control API Endpoints + +### 2.1 New Routes in `backend/app/api/routes/printer_control.py` + +```python +# Print Control +POST /api/v1/printers/{id}/control/pause +POST /api/v1/printers/{id}/control/resume +POST /api/v1/printers/{id}/control/stop + +# Temperature +POST /api/v1/printers/{id}/control/temperature/bed + Body: {"target": 60} +POST /api/v1/printers/{id}/control/temperature/nozzle + Body: {"target": 200, "nozzle": 0} + +# Speed +POST /api/v1/printers/{id}/control/speed + Body: {"mode": 2} # 1-4 + +# Fans +POST /api/v1/printers/{id}/control/fan/part + Body: {"speed": 255} # 0-255 +POST /api/v1/printers/{id}/control/fan/aux +POST /api/v1/printers/{id}/control/fan/chamber + +# Light +POST /api/v1/printers/{id}/control/light + Body: {"on": true} + +# Movement +POST /api/v1/printers/{id}/control/home + Body: {"axes": "XYZ"} # optional, default all +POST /api/v1/printers/{id}/control/move + Body: {"axis": "Z", "distance": 10, "speed": 600} +POST /api/v1/printers/{id}/control/motors/disable + +# AMS +POST /api/v1/printers/{id}/control/ams/load + Body: {"tray_id": 0} +POST /api/v1/printers/{id}/control/ams/unload + +# G-code (advanced) +POST /api/v1/printers/{id}/control/gcode + Body: {"command": "G28"} +``` + +### 2.2 Safety Confirmations + +Commands that need confirmation token (generated and validated server-side): +- `stop` - Aborts print +- `home` while printing - Could cause issues +- `move` while printing - Dangerous +- `motors/disable` - Causes position loss + +Flow: +1. Frontend calls endpoint without token +2. Backend returns `{"requires_confirmation": true, "token": "abc123", "warning": "This will abort..."}` +3. Frontend shows confirmation dialog +4. Frontend calls again with `{"confirm_token": "abc123"}` +5. Backend validates token and executes + +--- + +## Phase 3: Backend - Camera Streaming + +### 3.1 Streaming Approach + +Option A: **MJPEG Stream** (simpler) +- Backend captures RTSP frames via ffmpeg +- Serves as MJPEG stream at `/api/v1/printers/{id}/camera/stream` +- Frontend uses `` with streaming + +Option B: **WebSocket Frames** (more control) +- Backend sends JPEG frames via WebSocket +- Frontend renders on canvas +- Allows frame rate control, pause/resume + +**Recommended: Option A (MJPEG)** - Simpler, works in all browsers + +### 3.2 Implementation + +```python +# backend/app/api/routes/camera.py + +@router.get("/printers/{printer_id}/camera/stream") +async def camera_stream(printer_id: int): + """Stream camera as MJPEG""" + printer = get_printer(printer_id) + + async def generate(): + process = await asyncio.create_subprocess_exec( + 'ffmpeg', + '-rtsp_transport', 'tcp', + '-i', f'rtsps://bblp:{printer.access_code}@{printer.ip_address}:{port}/streaming/live/1', + '-f', 'mjpeg', + '-q:v', '5', + '-r', '15', # 15 fps + '-', + stdout=asyncio.subprocess.PIPE + ) + + while True: + frame = await read_jpeg_frame(process.stdout) + if not frame: + break + yield ( + b'--frame\r\n' + b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n' + ) + + return StreamingResponse( + generate(), + media_type='multipart/x-mixed-replace; boundary=frame' + ) + +@router.get("/printers/{printer_id}/camera/snapshot") +async def camera_snapshot(printer_id: int): + """Get single camera frame""" + # Use existing camera.py capture_frame logic +``` + +### 3.3 Camera Ports by Model + +| Model | Port | Protocol | +|-------|------|----------| +| X1/X1C/H2D | 322 | RTSPS | +| P1/P1S/P1P | 6000 | RTSPS | +| A1/A1 Mini | 6000 | RTSPS | + +--- + +## Phase 4: Frontend - Control Page + +### 4.1 Page Structure + +``` +/control +├── ControlPage.tsx # Main page with printer tabs +├── components/ +│ ├── CameraFeed.tsx # Live video stream +│ ├── PrintControls.tsx # Pause/Resume/Stop + progress +│ ├── TemperaturePanel.tsx # Bed/Nozzle/Chamber controls +│ ├── SpeedControl.tsx # Speed mode selector +│ ├── FanControls.tsx # Part/Aux/Chamber fan sliders +│ ├── LightToggle.tsx # Chamber light on/off +│ ├── MovementControls.tsx # Home + XYZ jog buttons +│ ├── AMSPanel.tsx # AMS visualization + load/unload +│ └── ConfirmDialog.tsx # Safety confirmation modal +``` + +### 4.2 Layout (Desktop) + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ [Printer 1] [Printer 2] [Printer 3] tabs │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────┐ ┌────────────────────────────────┐│ +│ │ │ │ Print Status ││ +│ │ Camera Feed │ │ ┌────────────────────────┐ ││ +│ │ (16:9 aspect) │ │ │ State: RUNNING │ ││ +│ │ │ │ │ File: benchy.3mf │ ││ +│ │ │ │ │ Progress: ████████░░ 78%│ ││ +│ │ │ │ │ Layer: 156/200 │ ││ +│ │ │ │ │ Time: 45min remaining │ ││ +│ │ │ │ └────────────────────────┘ ││ +│ │ │ │ ││ +│ │ [⏸ Pause] [■ Stop] │ │ [⏸ Pause] [▶ Resume] [■ Stop]││ +│ └─────────────────────────┘ └────────────────────────────────┘│ +│ │ +│ ┌─────────────────────────┐ ┌────────────────────────────────┐│ +│ │ Temperatures │ │ Speed & Fans ││ +│ │ ┌───────────────────┐ │ │ Speed: [Silent][Std][Sport][!]││ +│ │ │ 🛏️ Bed │ │ │ ││ +│ │ │ 60°C → 60°C │ │ │ Part Fan: ████████░░ 80% ││ +│ │ │ [-] [target] [+] │ │ │ Aux Fan: ░░░░░░░░░░ 0% ││ +│ │ ├───────────────────┤ │ │ Chamber Fan: ████░░░░░░ 40% ││ +│ │ │ 🔥 Nozzle │ │ └────────────────────────────────┘│ +│ │ │ 205°C → 210°C │ │ │ +│ │ │ [-] [target] [+] │ │ ┌────────────────────────────────┐│ +│ │ ├───────────────────┤ │ │ Movement ││ +│ │ │ 📦 Chamber: 35°C │ │ │ [Y+] ││ +│ │ └───────────────────┘ │ │ [X-] [Home] [X+] ││ +│ └─────────────────────────┘ │ [Y-] [Z+][Z-] ││ +│ │ [Disable Motors] ││ +│ ┌─────────────────────────┐ └────────────────────────────────┘│ +│ │ 💡 Light [ON] / [OFF] │ │ +│ └─────────────────────────┘ │ +│ │ +│ ┌──────────────────────────────────────────────────────────────┐│ +│ │ AMS ││ +│ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ [Load] [Unload] ││ +│ │ │ 1 │ │ 2 │ │ 3 │ │ 4 │ ││ +│ │ │ 🔴 │ │ 🔵 │ │ ⚪ │ │ ⬛ │ Selected: Slot 1 (PLA Red) ││ +│ │ │80% │ │45% │ │100%│ │ -- │ ││ +│ │ └────┘ └────┘ └────┘ └────┘ ││ +│ └──────────────────────────────────────────────────────────────┘│ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 4.3 Mobile Layout + +Stacked vertically: +1. Camera (full width) +2. Print controls +3. Temperatures (collapsible) +4. Speed/Fans (collapsible) +5. Movement (collapsible) +6. AMS (collapsible) + +### 4.4 State Management + +Use React Query for: +- Printer status (already exists, real-time via WebSocket) +- Control mutations with optimistic updates + +```typescript +// Example mutation +const pausePrint = useMutation({ + mutationFn: (printerId: number) => + api.post(`/printers/${printerId}/control/pause`), + onSuccess: () => { + // Optimistic: printer status will update via WebSocket + } +}); +``` + +--- + +## Phase 5: Component Details + +### 5.1 CameraFeed Component + +```typescript +interface CameraFeedProps { + printerId: number; + enabled: boolean; +} + +// Features: +// - MJPEG stream from /api/v1/printers/{id}/camera/stream +// - Fallback to static thumbnail if stream fails +// - Loading state with skeleton +// - Click to fullscreen +// - Optional: snapshot button +``` + +### 5.2 TemperaturePanel Component + +```typescript +interface TemperaturePanelProps { + printerId: number; + bed: { current: number; target: number }; + nozzle: { current: number; target: number }; + nozzle2?: { current: number; target: number }; // H2D + chamber?: number; +} + +// Features: +// - Visual temperature bars (current vs target) +// - Input field or +/- buttons for target +// - Presets: Off (0), PLA (60/200), PETG (70/230), ABS (90/250) +// - Debounced API calls (don't spam on rapid clicks) +// - Disable controls during print (optional setting) +``` + +### 5.3 SpeedControl Component + +```typescript +// Speed modes as toggle buttons: +// [Silent] [Standard] [Sport] [Ludicrous] +// Visual feedback for current mode +// Warning tooltip for Ludicrous mode +``` + +### 5.4 FanControls Component + +```typescript +// Sliders for each fan (0-100%) +// Convert to 0-255 for API +// Real-time value display +// Disable chamber fan if not available (check model) +``` + +### 5.5 MovementControls Component + +```typescript +// Grid layout: +// [Y+10] [Y+1] +// [X-10] [X-1] [Home] [X+1] [X+10] +// [Y-1] [Y-10] +// [Z+10] [Z+1] [Z-1] [Z-10] +// +// [Disable Motors] button with confirmation +// Warning: "Movement controls disabled during print" overlay +``` + +### 5.6 AMSPanel Component + +```typescript +// Visual representation matching Bambu style: +// - 4 slots per AMS unit +// - Color-coded by filament +// - Percentage remaining +// - Active slot indicator (animated) +// - Click to select slot +// - [Load Selected] [Unload] buttons +// - Support for external spool indicator +``` + +--- + +## Phase 6: Safety Features + +### 6.1 Confirmation Dialogs + +Required for: +- **Stop Print**: "This will abort the current print. Are you sure?" +- **Home During Print**: "Homing during a print is not recommended. Continue?" +- **Move During Print**: "Manual movement during printing can damage your print. Continue?" +- **Disable Motors**: "This will disable motors and lose position. Home before next print." +- **High Temperatures**: Warning for temps > 260°C nozzle or > 100°C bed + +### 6.2 State-Based Disabling + +| Control | IDLE | RUNNING | PAUSE | FINISH | +|---------|------|---------|-------|--------| +| Pause | ❌ | ✅ | ❌ | ❌ | +| Resume | ❌ | ❌ | ✅ | ❌ | +| Stop | ❌ | ✅ | ✅ | ❌ | +| Temp Control | ✅ | ⚠️ | ✅ | ✅ | +| Speed | ❌ | ✅ | ❌ | ❌ | +| Fans | ✅ | ⚠️ | ✅ | ✅ | +| Movement | ✅ | ❌ | ⚠️ | ✅ | +| AMS Load | ✅ | ❌ | ❌ | ✅ | + +⚠️ = Allowed with warning + +--- + +## Phase 7: WebSocket Updates + +### 7.1 Extended Status Data + +Ensure these fields are included in printer status broadcasts: + +```typescript +interface PrinterStatus { + // Existing + state: string; + progress: number; + remaining_time: number; + temperatures: {...}; + + // Add for control page + print_speed_mode: number; // 1-4 + fan_speeds: { + part: number; // 0-255 + aux: number; + chamber: number; + }; + light_state: boolean; + ams_status: { + units: [{ + id: number; + trays: [{ + id: number; + color: string; // hex + type: string; // PLA, PETG, etc + remaining: number; // percentage + active: boolean; + }]; + }]; + current_tray: number; + }; + position?: { + x: number; + y: number; + z: number; + }; +} +``` + +--- + +## Implementation Order + +1. **Backend MQTT commands** - Add all control methods +2. **Backend API endpoints** - Create control routes with safety +3. **Backend camera streaming** - MJPEG endpoint +4. **Frontend ControlPage** - Basic structure with tabs +5. **Frontend CameraFeed** - Live stream component +6. **Frontend PrintControls** - Pause/Resume/Stop +7. **Frontend TemperaturePanel** - Temp controls +8. **Frontend SpeedControl** - Speed mode +9. **Frontend FanControls** - Fan sliders +10. **Frontend LightToggle** - Light switch +11. **Frontend MovementControls** - Jog buttons +12. **Frontend AMSPanel** - AMS visualization +13. **Navigation integration** - Add to sidebar +14. **Testing & refinement** - All printer models + +--- + +## Files to Create/Modify + +### New Files +``` +backend/app/api/routes/printer_control.py +backend/app/api/routes/camera.py +backend/app/schemas/control.py +frontend/src/pages/ControlPage.tsx +frontend/src/components/control/CameraFeed.tsx +frontend/src/components/control/PrintControls.tsx +frontend/src/components/control/TemperaturePanel.tsx +frontend/src/components/control/SpeedControl.tsx +frontend/src/components/control/FanControls.tsx +frontend/src/components/control/LightToggle.tsx +frontend/src/components/control/MovementControls.tsx +frontend/src/components/control/AMSPanel.tsx +frontend/src/components/control/ConfirmDialog.tsx +``` + +### Modified Files +``` +backend/app/services/bambu_mqtt.py # Add control methods +backend/app/api/routes/__init__.py # Register new routes +backend/app/main.py # Include new router +backend/app/schemas/printer.py # Extend status schema +frontend/src/App.tsx # Add route +frontend/src/components/Sidebar.tsx # Add nav item +frontend/src/api/client.ts # Add control API calls +``` + +--- + +## Estimated Scope + +- Backend: ~500 lines new code +- Frontend: ~1500 lines new code +- Total: ~2000 lines + +Ready to begin implementation? diff --git a/backend/app/api/routes/camera.py b/backend/app/api/routes/camera.py new file mode 100644 index 000000000..797e11690 --- /dev/null +++ b/backend/app/api/routes/camera.py @@ -0,0 +1,256 @@ +"""Camera streaming API endpoints for Bambu Lab printers.""" + +import asyncio +import logging +from typing import AsyncGenerator + +from fastapi import APIRouter, HTTPException, Depends +from fastapi.responses import StreamingResponse, Response +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select + +from backend.app.core.database import get_db +from backend.app.models.printer import Printer +from backend.app.services.camera import ( + build_camera_url, + capture_camera_frame, + test_camera_connection, +) +from backend.app.services.printer_manager import printer_manager + +logger = logging.getLogger(__name__) +router = APIRouter(prefix="/printers", tags=["camera"]) + + +async def get_printer_or_404(printer_id: int, db: AsyncSession) -> Printer: + """Get printer by ID or raise 404.""" + result = await db.execute(select(Printer).where(Printer.id == printer_id)) + printer = result.scalar_one_or_none() + if not printer: + raise HTTPException(status_code=404, detail="Printer not found") + return printer + + +async def generate_mjpeg_stream( + ip_address: str, + access_code: str, + model: str | None, + fps: int = 10, +) -> AsyncGenerator[bytes, None]: + """Generate MJPEG stream from printer camera using ffmpeg. + + This captures frames continuously and yields them in MJPEG format. + """ + from backend.app.services.camera import get_camera_port + + port = get_camera_port(model) + camera_url = f"rtsps://bblp:{access_code}@{ip_address}:{port}/streaming/live/1" + + # ffmpeg command to output MJPEG stream to stdout + # -re: Read input at native frame rate + # -rtsp_transport tcp: Use TCP for reliability + # -f mjpeg: Output as MJPEG + # -q:v 5: Quality (lower = better, 2-10 is good range) + # -r: Output framerate + cmd = [ + "ffmpeg", + "-rtsp_transport", "tcp", + "-i", camera_url, + "-f", "mjpeg", + "-q:v", "5", + "-r", str(fps), + "-an", # No audio + "-" # Output to stdout + ] + + logger.info(f"Starting camera stream for {ip_address}") + + process = None + try: + process = await asyncio.create_subprocess_exec( + *cmd, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + + # Read JPEG frames from ffmpeg output + # JPEG images start with 0xFFD8 and end with 0xFFD9 + buffer = b"" + jpeg_start = b"\xff\xd8" + jpeg_end = b"\xff\xd9" + + while True: + try: + # Read chunk from ffmpeg + chunk = await asyncio.wait_for( + process.stdout.read(8192), + timeout=10.0 + ) + + if not chunk: + logger.warning("Camera stream ended (no more data)") + break + + buffer += chunk + + # Find complete JPEG frames in buffer + while True: + start_idx = buffer.find(jpeg_start) + if start_idx == -1: + # No start marker, clear buffer up to last 2 bytes + buffer = buffer[-2:] if len(buffer) > 2 else buffer + break + + # Trim anything before the start marker + if start_idx > 0: + buffer = buffer[start_idx:] + + end_idx = buffer.find(jpeg_end, 2) # Skip first 2 bytes + if end_idx == -1: + # No end marker yet, wait for more data + break + + # Extract complete frame + frame = buffer[:end_idx + 2] + buffer = buffer[end_idx + 2:] + + # Yield frame in MJPEG format + yield ( + b"--frame\r\n" + b"Content-Type: image/jpeg\r\n" + b"Content-Length: " + str(len(frame)).encode() + b"\r\n" + b"\r\n" + frame + b"\r\n" + ) + + except asyncio.TimeoutError: + logger.warning("Camera stream read timeout") + break + except asyncio.CancelledError: + logger.info("Camera stream cancelled") + break + + except FileNotFoundError: + logger.error("ffmpeg not found - camera streaming requires ffmpeg") + yield ( + b"--frame\r\n" + b"Content-Type: text/plain\r\n\r\n" + b"Error: ffmpeg not installed\r\n" + ) + except Exception as e: + logger.exception(f"Camera stream error: {e}") + finally: + if process: + try: + process.terminate() + await asyncio.wait_for(process.wait(), timeout=5.0) + except Exception: + process.kill() + await process.wait() + logger.info(f"Camera stream stopped for {ip_address}") + + +@router.get("/{printer_id}/camera/stream") +async def camera_stream( + printer_id: int, + fps: int = 10, + db: AsyncSession = Depends(get_db), +): + """Stream live video from printer camera as MJPEG. + + This endpoint returns a multipart MJPEG stream that can be used directly + in an tag or video player. + + Args: + printer_id: Printer ID + fps: Target frames per second (default: 10, max: 30) + """ + printer = await get_printer_or_404(printer_id, db) + + # Validate FPS + fps = min(max(fps, 1), 30) + + return StreamingResponse( + generate_mjpeg_stream( + ip_address=printer.ip_address, + access_code=printer.access_code, + model=printer.model, + fps=fps, + ), + media_type="multipart/x-mixed-replace; boundary=frame", + headers={ + "Cache-Control": "no-cache, no-store, must-revalidate", + "Pragma": "no-cache", + "Expires": "0", + } + ) + + +@router.get("/{printer_id}/camera/snapshot") +async def camera_snapshot( + printer_id: int, + db: AsyncSession = Depends(get_db), +): + """Capture a single frame from the printer camera. + + Returns a JPEG image. + """ + import tempfile + from pathlib import Path + + printer = await get_printer_or_404(printer_id, db) + + # Create temporary file for the snapshot + with tempfile.NamedTemporaryFile(suffix=".jpg", delete=False) as f: + temp_path = Path(f.name) + + try: + success = await capture_camera_frame( + ip_address=printer.ip_address, + access_code=printer.access_code, + model=printer.model, + output_path=temp_path, + timeout=15, + ) + + if not success: + raise HTTPException( + status_code=503, + detail="Failed to capture camera frame. Is the printer powered on?" + ) + + # Read and return the image + with open(temp_path, "rb") as f: + image_data = f.read() + + return Response( + content=image_data, + media_type="image/jpeg", + headers={ + "Cache-Control": "no-cache, no-store, must-revalidate", + "Content-Disposition": f'inline; filename="snapshot_{printer_id}.jpg"' + } + ) + finally: + # Clean up temp file + if temp_path.exists(): + temp_path.unlink() + + +@router.get("/{printer_id}/camera/test") +async def test_camera( + printer_id: int, + db: AsyncSession = Depends(get_db), +): + """Test camera connection for a printer. + + Returns success status and any error message. + """ + printer = await get_printer_or_404(printer_id, db) + + result = await test_camera_connection( + ip_address=printer.ip_address, + access_code=printer.access_code, + model=printer.model, + ) + + return result diff --git a/backend/app/api/routes/printer_control.py b/backend/app/api/routes/printer_control.py new file mode 100644 index 000000000..1fdd4f0d4 --- /dev/null +++ b/backend/app/api/routes/printer_control.py @@ -0,0 +1,555 @@ +"""Printer control API endpoints for full printer control.""" + +import logging +import secrets +import time +from typing import Optional + +from fastapi import APIRouter, HTTPException, Depends +from pydantic import BaseModel, Field +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select + +from backend.app.core.database import get_db +from backend.app.models.printer import Printer +from backend.app.services.printer_manager import printer_manager + +logger = logging.getLogger(__name__) +router = APIRouter(prefix="/printers", tags=["printer-control"]) + +# Store confirmation tokens with expiry: {token: (printer_id, action, expiry_time)} +_confirmation_tokens: dict[str, tuple[int, str, float]] = {} +CONFIRMATION_TOKEN_EXPIRY = 60 # seconds + + +def _clean_expired_tokens(): + """Remove expired confirmation tokens.""" + now = time.time() + expired = [t for t, (_, _, exp) in _confirmation_tokens.items() if now > exp] + for token in expired: + _confirmation_tokens.pop(token, None) + + +def _create_confirmation_token(printer_id: int, action: str) -> str: + """Create a confirmation token for dangerous operations.""" + _clean_expired_tokens() + token = secrets.token_urlsafe(16) + _confirmation_tokens[token] = (printer_id, action, time.time() + CONFIRMATION_TOKEN_EXPIRY) + return token + + +def _validate_confirmation_token(token: str, printer_id: int, action: str) -> bool: + """Validate and consume a confirmation token.""" + _clean_expired_tokens() + if token not in _confirmation_tokens: + return False + stored_printer_id, stored_action, expiry = _confirmation_tokens[token] + if stored_printer_id != printer_id or stored_action != action: + return False + if time.time() > expiry: + _confirmation_tokens.pop(token, None) + return False + # Consume the token + _confirmation_tokens.pop(token, None) + return True + + +async def get_printer_or_404(printer_id: int, db: AsyncSession) -> Printer: + """Get printer by ID or raise 404.""" + result = await db.execute(select(Printer).where(Printer.id == printer_id)) + printer = result.scalar_one_or_none() + if not printer: + raise HTTPException(status_code=404, detail="Printer not found") + return printer + + +def get_mqtt_client_or_503(printer_id: int): + """Get MQTT client for printer or raise 503.""" + client = printer_manager.get_client(printer_id) + if not client: + raise HTTPException(status_code=503, detail="Printer not connected") + if not client.state.connected: + raise HTTPException(status_code=503, detail="Printer connection lost") + return client + + +# ============================================================================= +# Request/Response Models +# ============================================================================= + +class ControlResponse(BaseModel): + success: bool + message: str + + +class ConfirmationRequired(BaseModel): + requires_confirmation: bool = True + token: str + warning: str + expires_in: int = CONFIRMATION_TOKEN_EXPIRY + + +class ConfirmableRequest(BaseModel): + confirm_token: Optional[str] = None + + +class TemperatureRequest(ConfirmableRequest): + target: int = Field(..., ge=0, le=350, description="Target temperature in Celsius") + + +class NozzleTemperatureRequest(TemperatureRequest): + nozzle: int = Field(default=0, ge=0, le=1, description="Nozzle index (0 or 1 for dual nozzle)") + + +class SpeedRequest(BaseModel): + mode: int = Field(..., ge=1, le=4, description="Speed mode: 1=silent, 2=standard, 3=sport, 4=ludicrous") + + +class FanRequest(BaseModel): + speed: int = Field(..., ge=0, le=100, description="Fan speed percentage (0-100)") + + +class LightRequest(BaseModel): + on: bool = Field(..., description="Light state: true=on, false=off") + + +class HomeRequest(ConfirmableRequest): + axes: str = Field(default="XYZ", description="Axes to home (e.g., 'XYZ', 'X', 'XY', 'Z')") + + +class MoveRequest(ConfirmableRequest): + axis: str = Field(..., pattern="^[XYZxyz]$", description="Axis to move: X, Y, or Z") + distance: float = Field(..., ge=-100, le=100, description="Distance in mm (positive or negative)") + speed: int = Field(default=3000, ge=100, le=10000, description="Movement speed in mm/min") + + +class AMSLoadRequest(BaseModel): + tray_id: int = Field(..., ge=0, le=254, description="Tray ID (0-15 for AMS, 254 for external)") + + +class GcodeRequest(ConfirmableRequest): + command: str = Field(..., min_length=1, max_length=500, description="G-code command(s)") + + +# ============================================================================= +# Print Control Endpoints +# ============================================================================= + +@router.post("/{printer_id}/control/pause", response_model=ControlResponse) +async def pause_print( + printer_id: int, + db: AsyncSession = Depends(get_db), +): + """Pause the current print job.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + # Check if printer is actually printing + if client.state.state != "RUNNING": + raise HTTPException(status_code=400, detail="Printer is not currently printing") + + success = client.pause_print() + return ControlResponse( + success=success, + message="Pause command sent" if success else "Failed to send pause command" + ) + + +@router.post("/{printer_id}/control/resume", response_model=ControlResponse) +async def resume_print( + printer_id: int, + db: AsyncSession = Depends(get_db), +): + """Resume a paused print job.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + # Check if printer is actually paused + if client.state.state != "PAUSE": + raise HTTPException(status_code=400, detail="Printer is not paused") + + success = client.resume_print() + return ControlResponse( + success=success, + message="Resume command sent" if success else "Failed to send resume command" + ) + + +@router.post("/{printer_id}/control/stop") +async def stop_print( + printer_id: int, + request: ConfirmableRequest = None, + db: AsyncSession = Depends(get_db), +): + """Stop the current print job. Requires confirmation.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + # Check if printer is printing or paused + if client.state.state not in ("RUNNING", "PAUSE"): + raise HTTPException(status_code=400, detail="No active print to stop") + + # Require confirmation for stop + if not request or not request.confirm_token: + token = _create_confirmation_token(printer_id, "stop") + return ConfirmationRequired( + token=token, + warning="This will abort the current print. The print cannot be resumed. Are you sure?" + ) + + if not _validate_confirmation_token(request.confirm_token, printer_id, "stop"): + raise HTTPException(status_code=400, detail="Invalid or expired confirmation token") + + success = client.stop_print() + return ControlResponse( + success=success, + message="Stop command sent" if success else "Failed to send stop command" + ) + + +# ============================================================================= +# Temperature Control Endpoints +# ============================================================================= + +@router.post("/{printer_id}/control/temperature/bed", response_model=ControlResponse) +async def set_bed_temperature( + printer_id: int, + request: TemperatureRequest, + db: AsyncSession = Depends(get_db), +): + """Set the bed target temperature.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + # Warn for high temperatures + if request.target > 100 and not request.confirm_token: + token = _create_confirmation_token(printer_id, "bed_temp") + return ConfirmationRequired( + token=token, + warning=f"Setting bed to {request.target}°C is unusually high. Confirm?" + ) + + if request.target > 100: + if not _validate_confirmation_token(request.confirm_token, printer_id, "bed_temp"): + raise HTTPException(status_code=400, detail="Invalid or expired confirmation token") + + success = client.set_bed_temperature(request.target) + return ControlResponse( + success=success, + message=f"Bed temperature set to {request.target}°C" if success else "Failed to set bed temperature" + ) + + +@router.post("/{printer_id}/control/temperature/nozzle", response_model=ControlResponse) +async def set_nozzle_temperature( + printer_id: int, + request: NozzleTemperatureRequest, + db: AsyncSession = Depends(get_db), +): + """Set the nozzle target temperature.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + # Warn for high temperatures + if request.target > 280 and not request.confirm_token: + token = _create_confirmation_token(printer_id, "nozzle_temp") + return ConfirmationRequired( + token=token, + warning=f"Setting nozzle to {request.target}°C is very high. Confirm?" + ) + + if request.target > 280: + if not _validate_confirmation_token(request.confirm_token, printer_id, "nozzle_temp"): + raise HTTPException(status_code=400, detail="Invalid or expired confirmation token") + + success = client.set_nozzle_temperature(request.target, request.nozzle) + return ControlResponse( + success=success, + message=f"Nozzle {request.nozzle} temperature set to {request.target}°C" if success else "Failed to set nozzle temperature" + ) + + +# ============================================================================= +# Speed Control Endpoint +# ============================================================================= + +@router.post("/{printer_id}/control/speed", response_model=ControlResponse) +async def set_print_speed( + printer_id: int, + request: SpeedRequest, + db: AsyncSession = Depends(get_db), +): + """Set the print speed mode.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + speed_names = {1: "Silent", 2: "Standard", 3: "Sport", 4: "Ludicrous"} + success = client.set_print_speed(request.mode) + return ControlResponse( + success=success, + message=f"Speed set to {speed_names[request.mode]}" if success else "Failed to set speed" + ) + + +# ============================================================================= +# Fan Control Endpoints +# ============================================================================= + +@router.post("/{printer_id}/control/fan/part", response_model=ControlResponse) +async def set_part_fan( + printer_id: int, + request: FanRequest, + db: AsyncSession = Depends(get_db), +): + """Set part cooling fan speed (0-100%).""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + # Convert percentage to 0-255 + speed_255 = int(request.speed * 255 / 100) + success = client.set_part_fan(speed_255) + return ControlResponse( + success=success, + message=f"Part fan set to {request.speed}%" if success else "Failed to set part fan" + ) + + +@router.post("/{printer_id}/control/fan/aux", response_model=ControlResponse) +async def set_aux_fan( + printer_id: int, + request: FanRequest, + db: AsyncSession = Depends(get_db), +): + """Set auxiliary fan speed (0-100%).""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + speed_255 = int(request.speed * 255 / 100) + success = client.set_aux_fan(speed_255) + return ControlResponse( + success=success, + message=f"Aux fan set to {request.speed}%" if success else "Failed to set aux fan" + ) + + +@router.post("/{printer_id}/control/fan/chamber", response_model=ControlResponse) +async def set_chamber_fan( + printer_id: int, + request: FanRequest, + db: AsyncSession = Depends(get_db), +): + """Set chamber fan speed (0-100%).""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + speed_255 = int(request.speed * 255 / 100) + success = client.set_chamber_fan(speed_255) + return ControlResponse( + success=success, + message=f"Chamber fan set to {request.speed}%" if success else "Failed to set chamber fan" + ) + + +# ============================================================================= +# Light Control Endpoint +# ============================================================================= + +@router.post("/{printer_id}/control/light", response_model=ControlResponse) +async def set_chamber_light( + printer_id: int, + request: LightRequest, + db: AsyncSession = Depends(get_db), +): + """Turn chamber light on or off.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + success = client.set_chamber_light(request.on) + return ControlResponse( + success=success, + message=f"Light turned {'on' if request.on else 'off'}" if success else "Failed to control light" + ) + + +# ============================================================================= +# Movement Control Endpoints +# ============================================================================= + +@router.post("/{printer_id}/control/home") +async def home_axes( + printer_id: int, + request: HomeRequest = None, + db: AsyncSession = Depends(get_db), +): + """Home the specified axes.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + axes = (request.axes if request else "XYZ").upper() + + # Warn if homing during print + if client.state.state in ("RUNNING", "PAUSE"): + if not request or not request.confirm_token: + token = _create_confirmation_token(printer_id, "home") + return ConfirmationRequired( + token=token, + warning="Homing during an active print is not recommended. This may damage your print. Continue?" + ) + if not _validate_confirmation_token(request.confirm_token, printer_id, "home"): + raise HTTPException(status_code=400, detail="Invalid or expired confirmation token") + + success = client.home_axes(axes) + return ControlResponse( + success=success, + message=f"Homing {axes}" if success else "Failed to send home command" + ) + + +@router.post("/{printer_id}/control/move") +async def move_axis( + printer_id: int, + request: MoveRequest, + db: AsyncSession = Depends(get_db), +): + """Move an axis by a relative distance.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + # Block movement during print unless confirmed + if client.state.state in ("RUNNING", "PAUSE"): + if not request.confirm_token: + token = _create_confirmation_token(printer_id, "move") + return ConfirmationRequired( + token=token, + warning="Manual movement during printing can damage your print. Are you sure?" + ) + if not _validate_confirmation_token(request.confirm_token, printer_id, "move"): + raise HTTPException(status_code=400, detail="Invalid or expired confirmation token") + + success = client.move_axis(request.axis.upper(), request.distance, request.speed) + direction = "+" if request.distance > 0 else "" + return ControlResponse( + success=success, + message=f"Moving {request.axis.upper()} {direction}{request.distance}mm" if success else "Failed to send move command" + ) + + +@router.post("/{printer_id}/control/motors/disable") +async def disable_motors( + printer_id: int, + request: ConfirmableRequest = None, + db: AsyncSession = Depends(get_db), +): + """Disable stepper motors. Warning: This will lose position.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + # Always require confirmation + if not request or not request.confirm_token: + token = _create_confirmation_token(printer_id, "disable_motors") + return ConfirmationRequired( + token=token, + warning="Disabling motors will cause the printer to lose its position. You must home before printing. Continue?" + ) + + if not _validate_confirmation_token(request.confirm_token, printer_id, "disable_motors"): + raise HTTPException(status_code=400, detail="Invalid or expired confirmation token") + + success = client.disable_motors() + return ControlResponse( + success=success, + message="Motors disabled" if success else "Failed to disable motors" + ) + + +@router.post("/{printer_id}/control/motors/enable", response_model=ControlResponse) +async def enable_motors( + printer_id: int, + db: AsyncSession = Depends(get_db), +): + """Enable stepper motors.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + success = client.enable_motors() + return ControlResponse( + success=success, + message="Motors enabled" if success else "Failed to enable motors" + ) + + +# ============================================================================= +# AMS Control Endpoints +# ============================================================================= + +@router.post("/{printer_id}/control/ams/load", response_model=ControlResponse) +async def ams_load_filament( + printer_id: int, + request: AMSLoadRequest, + db: AsyncSession = Depends(get_db), +): + """Load filament from a specific AMS tray.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + # Don't allow during print + if client.state.state == "RUNNING": + raise HTTPException(status_code=400, detail="Cannot change filament during print") + + success = client.ams_load_filament(request.tray_id) + return ControlResponse( + success=success, + message=f"Loading filament from tray {request.tray_id}" if success else "Failed to load filament" + ) + + +@router.post("/{printer_id}/control/ams/unload", response_model=ControlResponse) +async def ams_unload_filament( + printer_id: int, + db: AsyncSession = Depends(get_db), +): + """Unload the currently loaded filament.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + # Don't allow during print + if client.state.state == "RUNNING": + raise HTTPException(status_code=400, detail="Cannot unload filament during print") + + success = client.ams_unload_filament() + return ControlResponse( + success=success, + message="Unloading filament" if success else "Failed to unload filament" + ) + + +# ============================================================================= +# Advanced: G-code Command +# ============================================================================= + +@router.post("/{printer_id}/control/gcode") +async def send_gcode( + printer_id: int, + request: GcodeRequest, + db: AsyncSession = Depends(get_db), +): + """Send raw G-code command(s). Advanced users only.""" + await get_printer_or_404(printer_id, db) + client = get_mqtt_client_or_503(printer_id) + + # Require confirmation for any G-code + if not request.confirm_token: + token = _create_confirmation_token(printer_id, "gcode") + return ConfirmationRequired( + token=token, + warning="Sending raw G-code can damage your printer if used incorrectly. Are you sure?" + ) + + if not _validate_confirmation_token(request.confirm_token, printer_id, "gcode"): + raise HTTPException(status_code=400, detail="Invalid or expired confirmation token") + + success = client.send_gcode(request.command) + return ControlResponse( + success=success, + message="G-code sent" if success else "Failed to send G-code" + ) diff --git a/backend/app/main.py b/backend/app/main.py index b42ca2d5b..8a8fca100 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -54,7 +54,7 @@ from fastapi.responses import FileResponse from backend.app.core.database import init_db, async_session from sqlalchemy import select, or_ from backend.app.core.websocket import ws_manager -from backend.app.api.routes import printers, archives, websocket, filaments, cloud, smart_plugs, print_queue, kprofiles, notifications, spoolman, updates, maintenance +from backend.app.api.routes import printers, archives, websocket, filaments, cloud, smart_plugs, print_queue, kprofiles, notifications, spoolman, updates, maintenance, printer_control, camera from backend.app.api.routes import settings as settings_routes from backend.app.services.notification_service import notification_service from backend.app.services.printer_manager import ( @@ -1021,6 +1021,8 @@ app.include_router(notifications.router, prefix=app_settings.api_prefix) app.include_router(spoolman.router, prefix=app_settings.api_prefix) app.include_router(updates.router, prefix=app_settings.api_prefix) app.include_router(maintenance.router, prefix=app_settings.api_prefix) +app.include_router(printer_control.router, prefix=app_settings.api_prefix) +app.include_router(camera.router, prefix=app_settings.api_prefix) app.include_router(websocket.router, prefix=app_settings.api_prefix) diff --git a/backend/app/services/bambu_mqtt.py b/backend/app/services/bambu_mqtt.py index 02f1fbc3a..a944ce3de 100644 --- a/backend/app/services/bambu_mqtt.py +++ b/backend/app/services/bambu_mqtt.py @@ -840,3 +840,307 @@ class BambuMQTTClient: # Use QoS 1 for reliable delivery (at least once) self._client.publish(self.topic_publish, command_json, qos=1) return True + + # ========================================================================= + # Printer Control Commands + # ========================================================================= + + def pause_print(self) -> bool: + """Pause the current print job.""" + if not self._client or not self.state.connected: + logger.warning(f"[{self.serial_number}] Cannot pause print: not connected") + return False + + command = { + "print": { + "command": "pause", + "sequence_id": "0" + } + } + self._client.publish(self.topic_publish, json.dumps(command), qos=1) + logger.info(f"[{self.serial_number}] Sent pause print command") + return True + + def resume_print(self) -> bool: + """Resume a paused print job.""" + if not self._client or not self.state.connected: + logger.warning(f"[{self.serial_number}] Cannot resume print: not connected") + return False + + command = { + "print": { + "command": "resume", + "sequence_id": "0" + } + } + self._client.publish(self.topic_publish, json.dumps(command), qos=1) + logger.info(f"[{self.serial_number}] Sent resume print command") + return True + + def send_gcode(self, gcode: str) -> bool: + """Send G-code command(s) to the printer. + + Multiple commands can be separated by newlines. + + Args: + gcode: G-code command(s) to send + + Returns: + True if command was sent, False otherwise + """ + if not self._client or not self.state.connected: + logger.warning(f"[{self.serial_number}] Cannot send G-code: not connected") + return False + + self._sequence_id += 1 + command = { + "print": { + "command": "gcode_line", + "param": gcode, + "sequence_id": str(self._sequence_id) + } + } + self._client.publish(self.topic_publish, json.dumps(command)) + logger.debug(f"[{self.serial_number}] Sent G-code: {gcode[:50]}...") + return True + + def set_bed_temperature(self, target: int) -> bool: + """Set the bed target temperature. + + Args: + target: Target temperature in Celsius (0 to turn off) + + Returns: + True if command was sent, False otherwise + """ + # Use M140 for non-blocking (preferred when not waiting) + # Note: P1/A1 series with newer firmware may need M190 (blocking) + return self.send_gcode(f"M140 S{target}") + + def set_nozzle_temperature(self, target: int, nozzle: int = 0) -> bool: + """Set the nozzle target temperature. + + Args: + target: Target temperature in Celsius (0 to turn off) + nozzle: Nozzle index (0 for primary, 1 for secondary on H2D) + + Returns: + True if command was sent, False otherwise + """ + # Use M104 for non-blocking + # For dual nozzle (H2D), T parameter selects the tool + if nozzle == 0: + return self.send_gcode(f"M104 S{target}") + else: + return self.send_gcode(f"M104 T{nozzle} S{target}") + + def set_print_speed(self, mode: int) -> bool: + """Set the print speed mode. + + Args: + mode: Speed mode (1=silent, 2=standard, 3=sport, 4=ludicrous) + + Returns: + True if command was sent, False otherwise + """ + if not self._client or not self.state.connected: + logger.warning(f"[{self.serial_number}] Cannot set print speed: not connected") + return False + + if mode not in (1, 2, 3, 4): + logger.warning(f"[{self.serial_number}] Invalid speed mode: {mode}") + return False + + command = { + "print": { + "command": "print_speed", + "param": str(mode), + "sequence_id": "0" + } + } + self._client.publish(self.topic_publish, json.dumps(command)) + logger.info(f"[{self.serial_number}] Set print speed mode to {mode}") + return True + + def set_fan_speed(self, fan: int, speed: int) -> bool: + """Set fan speed. + + Args: + fan: Fan index (1=part cooling, 2=auxiliary, 3=chamber) + speed: Speed 0-255 (0=off, 255=full) + + Returns: + True if command was sent, False otherwise + """ + if fan not in (1, 2, 3): + logger.warning(f"[{self.serial_number}] Invalid fan index: {fan}") + return False + + speed = max(0, min(255, speed)) # Clamp to 0-255 + return self.send_gcode(f"M106 P{fan} S{speed}") + + def set_part_fan(self, speed: int) -> bool: + """Set part cooling fan speed (0-255).""" + return self.set_fan_speed(1, speed) + + def set_aux_fan(self, speed: int) -> bool: + """Set auxiliary fan speed (0-255).""" + return self.set_fan_speed(2, speed) + + def set_chamber_fan(self, speed: int) -> bool: + """Set chamber fan speed (0-255).""" + return self.set_fan_speed(3, speed) + + def set_chamber_light(self, on: bool) -> bool: + """Turn chamber light on or off. + + Args: + on: True to turn on, False to turn off + + Returns: + True if command was sent, False otherwise + """ + if not self._client or not self.state.connected: + logger.warning(f"[{self.serial_number}] Cannot set chamber light: not connected") + return False + + command = { + "system": { + "command": "ledctrl", + "led_node": "chamber_light", + "led_mode": "on" if on else "off", + "led_on_time": 500, + "led_off_time": 500, + "loop_times": 0, + "interval_time": 0, + "sequence_id": "0" + } + } + self._client.publish(self.topic_publish, json.dumps(command)) + logger.info(f"[{self.serial_number}] Set chamber light {'on' if on else 'off'}") + return True + + def home_axes(self, axes: str = "XYZ") -> bool: + """Home the specified axes. + + Args: + axes: Axes to home (e.g., "XYZ", "X", "XY", "Z") + + Returns: + True if command was sent, False otherwise + """ + # G28 homes all axes, G28 X Y Z homes specific axes + axes_param = " ".join(axes.upper()) + return self.send_gcode(f"G28 {axes_param}") + + def move_axis(self, axis: str, distance: float, speed: int = 3000) -> bool: + """Move an axis by a relative distance. + + Args: + axis: Axis to move ("X", "Y", or "Z") + distance: Distance to move in mm (positive or negative) + speed: Movement speed in mm/min + + Returns: + True if command was sent, False otherwise + """ + axis = axis.upper() + if axis not in ("X", "Y", "Z"): + logger.warning(f"[{self.serial_number}] Invalid axis: {axis}") + return False + + # G91 = relative mode, G0 = rapid move, G90 = back to absolute + gcode = f"G91\nG0 {axis}{distance:.2f} F{speed}\nG90" + return self.send_gcode(gcode) + + def disable_motors(self) -> bool: + """Disable all stepper motors. + + Warning: This will cause the printer to lose its position. + A homing operation will be required before printing. + + Returns: + True if command was sent, False otherwise + """ + return self.send_gcode("M18") + + def enable_motors(self) -> bool: + """Enable all stepper motors. + + Returns: + True if command was sent, False otherwise + """ + return self.send_gcode("M17") + + def ams_load_filament(self, tray_id: int) -> bool: + """Load filament from a specific AMS tray. + + Args: + tray_id: Tray ID (0-15 for AMS slots, or 254 for external spool) + + Returns: + True if command was sent, False otherwise + """ + if not self._client or not self.state.connected: + logger.warning(f"[{self.serial_number}] Cannot load filament: not connected") + return False + + command = { + "print": { + "command": "ams_change_filament", + "target": tray_id, + "sequence_id": "0" + } + } + self._client.publish(self.topic_publish, json.dumps(command)) + logger.info(f"[{self.serial_number}] Loading filament from tray {tray_id}") + return True + + def ams_unload_filament(self) -> bool: + """Unload the currently loaded filament. + + Returns: + True if command was sent, False otherwise + """ + if not self._client or not self.state.connected: + logger.warning(f"[{self.serial_number}] Cannot unload filament: not connected") + return False + + command = { + "print": { + "command": "ams_change_filament", + "target": 255, # 255 = unload + "sequence_id": "0" + } + } + self._client.publish(self.topic_publish, json.dumps(command)) + logger.info(f"[{self.serial_number}] Unloading filament") + return True + + def ams_control(self, action: str) -> bool: + """Control AMS operations. + + Args: + action: "resume", "reset", or "pause" + + Returns: + True if command was sent, False otherwise + """ + if not self._client or not self.state.connected: + logger.warning(f"[{self.serial_number}] Cannot control AMS: not connected") + return False + + if action not in ("resume", "reset", "pause"): + logger.warning(f"[{self.serial_number}] Invalid AMS action: {action}") + return False + + command = { + "print": { + "command": "ams_control", + "param": action, + "sequence_id": "0" + } + } + self._client.publish(self.topic_publish, json.dumps(command)) + logger.info(f"[{self.serial_number}] AMS control: {action}") + return True diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 2e8f89331..9e563c179 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -8,6 +8,7 @@ import { StatsPage } from './pages/StatsPage'; import { SettingsPage } from './pages/SettingsPage'; import { ProfilesPage } from './pages/ProfilesPage'; import { MaintenancePage } from './pages/MaintenancePage'; +import { ControlPage } from './pages/ControlPage'; import { useWebSocket } from './hooks/useWebSocket'; import { ThemeProvider } from './contexts/ThemeContext'; import { ToastProvider } from './contexts/ToastContext'; @@ -41,6 +42,7 @@ function App() { } /> } /> } /> + } /> } /> diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index e83f0e8ac..ed9d20438 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -523,6 +523,25 @@ export interface UpdateStatus { error: string | null; } +// Printer Control types +export interface ControlResponse { + success: boolean; + message: string; +} + +export interface ConfirmationRequired { + requires_confirmation: boolean; + token: string; + warning: string; + expires_in: number; +} + +export type ControlResult = ControlResponse | ConfirmationRequired; + +export function isConfirmationRequired(result: ControlResult): result is ConfirmationRequired { + return 'requires_confirmation' in result && result.requires_confirmation === true; +} + // Maintenance types export interface MaintenanceType { id: number; @@ -1045,4 +1064,85 @@ export const api = { `/maintenance/printers/${printerId}/hours?total_hours=${totalHours}`, { method: 'PATCH' } ), + + // Printer Control + pausePrint: (printerId: number) => + request(`/printers/${printerId}/control/pause`, { method: 'POST' }), + resumePrint: (printerId: number) => + request(`/printers/${printerId}/control/resume`, { method: 'POST' }), + stopPrint: (printerId: number, confirmToken?: string) => + request(`/printers/${printerId}/control/stop`, { + method: 'POST', + body: JSON.stringify({ confirm_token: confirmToken }), + }), + setBedTemperature: (printerId: number, target: number, confirmToken?: string) => + request(`/printers/${printerId}/control/temperature/bed`, { + method: 'POST', + body: JSON.stringify({ target, confirm_token: confirmToken }), + }), + setNozzleTemperature: (printerId: number, target: number, nozzle = 0, confirmToken?: string) => + request(`/printers/${printerId}/control/temperature/nozzle`, { + method: 'POST', + body: JSON.stringify({ target, nozzle, confirm_token: confirmToken }), + }), + setPrintSpeed: (printerId: number, mode: number) => + request(`/printers/${printerId}/control/speed`, { + method: 'POST', + body: JSON.stringify({ mode }), + }), + setPartFan: (printerId: number, speed: number) => + request(`/printers/${printerId}/control/fan/part`, { + method: 'POST', + body: JSON.stringify({ speed }), + }), + setAuxFan: (printerId: number, speed: number) => + request(`/printers/${printerId}/control/fan/aux`, { + method: 'POST', + body: JSON.stringify({ speed }), + }), + setChamberFan: (printerId: number, speed: number) => + request(`/printers/${printerId}/control/fan/chamber`, { + method: 'POST', + body: JSON.stringify({ speed }), + }), + setChamberLight: (printerId: number, on: boolean) => + request(`/printers/${printerId}/control/light`, { + method: 'POST', + body: JSON.stringify({ on }), + }), + homeAxes: (printerId: number, axes = 'XYZ', confirmToken?: string) => + request(`/printers/${printerId}/control/home`, { + method: 'POST', + body: JSON.stringify({ axes, confirm_token: confirmToken }), + }), + moveAxis: (printerId: number, axis: string, distance: number, speed = 3000, confirmToken?: string) => + request(`/printers/${printerId}/control/move`, { + method: 'POST', + body: JSON.stringify({ axis, distance, speed, confirm_token: confirmToken }), + }), + disableMotors: (printerId: number, confirmToken?: string) => + request(`/printers/${printerId}/control/motors/disable`, { + method: 'POST', + body: JSON.stringify({ confirm_token: confirmToken }), + }), + enableMotors: (printerId: number) => + request(`/printers/${printerId}/control/motors/enable`, { method: 'POST' }), + amsLoadFilament: (printerId: number, trayId: number) => + request(`/printers/${printerId}/control/ams/load`, { + method: 'POST', + body: JSON.stringify({ tray_id: trayId }), + }), + amsUnloadFilament: (printerId: number) => + request(`/printers/${printerId}/control/ams/unload`, { method: 'POST' }), + sendGcode: (printerId: number, command: string, confirmToken?: string) => + request(`/printers/${printerId}/control/gcode`, { + method: 'POST', + body: JSON.stringify({ command, confirm_token: confirmToken }), + }), + getCameraStreamUrl: (printerId: number, fps = 10) => + `${API_BASE}/printers/${printerId}/camera/stream?fps=${fps}`, + getCameraSnapshotUrl: (printerId: number) => + `${API_BASE}/printers/${printerId}/camera/snapshot`, + testCameraConnection: (printerId: number) => + request<{ success: boolean; message?: string; error?: string }>(`/printers/${printerId}/camera/test`), }; diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx index 9807f9ca0..b98abdda1 100644 --- a/frontend/src/components/Layout.tsx +++ b/frontend/src/components/Layout.tsx @@ -1,6 +1,6 @@ import { useState, useEffect, useCallback, useRef } from 'react'; import { NavLink, Outlet, useNavigate, useLocation } from 'react-router-dom'; -import { Printer, Archive, Calendar, BarChart3, Cloud, Settings, Sun, Moon, ChevronLeft, ChevronRight, Keyboard, Github, GripVertical, ArrowUpCircle, Wrench, type LucideIcon } from 'lucide-react'; +import { Printer, Archive, Calendar, BarChart3, Cloud, Settings, Sun, Moon, ChevronLeft, ChevronRight, Keyboard, Github, GripVertical, ArrowUpCircle, Wrench, Gamepad2, type LucideIcon } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { useTheme } from '../contexts/ThemeContext'; import { KeyboardShortcutsModal } from './KeyboardShortcutsModal'; @@ -16,6 +16,7 @@ interface NavItem { export const defaultNavItems: NavItem[] = [ { id: 'printers', to: '/', icon: Printer, labelKey: 'nav.printers' }, + { id: 'control', to: '/control', icon: Gamepad2, labelKey: 'nav.control' }, { id: 'archives', to: '/archives', icon: Archive, labelKey: 'nav.archives' }, { id: 'queue', to: '/queue', icon: Calendar, labelKey: 'nav.queue' }, { id: 'stats', to: '/stats', icon: BarChart3, labelKey: 'nav.stats' }, diff --git a/frontend/src/components/control/AMSPanel.tsx b/frontend/src/components/control/AMSPanel.tsx new file mode 100644 index 000000000..1dfd2ab1e --- /dev/null +++ b/frontend/src/components/control/AMSPanel.tsx @@ -0,0 +1,223 @@ +import { useState } from 'react'; +import { useMutation } from '@tanstack/react-query'; +import { api } from '../../api/client'; +import type { PrinterStatus } from '../../api/client'; +import { Package, Loader2, ArrowDown, ArrowUp } from 'lucide-react'; + +interface AMSPanelProps { + printerId: number; + status: PrinterStatus | null | undefined; +} + +interface AMSTray { + id: number; + color: string; + type: string; + remain: number; + active: boolean; +} + +interface AMSUnit { + id: number; + trays: AMSTray[]; +} + +// Parse AMS data from raw_data in status +function parseAMSData(status: PrinterStatus | null | undefined): AMSUnit[] { + // AMS data comes from raw MQTT data + // This is a simplified parser - actual data structure may vary + const rawData = (status as { raw_data?: { ams?: unknown[] } })?.raw_data; + if (!rawData?.ams) return []; + + try { + return (rawData.ams as Array<{ + id?: number; + tray?: Array<{ + id?: number; + tray_color?: string; + tray_type?: string; + remain?: number; + }>; + }>).map((unit) => ({ + id: unit.id ?? 0, + trays: (unit.tray ?? []).map((tray) => ({ + id: tray.id ?? 0, + color: tray.tray_color ?? 'FFFFFF', + type: tray.tray_type ?? 'Unknown', + remain: tray.remain ?? 0, + active: false, // Would need additional MQTT data to determine + })), + })); + } catch { + return []; + } +} + +function hexToRgb(hex: string): string { + // Handle RRGGBBAA format + const cleanHex = hex.replace('#', '').substring(0, 6); + const r = parseInt(cleanHex.substring(0, 2), 16) || 128; + const g = parseInt(cleanHex.substring(2, 4), 16) || 128; + const b = parseInt(cleanHex.substring(4, 6), 16) || 128; + return `rgb(${r}, ${g}, ${b})`; +} + +export function AMSPanel({ printerId, status }: AMSPanelProps) { + const isConnected = status?.connected ?? false; + const isPrinting = status?.state === 'RUNNING'; + const amsUnits = parseAMSData(status); + + const [selectedTray, setSelectedTray] = useState(null); + + const loadMutation = useMutation({ + mutationFn: (trayId: number) => api.amsLoadFilament(printerId, trayId), + }); + + const unloadMutation = useMutation({ + mutationFn: () => api.amsUnloadFilament(printerId), + }); + + const handleLoad = () => { + if (selectedTray !== null) { + loadMutation.mutate(selectedTray); + } + }; + + const handleUnload = () => { + unloadMutation.mutate(); + }; + + const isLoading = loadMutation.isPending || unloadMutation.isPending; + + if (amsUnits.length === 0) { + return ( +
+
+ +

AMS

+
+

+ No AMS detected or using external spool +

+
+ ); + } + + return ( +
+
+
+ +

AMS

+
+ {isLoading && } +
+ + {/* AMS Units */} + {amsUnits.map((unit) => ( +
+ {amsUnits.length > 1 && ( +
AMS {unit.id + 1}
+ )} +
+ {unit.trays.map((tray) => { + const globalTrayId = unit.id * 4 + tray.id; + const isSelected = selectedTray === globalTrayId; + const isEmpty = tray.type === 'NONE' || !tray.type; + + return ( + + ); + })} +
+
+ ))} + + {/* Load/Unload Controls */} +
+ + +
+ + {selectedTray !== null && ( +

+ Selected: Slot {(selectedTray % 4) + 1} + {amsUnits.length > 1 && ` (AMS ${Math.floor(selectedTray / 4) + 1})`} +

+ )} + + {isPrinting && ( +

+ Filament change disabled during print +

+ )} + + {(loadMutation.error || unloadMutation.error) && ( +

+ {(loadMutation.error || unloadMutation.error)?.message} +

+ )} +
+ ); +} diff --git a/frontend/src/components/control/CameraFeed.tsx b/frontend/src/components/control/CameraFeed.tsx new file mode 100644 index 000000000..f002c7594 --- /dev/null +++ b/frontend/src/components/control/CameraFeed.tsx @@ -0,0 +1,138 @@ +import { useState, useRef } from 'react'; +import { api } from '../../api/client'; +import { Camera, CameraOff, Maximize2, RefreshCw, Loader2 } from 'lucide-react'; + +interface CameraFeedProps { + printerId: number; + isConnected: boolean; +} + +export function CameraFeed({ printerId, isConnected }: CameraFeedProps) { + const [streamEnabled, setStreamEnabled] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const imgRef = useRef(null); + + const streamUrl = api.getCameraStreamUrl(printerId, 10); + + const handleToggleStream = () => { + if (streamEnabled) { + setStreamEnabled(false); + setError(null); + } else { + setIsLoading(true); + setError(null); + setStreamEnabled(true); + } + }; + + const handleImageLoad = () => { + setIsLoading(false); + setError(null); + }; + + const handleImageError = () => { + setIsLoading(false); + setError('Failed to load camera stream'); + }; + + const handleFullscreen = () => { + if (imgRef.current) { + if (document.fullscreenElement) { + document.exitFullscreen(); + } else { + imgRef.current.requestFullscreen(); + } + } + }; + + const handleRefresh = () => { + setStreamEnabled(false); + setTimeout(() => { + setIsLoading(true); + setStreamEnabled(true); + }, 100); + }; + + return ( +
+
+
+ + Camera +
+
+ {streamEnabled && ( + <> + + + + )} + +
+
+ +
+ {!streamEnabled ? ( +
+ + + {isConnected ? 'Click Start to view camera' : 'Printer not connected'} + +
+ ) : ( + <> + {isLoading && ( +
+ +
+ )} + {error ? ( +
+ + {error} + +
+ ) : ( + Camera stream + )} + + )} +
+
+ ); +} diff --git a/frontend/src/components/control/FanControls.tsx b/frontend/src/components/control/FanControls.tsx new file mode 100644 index 000000000..0445decce --- /dev/null +++ b/frontend/src/components/control/FanControls.tsx @@ -0,0 +1,135 @@ +import { useState } from 'react'; +import { useMutation } from '@tanstack/react-query'; +import { api } from '../../api/client'; +import type { PrinterStatus } from '../../api/client'; +import { Fan, Loader2 } from 'lucide-react'; + +interface FanControlsProps { + printerId: number; + status: PrinterStatus | null | undefined; +} + +interface FanSliderProps { + label: string; + value: number; + onChange: (value: number) => void; + disabled: boolean; + isLoading: boolean; +} + +function FanSlider({ label, value, onChange, disabled, isLoading }: FanSliderProps) { + const [localValue, setLocalValue] = useState(value); + const [isDragging, setIsDragging] = useState(false); + + const displayValue = isDragging ? localValue : value; + + const handleChange = (e: React.ChangeEvent) => { + const newValue = parseInt(e.target.value, 10); + setLocalValue(newValue); + }; + + const handleMouseUp = () => { + setIsDragging(false); + if (localValue !== value) { + onChange(localValue); + } + }; + + return ( +
+
+ {label} +
+ {displayValue}% + {isLoading && } +
+
+ setIsDragging(true)} + onMouseUp={handleMouseUp} + onTouchStart={() => setIsDragging(true)} + onTouchEnd={handleMouseUp} + disabled={disabled} + className="w-full h-2 bg-bambu-dark-tertiary rounded-lg appearance-none cursor-pointer disabled:cursor-not-allowed disabled:opacity-50 + [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-bambu-green [&::-webkit-slider-thumb]:cursor-pointer + [&::-moz-range-thumb]:w-4 [&::-moz-range-thumb]:h-4 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:bg-bambu-green [&::-moz-range-thumb]:border-0 [&::-moz-range-thumb]:cursor-pointer" + /> +
+ Off + Max +
+
+ ); +} + +export function FanControls({ printerId, status }: FanControlsProps) { + const isConnected = status?.connected ?? false; + + // Note: Bambu printers don't report fan speeds via MQTT + // So we track locally and can't show actual current values + const [fanValues, setFanValues] = useState({ + part: 100, + aux: 0, + chamber: 0, + }); + + const partFanMutation = useMutation({ + mutationFn: (speed: number) => api.setPartFan(printerId, speed), + onSuccess: (_, speed) => setFanValues((prev) => ({ ...prev, part: speed })), + }); + + const auxFanMutation = useMutation({ + mutationFn: (speed: number) => api.setAuxFan(printerId, speed), + onSuccess: (_, speed) => setFanValues((prev) => ({ ...prev, aux: speed })), + }); + + const chamberFanMutation = useMutation({ + mutationFn: (speed: number) => api.setChamberFan(printerId, speed), + onSuccess: (_, speed) => setFanValues((prev) => ({ ...prev, chamber: speed })), + }); + + return ( +
+
+ +

Fans

+
+ +
+ partFanMutation.mutate(v)} + disabled={!isConnected} + isLoading={partFanMutation.isPending} + /> + auxFanMutation.mutate(v)} + disabled={!isConnected} + isLoading={auxFanMutation.isPending} + /> + chamberFanMutation.mutate(v)} + disabled={!isConnected} + isLoading={chamberFanMutation.isPending} + /> +
+ + {(partFanMutation.error || auxFanMutation.error || chamberFanMutation.error) && ( +

+ {(partFanMutation.error || auxFanMutation.error || chamberFanMutation.error)?.message} +

+ )} +
+ ); +} diff --git a/frontend/src/components/control/LightToggle.tsx b/frontend/src/components/control/LightToggle.tsx new file mode 100644 index 000000000..9d03d0499 --- /dev/null +++ b/frontend/src/components/control/LightToggle.tsx @@ -0,0 +1,68 @@ +import { useState } from 'react'; +import { useMutation } from '@tanstack/react-query'; +import { api } from '../../api/client'; +import type { PrinterStatus } from '../../api/client'; +import { Lightbulb, LightbulbOff, Loader2 } from 'lucide-react'; + +interface LightToggleProps { + printerId: number; + status: PrinterStatus | null | undefined; +} + +export function LightToggle({ printerId, status }: LightToggleProps) { + const isConnected = status?.connected ?? false; + + // Note: Bambu printers don't report light state via standard MQTT + // Track locally + const [isOn, setIsOn] = useState(true); + + const lightMutation = useMutation({ + mutationFn: (on: boolean) => api.setChamberLight(printerId, on), + onSuccess: (_, on) => setIsOn(on), + }); + + const handleToggle = () => { + lightMutation.mutate(!isOn); + }; + + return ( +
+
+
+ {isOn ? ( + + ) : ( + + )} +

Chamber Light

+
+ + +
+ + {lightMutation.error && ( +

+ {lightMutation.error.message} +

+ )} +
+ ); +} diff --git a/frontend/src/components/control/MovementControls.tsx b/frontend/src/components/control/MovementControls.tsx new file mode 100644 index 000000000..3dc3feb1f --- /dev/null +++ b/frontend/src/components/control/MovementControls.tsx @@ -0,0 +1,235 @@ +import { useState } from 'react'; +import { useMutation } from '@tanstack/react-query'; +import { api, isConfirmationRequired } from '../../api/client'; +import type { PrinterStatus } from '../../api/client'; +import { Home, Move, Loader2, ChevronUp, ChevronDown, ChevronLeft, ChevronRight, Power } from 'lucide-react'; +import { ConfirmModal } from '../ConfirmModal'; + +interface MovementControlsProps { + printerId: number; + status: PrinterStatus | null | undefined; +} + +export function MovementControls({ printerId, status }: MovementControlsProps) { + const isConnected = status?.connected ?? false; + const isPrinting = status?.state === 'RUNNING' || status?.state === 'PAUSE'; + + const [confirmModal, setConfirmModal] = useState<{ + action: string; + token: string; + warning: string; + onConfirm: () => void; + } | null>(null); + + const [moveDistance, setMoveDistance] = useState(10); + + const homeMutation = useMutation({ + mutationFn: ({ axes, token }: { axes: string; token?: string }) => + api.homeAxes(printerId, axes, token), + onSuccess: (result) => { + if (isConfirmationRequired(result)) { + setConfirmModal({ + action: 'home', + token: result.token, + warning: result.warning, + onConfirm: () => homeMutation.mutate({ axes: 'XYZ', token: result.token }), + }); + } + }, + }); + + const moveMutation = useMutation({ + mutationFn: ({ axis, distance, token }: { axis: string; distance: number; token?: string }) => + api.moveAxis(printerId, axis, distance, 3000, token), + onSuccess: (result, variables) => { + if (isConfirmationRequired(result)) { + setConfirmModal({ + action: 'move', + token: result.token, + warning: result.warning, + onConfirm: () => + moveMutation.mutate({ + axis: variables.axis, + distance: variables.distance, + token: result.token, + }), + }); + } + }, + }); + + const disableMotorsMutation = useMutation({ + mutationFn: (token?: string) => api.disableMotors(printerId, token), + onSuccess: (result) => { + if (isConfirmationRequired(result)) { + setConfirmModal({ + action: 'disable', + token: result.token, + warning: result.warning, + onConfirm: () => disableMotorsMutation.mutate(result.token), + }); + } + }, + }); + + const handleHome = () => { + homeMutation.mutate({ axes: 'XYZ' }); + }; + + const handleMove = (axis: string, distance: number) => { + moveMutation.mutate({ axis, distance }); + }; + + const handleDisableMotors = () => { + disableMotorsMutation.mutate(undefined); + }; + + const handleConfirm = () => { + if (confirmModal) { + confirmModal.onConfirm(); + setConfirmModal(null); + } + }; + + const isLoading = + homeMutation.isPending || moveMutation.isPending || disableMotorsMutation.isPending; + + return ( + <> +
+
+
+ +

Movement

+
+ {isLoading && } +
+ + {isPrinting && ( +
+ Movement is restricted during printing +
+ )} + + {/* Distance Selector */} +
+ Distance: + {[1, 10, 50].map((d) => ( + + ))} +
+ + {/* Movement Grid */} +
+ {/* Row 1: Y+ */} +
+
+ +
+ + + {/* Row 2: X-, Home, X+ */} +
+ + + +
Z
+ + {/* Row 3: Y- */} +
+
+ +
+ +
+ + {/* Disable Motors */} + + + {(homeMutation.error || moveMutation.error || disableMotorsMutation.error) && ( +

+ {(homeMutation.error || moveMutation.error || disableMotorsMutation.error)?.message} +

+ )} +
+ + {/* Confirmation Modal */} + {confirmModal && ( + setConfirmModal(null)} + /> + )} + + ); +} diff --git a/frontend/src/components/control/PrintControls.tsx b/frontend/src/components/control/PrintControls.tsx new file mode 100644 index 000000000..c4cc2dc24 --- /dev/null +++ b/frontend/src/components/control/PrintControls.tsx @@ -0,0 +1,137 @@ +import { useState } from 'react'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { api, isConfirmationRequired } from '../../api/client'; +import type { PrinterStatus } from '../../api/client'; +import { Pause, Play, Square, Loader2 } from 'lucide-react'; +import { ConfirmModal } from '../ConfirmModal'; + +interface PrintControlsProps { + printerId: number; + status: PrinterStatus | null | undefined; +} + +export function PrintControls({ printerId, status }: PrintControlsProps) { + const queryClient = useQueryClient(); + const [confirmModal, setConfirmModal] = useState<{ + action: string; + token: string; + warning: string; + } | null>(null); + + const isConnected = status?.connected ?? false; + const isPrinting = status?.state === 'RUNNING'; + const isPaused = status?.state === 'PAUSE'; + + const pauseMutation = useMutation({ + mutationFn: () => api.pausePrint(printerId), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['printerStatuses'] }); + }, + }); + + const resumeMutation = useMutation({ + mutationFn: () => api.resumePrint(printerId), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['printerStatuses'] }); + }, + }); + + const stopMutation = useMutation({ + mutationFn: (token?: string) => api.stopPrint(printerId, token), + onSuccess: (result) => { + if (isConfirmationRequired(result)) { + setConfirmModal({ + action: 'stop', + token: result.token, + warning: result.warning, + }); + } else { + queryClient.invalidateQueries({ queryKey: ['printerStatuses'] }); + } + }, + }); + + const handleStop = () => { + stopMutation.mutate(undefined); + }; + + const handleConfirmStop = () => { + if (confirmModal) { + stopMutation.mutate(confirmModal.token); + setConfirmModal(null); + } + }; + + const isLoading = pauseMutation.isPending || resumeMutation.isPending || stopMutation.isPending; + + return ( + <> +
+

Print Controls

+ +
+ {/* Pause Button */} + + + {/* Resume Button */} + + + {/* Stop Button */} + +
+ + {/* Error Message */} + {(pauseMutation.error || resumeMutation.error || stopMutation.error) && ( +

+ {(pauseMutation.error || resumeMutation.error || stopMutation.error)?.message} +

+ )} +
+ + {/* Confirmation Modal */} + {confirmModal && ( + setConfirmModal(null)} + /> + )} + + ); +} diff --git a/frontend/src/components/control/PrintStatus.tsx b/frontend/src/components/control/PrintStatus.tsx new file mode 100644 index 000000000..ff576f062 --- /dev/null +++ b/frontend/src/components/control/PrintStatus.tsx @@ -0,0 +1,90 @@ +import type { PrinterStatus } from '../../api/client'; +import { Clock, Layers, FileText } from 'lucide-react'; + +interface PrintStatusProps { + printerId: number; + status: PrinterStatus | null | undefined; +} + +function formatTime(seconds: number | null | undefined): string { + if (!seconds) return '--:--'; + const hours = Math.floor(seconds / 3600); + const mins = Math.floor((seconds % 3600) / 60); + if (hours > 0) { + return `${hours}h ${mins}m`; + } + return `${mins}m`; +} + +export function PrintStatus({ status }: PrintStatusProps) { + const isPrinting = status?.state === 'RUNNING' || status?.state === 'PAUSE'; + const progress = status?.progress ?? 0; + + return ( +
+
+

Print Status

+ + {status?.state || 'IDLE'} + +
+ + {isPrinting && status?.subtask_name && ( +
+ + + {status.subtask_name} + +
+ )} + + {/* Progress Bar */} +
+
+ Progress + {Math.round(progress)}% +
+
+
+
+
+ + {/* Stats */} +
+
+ +
+
Remaining
+
{formatTime(status?.remaining_time)}
+
+
+
+ +
+
Layer
+
+ {status?.layer_num ?? 0} / {status?.total_layers ?? 0} +
+
+
+
+
+ ); +} diff --git a/frontend/src/components/control/SpeedControl.tsx b/frontend/src/components/control/SpeedControl.tsx new file mode 100644 index 000000000..0fed7b017 --- /dev/null +++ b/frontend/src/components/control/SpeedControl.tsx @@ -0,0 +1,71 @@ +import { useMutation } from '@tanstack/react-query'; +import { api } from '../../api/client'; +import type { PrinterStatus } from '../../api/client'; +import { Gauge, Loader2 } from 'lucide-react'; + +interface SpeedControlProps { + printerId: number; + status: PrinterStatus | null | undefined; +} + +const SPEED_MODES = [ + { mode: 1, name: 'Silent', icon: '🔇' }, + { mode: 2, name: 'Standard', icon: '⚡' }, + { mode: 3, name: 'Sport', icon: '🚀' }, + { mode: 4, name: 'Ludicrous', icon: '💨' }, +]; + +export function SpeedControl({ printerId, status }: SpeedControlProps) { + const isConnected = status?.connected ?? false; + const isPrinting = status?.state === 'RUNNING'; + + // Note: Bambu printers don't report current speed mode via MQTT + // So we can't show which mode is currently active + + const speedMutation = useMutation({ + mutationFn: (mode: number) => api.setPrintSpeed(printerId, mode), + }); + + return ( +
+
+ +

Print Speed

+ {speedMutation.isPending && ( + + )} +
+ +
+ {SPEED_MODES.map(({ mode, name, icon }) => ( + + ))} +
+ + {!isPrinting && ( +

+ Speed control only available during print +

+ )} + + {speedMutation.error && ( +

+ {speedMutation.error.message} +

+ )} +
+ ); +} diff --git a/frontend/src/components/control/TemperaturePanel.tsx b/frontend/src/components/control/TemperaturePanel.tsx new file mode 100644 index 000000000..ed9bb3628 --- /dev/null +++ b/frontend/src/components/control/TemperaturePanel.tsx @@ -0,0 +1,246 @@ +import { useState } from 'react'; +import { useMutation } from '@tanstack/react-query'; +import { api, isConfirmationRequired } from '../../api/client'; +import type { PrinterStatus } from '../../api/client'; +import { Thermometer, Loader2, Plus, Minus } from 'lucide-react'; +import { ConfirmModal } from '../ConfirmModal'; + +// Extended temperature interface for dual nozzle support +interface Temperatures { + bed?: number; + bed_target?: number; + nozzle?: number; + nozzle_target?: number; + nozzle_2?: number; + nozzle_2_target?: number; + chamber?: number; +} + +interface TemperaturePanelProps { + printerId: number; + status: PrinterStatus | null | undefined; + nozzleCount: number; +} + +interface TempPreset { + name: string; + bed: number; + nozzle: number; +} + +const PRESETS: TempPreset[] = [ + { name: 'Off', bed: 0, nozzle: 0 }, + { name: 'PLA', bed: 55, nozzle: 220 }, + { name: 'PETG', bed: 70, nozzle: 250 }, + { name: 'ABS', bed: 90, nozzle: 260 }, + { name: 'TPU', bed: 50, nozzle: 230 }, +]; + +export function TemperaturePanel({ printerId, status, nozzleCount }: TemperaturePanelProps) { + const [confirmModal, setConfirmModal] = useState<{ + type: 'bed' | 'nozzle'; + target: number; + nozzle?: number; + token: string; + warning: string; + } | null>(null); + + const isConnected = status?.connected ?? false; + const temps = (status?.temperatures ?? {}) as Temperatures; + + const bedMutation = useMutation({ + mutationFn: ({ target, token }: { target: number; token?: string }) => + api.setBedTemperature(printerId, target, token), + onSuccess: (result, variables) => { + if (isConfirmationRequired(result)) { + setConfirmModal({ + type: 'bed', + target: variables.target, + token: result.token, + warning: result.warning, + }); + } + }, + }); + + const nozzleMutation = useMutation({ + mutationFn: ({ target, nozzle, token }: { target: number; nozzle: number; token?: string }) => + api.setNozzleTemperature(printerId, target, nozzle, token), + onSuccess: (result, variables) => { + if (isConfirmationRequired(result)) { + setConfirmModal({ + type: 'nozzle', + target: variables.target, + nozzle: variables.nozzle, + token: result.token, + warning: result.warning, + }); + } + }, + }); + + const handleConfirm = () => { + if (confirmModal) { + if (confirmModal.type === 'bed') { + bedMutation.mutate({ target: confirmModal.target, token: confirmModal.token }); + } else { + nozzleMutation.mutate({ + target: confirmModal.target, + nozzle: confirmModal.nozzle ?? 0, + token: confirmModal.token, + }); + } + setConfirmModal(null); + } + }; + + const handlePreset = (preset: TempPreset) => { + bedMutation.mutate({ target: preset.bed }); + nozzleMutation.mutate({ target: preset.nozzle, nozzle: 0 }); + if (nozzleCount > 1) { + nozzleMutation.mutate({ target: preset.nozzle, nozzle: 1 }); + } + }; + + const adjustTemp = (type: 'bed' | 'nozzle', delta: number, nozzle = 0) => { + const currentTarget = + type === 'bed' + ? (temps.bed_target ?? 0) + : nozzle === 0 + ? (temps.nozzle_target ?? 0) + : (temps.nozzle_2_target ?? 0); + const newTarget = Math.max(0, Math.min(type === 'bed' ? 120 : 300, currentTarget + delta)); + + if (type === 'bed') { + bedMutation.mutate({ target: newTarget }); + } else { + nozzleMutation.mutate({ target: newTarget, nozzle }); + } + }; + + return ( + <> +
+
+ +

Temperatures

+
+ + {/* Presets */} +
+ {PRESETS.map((preset) => ( + + ))} +
+ + {/* Bed Temperature */} +
+
+ Bed + + {Math.round(temps.bed ?? 0)}°C + / + {Math.round(temps.bed_target ?? 0)}°C + +
+
+ +
+
+
+ + {bedMutation.isPending && } +
+
+ + {/* Nozzle Temperature(s) */} + {[0, ...(nozzleCount > 1 ? [1] : [])].map((nozzle) => { + const current = nozzle === 0 ? temps.nozzle : temps.nozzle_2; + const target = nozzle === 0 ? temps.nozzle_target : temps.nozzle_2_target; + + return ( +
+
+ + Nozzle {nozzleCount > 1 ? nozzle + 1 : ''} + + + {Math.round(current ?? 0)}°C + / + {Math.round(target ?? 0)}°C + +
+
+ +
+
+
+ + {nozzleMutation.isPending && } +
+
+ ); + })} + + {/* Chamber Temperature (read-only) */} + {temps.chamber !== undefined && ( +
+
+ Chamber + {Math.round(temps.chamber)}°C +
+
+ )} +
+ + {/* Confirmation Modal */} + {confirmModal && ( + setConfirmModal(null)} + /> + )} + + ); +} diff --git a/frontend/src/i18n/locales/de.ts b/frontend/src/i18n/locales/de.ts index 686c4be56..230b26754 100644 --- a/frontend/src/i18n/locales/de.ts +++ b/frontend/src/i18n/locales/de.ts @@ -2,6 +2,7 @@ export default { // Navigation nav: { printers: 'Drucker', + control: 'Steuerung', archives: 'Archiv', queue: 'Warteschlange', stats: 'Statistiken', diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts index a853b8012..d62c2d505 100644 --- a/frontend/src/i18n/locales/en.ts +++ b/frontend/src/i18n/locales/en.ts @@ -2,6 +2,7 @@ export default { // Navigation nav: { printers: 'Printers', + control: 'Control', archives: 'Archives', queue: 'Queue', stats: 'Statistics', diff --git a/frontend/src/pages/ControlPage.tsx b/frontend/src/pages/ControlPage.tsx new file mode 100644 index 000000000..78a14c727 --- /dev/null +++ b/frontend/src/pages/ControlPage.tsx @@ -0,0 +1,207 @@ +import { useState, useEffect } from 'react'; +import { useQuery } from '@tanstack/react-query'; +import { useSearchParams } from 'react-router-dom'; +import { api } from '../api/client'; +import type { PrinterStatus } from '../api/client'; +import { CameraFeed } from '../components/control/CameraFeed'; +import { PrintStatus } from '../components/control/PrintStatus'; +import { PrintControls } from '../components/control/PrintControls'; +import { TemperaturePanel } from '../components/control/TemperaturePanel'; +import { SpeedControl } from '../components/control/SpeedControl'; +import { FanControls } from '../components/control/FanControls'; +import { LightToggle } from '../components/control/LightToggle'; +import { MovementControls } from '../components/control/MovementControls'; +import { AMSPanel } from '../components/control/AMSPanel'; +import { Loader2, WifiOff } from 'lucide-react'; + +export function ControlPage() { + const [searchParams, setSearchParams] = useSearchParams(); + const [selectedPrinterId, setSelectedPrinterId] = useState(null); + + // Fetch all printers + const { data: printers, isLoading: loadingPrinters } = useQuery({ + queryKey: ['printers'], + queryFn: api.getPrinters, + }); + + // Get statuses for all printers + const { data: statuses } = useQuery({ + queryKey: ['printerStatuses'], + queryFn: async () => { + if (!printers) return {}; + const statusMap: Record = {}; + await Promise.all( + printers.map(async (p) => { + try { + statusMap[p.id] = await api.getPrinterStatus(p.id); + } catch { + // Printer offline + } + }) + ); + return statusMap; + }, + enabled: !!printers && printers.length > 0, + refetchInterval: 2000, + }); + + // Initialize selected printer from URL or first printer + useEffect(() => { + const printerParam = searchParams.get('printer'); + if (printerParam) { + const id = parseInt(printerParam, 10); + if (!isNaN(id)) { + setSelectedPrinterId(id); + return; + } + } + // Default to first printer + if (printers && printers.length > 0 && !selectedPrinterId) { + setSelectedPrinterId(printers[0].id); + } + }, [printers, searchParams, selectedPrinterId]); + + // Update URL when printer changes + const handlePrinterSelect = (printerId: number) => { + setSelectedPrinterId(printerId); + setSearchParams({ printer: String(printerId) }); + }; + + const selectedPrinter = printers?.find((p) => p.id === selectedPrinterId); + const selectedStatus = selectedPrinterId ? statuses?.[selectedPrinterId] : null; + + if (loadingPrinters) { + return ( +
+ +
+ ); + } + + if (!printers || printers.length === 0) { + return ( +
+ +

No printers configured

+

Add a printer in the Printers page first

+
+ ); + } + + return ( +
+ {/* Printer Tabs */} +
+
+ {printers.map((printer) => { + const status = statuses?.[printer.id]; + const isConnected = status?.connected ?? false; + const isSelected = printer.id === selectedPrinterId; + + return ( + + ); + })} +
+
+ + {/* Main Content */} + {selectedPrinter && ( +
+
+ {/* Connection Warning */} + {!selectedStatus?.connected && ( +
+ + + Printer is not connected. Controls are disabled. + +
+ )} + +
+ {/* Left Column: Camera + Print Status */} +
+ {/* Camera Feed */} + + + {/* Print Status & Controls */} + + + + {/* AMS Panel */} + +
+ + {/* Right Column: Controls */} +
+ {/* Temperature Panel */} + + + {/* Speed Control */} + + + {/* Fan Controls */} + + + {/* Light Toggle */} + + + {/* Movement Controls */} + +
+
+
+
+ )} +
+ ); +} diff --git a/static/assets/index-4olH2ask.css b/static/assets/index-4olH2ask.css deleted file mode 100644 index 951d3883e..000000000 --- a/static/assets/index-4olH2ask.css +++ /dev/null @@ -1 +0,0 @@ -@import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";@layer properties,theme,base,components,utilities;@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-700:oklch(37.3% .034 259.733);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-widest:.1em;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--aspect-video:16/9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bambu-green:#00ae42;--color-bambu-green-light:#00c64d;--color-bambu-green-dark:#009438;--color-bambu-dark:var(--bg-primary);--color-bambu-dark-secondary:var(--bg-secondary);--color-bambu-dark-tertiary:var(--bg-tertiary);--color-bambu-gray:var(--text-muted);--color-bambu-gray-light:var(--text-secondary);--color-bambu-gray-dark:var(--text-tertiary)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.-top-1{top:calc(var(--spacing)*-1)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-\[2px\]{top:2px}.top-full{top:100%}.-right-1{right:calc(var(--spacing)*-1)}.right-0{right:calc(var(--spacing)*0)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.right-12{right:calc(var(--spacing)*12)}.bottom-1{bottom:calc(var(--spacing)*1)}.bottom-2{bottom:calc(var(--spacing)*2)}.bottom-4{bottom:calc(var(--spacing)*4)}.bottom-6{bottom:calc(var(--spacing)*6)}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-2\.5{left:calc(var(--spacing)*2.5)}.left-3{left:calc(var(--spacing)*3)}.left-4{left:calc(var(--spacing)*4)}.left-12{left:calc(var(--spacing)*12)}.left-\[2px\]{left:2px}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-60,.z-\[60\]{z-index:60}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-4{grid-column:span 4/span 4}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-8{margin-block:calc(var(--spacing)*8)}.-mt-2{margin-top:calc(var(--spacing)*-2)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-8{margin-left:calc(var(--spacing)*8)}.ml-16{margin-left:calc(var(--spacing)*16)}.ml-64{margin-left:calc(var(--spacing)*64)}.ml-auto{margin-left:auto}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-28{height:calc(var(--spacing)*28)}.h-64{height:calc(var(--spacing)*64)}.h-\[80vh\]{height:80vh}.h-\[160px\]{height:160px}.h-full{height:100%}.max-h-40{max-height:calc(var(--spacing)*40)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[60vh\]{max-height:60vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[48px\]{min-height:48px}.min-h-\[120px\]{min-height:120px}.min-h-\[400px\]{min-height:400px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-28{width:calc(var(--spacing)*28)}.w-32{width:calc(var(--spacing)*32)}.w-36{width:calc(var(--spacing)*36)}.w-40{width:calc(var(--spacing)*40)}.w-48{width:calc(var(--spacing)*48)}.w-64{width:calc(var(--spacing)*64)}.w-80{width:calc(var(--spacing)*80)}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[90vw\]{max-width:90vw}.max-w-\[100px\]{max-width:100px}.max-w-\[200px\]{max-width:200px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-48{min-width:calc(var(--spacing)*48)}.min-w-\[70px\]{min-width:70px}.min-w-\[80px\]{min-width:80px}.min-w-\[120px\]{min-width:120px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.-rotate-90{rotate:-90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-bambu-dark-tertiary>:not(:last-child)){border-color:var(--color-bambu-dark-tertiary)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-bambu-dark-tertiary{border-color:var(--color-bambu-dark-tertiary)}.border-bambu-green{border-color:var(--color-bambu-green)}.border-bambu-green\/30{border-color:#00ae424d}@supports (color:color-mix(in lab,red,red)){.border-bambu-green\/30{border-color:color-mix(in oklab,var(--color-bambu-green)30%,transparent)}}.border-bambu-green\/50{border-color:#00ae4280}@supports (color:color-mix(in lab,red,red)){.border-bambu-green\/50{border-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/30{border-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.border-gray-700{border-color:var(--color-gray-700)}.border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500)30%,transparent)}}.border-green-500\/50{border-color:#00c75880}@supports (color:color-mix(in lab,red,red)){.border-green-500\/50{border-color:color-mix(in oklab,var(--color-green-500)50%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.border-red-500\/50{border-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.border-red-500\/50{border-color:color-mix(in oklab,var(--color-red-500)50%,transparent)}}.border-transparent{border-color:#0000}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.border-yellow-500{border-color:var(--color-yellow-500)}.border-yellow-500\/30{border-color:#edb2004d}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/30{border-color:color-mix(in oklab,var(--color-yellow-500)30%,transparent)}}.border-yellow-500\/50{border-color:#edb20080}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/50{border-color:color-mix(in oklab,var(--color-yellow-500)50%,transparent)}}.border-t-transparent{border-top-color:#0000}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.bg-bambu-dark{background-color:var(--color-bambu-dark)}.bg-bambu-dark-secondary,.bg-bambu-dark-secondary\/90{background-color:var(--color-bambu-dark-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-secondary\/90{background-color:color-mix(in oklab,var(--color-bambu-dark-secondary)90%,transparent)}}.bg-bambu-dark-tertiary,.bg-bambu-dark-tertiary\/50{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-tertiary\/50{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)50%,transparent)}}.bg-bambu-dark\/30{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/30{background-color:color-mix(in oklab,var(--color-bambu-dark)30%,transparent)}}.bg-bambu-dark\/50{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/50{background-color:color-mix(in oklab,var(--color-bambu-dark)50%,transparent)}}.bg-bambu-dark\/80{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/80{background-color:color-mix(in oklab,var(--color-bambu-dark)80%,transparent)}}.bg-bambu-dark\/90{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/90{background-color:color-mix(in oklab,var(--color-bambu-dark)90%,transparent)}}.bg-bambu-gray\/20{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/20{background-color:color-mix(in oklab,var(--color-bambu-gray)20%,transparent)}}.bg-bambu-gray\/30{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/30{background-color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.bg-bambu-green{background-color:var(--color-bambu-green)}.bg-bambu-green\/10{background-color:#00ae421a}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/10{background-color:color-mix(in oklab,var(--color-bambu-green)10%,transparent)}}.bg-bambu-green\/20{background-color:#00ae4233}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/20{background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.bg-bambu-green\/30{background-color:#00ae424d}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/30{background-color:color-mix(in oklab,var(--color-bambu-green)30%,transparent)}}.bg-bambu-green\/50{background-color:#00ae4280}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/50{background-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.bg-bambu-green\/75{background-color:#00ae42bf}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/75{background-color:color-mix(in oklab,var(--color-bambu-green)75%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black)60%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black)70%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.bg-black\/90{background-color:#000000e6}@supports (color:color-mix(in lab,red,red)){.bg-black\/90{background-color:color-mix(in oklab,var(--color-black)90%,transparent)}}.bg-blue-400\/10{background-color:#54a2ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-400\/10{background-color:color-mix(in oklab,var(--color-blue-400)10%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.bg-gray-400\/10{background-color:#99a1af1a}@supports (color:color-mix(in lab,red,red)){.bg-gray-400\/10{background-color:color-mix(in oklab,var(--color-gray-400)10%,transparent)}}.bg-gray-500\/20{background-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/20{background-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.bg-green-400{background-color:var(--color-green-400)}.bg-green-400\/10{background-color:#05df721a}@supports (color:color-mix(in lab,red,red)){.bg-green-400\/10{background-color:color-mix(in oklab,var(--color-green-400)10%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/20{background-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.bg-orange-400\/10{background-color:#ff8b1a1a}@supports (color:color-mix(in lab,red,red)){.bg-orange-400\/10{background-color:color-mix(in oklab,var(--color-orange-400)10%,transparent)}}.bg-orange-500\/20{background-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/20{background-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/20{background-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.bg-purple-500\/80{background-color:#ac4bffcc}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/80{background-color:color-mix(in oklab,var(--color-purple-500)80%,transparent)}}.bg-red-400{background-color:var(--color-red-400)}.bg-red-400\/10{background-color:#ff65681a}@supports (color:color-mix(in lab,red,red)){.bg-red-400\/10{background-color:color-mix(in oklab,var(--color-red-400)10%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.bg-red-500\/15{background-color:#fb2c3626}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/15{background-color:color-mix(in oklab,var(--color-red-500)15%,transparent)}}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.bg-red-500\/30{background-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/30{background-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.bg-red-500\/80{background-color:#fb2c36cc}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/80{background-color:color-mix(in oklab,var(--color-red-500)80%,transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-400\/10{background-color:#fac8001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-400\/10{background-color:color-mix(in oklab,var(--color-yellow-400)10%,transparent)}}.bg-yellow-400\/20{background-color:#fac80033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-400\/20{background-color:color-mix(in oklab,var(--color-yellow-400)20%,transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/20{background-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}.fill-yellow-400{fill:var(--color-yellow-400)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-left{object-position:left}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-12{padding:calc(var(--spacing)*12)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-8{padding-left:calc(var(--spacing)*8)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-400{color:var(--color-amber-400)}.text-bambu-dark-tertiary{color:var(--color-bambu-dark-tertiary)}.text-bambu-gray{color:var(--color-bambu-gray)}.text-bambu-gray-light{color:var(--color-bambu-gray-light)}.text-bambu-gray\/30{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/30{color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.text-bambu-gray\/50{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/50{color:color-mix(in oklab,var(--color-bambu-gray)50%,transparent)}}.text-bambu-gray\/70{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/70{color:color-mix(in oklab,var(--color-bambu-gray)70%,transparent)}}.text-bambu-green{color:var(--color-bambu-green)}.text-blue-400{color:var(--color-blue-400)}.text-gray-400{color:var(--color-gray-400)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-orange-400{color:var(--color-orange-400)}.text-purple-400{color:var(--color-purple-400)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-white{color:var(--color-white)}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.placeholder-bambu-gray::placeholder,.placeholder-bambu-gray\/50::placeholder{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.placeholder-bambu-gray\/50::placeholder{color:color-mix(in oklab,var(--color-bambu-gray)50%,transparent)}}.accent-bambu-green{accent-color:var(--color-bambu-green)}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-bambu-green{--tw-ring-color:var(--color-bambu-green)}.ring-white{--tw-ring-color:var(--color-white)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}@media(hover:hover){.group-hover\:text-bambu-green:is(:where(.group):hover *){color:var(--color-bambu-green)}.group-hover\:opacity-50:is(:where(.group):hover *){opacity:.5}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.peer-checked\:bg-bambu-green:is(:where(.peer):checked~*){background-color:var(--color-bambu-green)}.peer-focus\:outline-none:is(:where(.peer):focus~*){--tw-outline-style:none;outline-style:none}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:top-0:before{content:var(--tw-content);top:calc(var(--spacing)*0)}.before\:right-0:before{content:var(--tw-content);right:calc(var(--spacing)*0)}.before\:left-0:before{content:var(--tw-content);left:calc(var(--spacing)*0)}.before\:h-0\.5:before{content:var(--tw-content);height:calc(var(--spacing)*.5)}.before\:bg-bambu-green:before{content:var(--tw-content);background-color:var(--color-bambu-green)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:h-4:after{content:var(--tw-content);height:calc(var(--spacing)*4)}.after\:h-5:after{content:var(--tw-content);height:calc(var(--spacing)*5)}.after\:w-4:after{content:var(--tw-content);width:calc(var(--spacing)*4)}.after\:w-5:after{content:var(--tw-content);width:calc(var(--spacing)*5)}.after\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.after\:bg-white:after{content:var(--tw-content);background-color:var(--color-white)}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.peer-checked\:after\:translate-x-full:is(:where(.peer):checked~*):after{content:var(--tw-content);--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.peer-checked\:after\:border-white:is(:where(.peer):checked~*):after{content:var(--tw-content);border-color:var(--color-white)}@media(hover:hover){.hover\:border-bambu-gray:hover{border-color:var(--color-bambu-gray)}.hover\:border-bambu-green:hover{border-color:var(--color-bambu-green)}.hover\:border-white\/40:hover{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.hover\:border-white\/40:hover{border-color:color-mix(in oklab,var(--color-white)40%,transparent)}}.hover\:bg-bambu-dark:hover{background-color:var(--color-bambu-dark)}.hover\:bg-bambu-dark-secondary:hover{background-color:var(--color-bambu-dark-secondary)}.hover\:bg-bambu-dark-tertiary:hover,.hover\:bg-bambu-dark-tertiary\/30:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/30:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)30%,transparent)}}.hover\:bg-bambu-dark-tertiary\/50:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/50:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)50%,transparent)}}.hover\:bg-bambu-dark-tertiary\/70:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/70:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)70%,transparent)}}.hover\:bg-bambu-dark-tertiary\/80:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/80:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)80%,transparent)}}.hover\:bg-bambu-gray-dark:hover{background-color:var(--color-bambu-gray-dark)}.hover\:bg-bambu-green-dark:hover{background-color:var(--color-bambu-green-dark)}.hover\:bg-bambu-green-light:hover{background-color:var(--color-bambu-green-light)}.hover\:bg-bambu-green\/20:hover{background-color:#00ae4233}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/20:hover{background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.hover\:bg-black\/70:hover{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/70:hover{background-color:color-mix(in oklab,var(--color-black)70%,transparent)}}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-red-400\/10:hover{background-color:#ff65681a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-400\/10:hover{background-color:color-mix(in oklab,var(--color-red-400)10%,transparent)}}.hover\:bg-red-500\/10:hover{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/10:hover{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-yellow-600:hover{background-color:var(--color-yellow-600)}.hover\:text-bambu-green:hover{color:var(--color-bambu-green)}.hover\:text-bambu-green\/80:hover{color:#00ae42cc}@supports (color:color-mix(in lab,red,red)){.hover\:text-bambu-green\/80:hover{color:color-mix(in oklab,var(--color-bambu-green)80%,transparent)}}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}}.focus\:border-bambu-green:focus{border-color:var(--color-bambu-green)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-bambu-gray:focus{--tw-ring-color:var(--color-bambu-gray)}.focus\:ring-bambu-green:focus{--tw-ring-color:var(--color-bambu-green)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-bambu-dark:focus{--tw-ring-offset-color:var(--color-bambu-dark)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:h-4{height:calc(var(--spacing)*4)}.sm\:w-4{width:calc(var(--spacing)*4)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:p-1\.5{padding:calc(var(--spacing)*1.5)}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media(min-width:64rem){.lg\:w-80{width:calc(var(--spacing)*80)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}}@media(min-width:80rem){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&\:\:-webkit-slider-thumb\]\:h-3::-webkit-slider-thumb{height:calc(var(--spacing)*3)}.\[\&\:\:-webkit-slider-thumb\]\:w-3::-webkit-slider-thumb{width:calc(var(--spacing)*3)}.\[\&\:\:-webkit-slider-thumb\]\:cursor-pointer::-webkit-slider-thumb{cursor:pointer}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:bg-bambu-green::-webkit-slider-thumb{background-color:var(--color-bambu-green)}}:root{--bg-primary:#f5f5f5;--bg-secondary:#fff;--bg-tertiary:#e5e5e5;--text-primary:#1a1a1a;--text-secondary:#4a4a4a;--text-muted:#6b6b6b;--text-tertiary:gray;--border-color:#d4d4d4;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,system-ui,sans-serif;font-weight:400;line-height:1.5}.dark{--bg-primary:#1a1a1a;--bg-secondary:#2d2d2d;--bg-tertiary:#3d3d3d;--text-primary:#fff;--text-secondary:#a0a0a0;--text-muted:gray;--text-tertiary:#4a4a4a;--border-color:#3d3d3d}body{background-color:var(--bg-primary);color:var(--text-primary);min-height:100vh;margin:0;transition:background-color .2s,color .2s}#root{min-height:100vh}.text-white{color:var(--text-primary)}.bg-bambu-dark,.bg-bambu-dark-secondary,.bg-bambu-dark-tertiary,.border-bambu-dark-tertiary{transition:background-color .2s,border-color .2s}@keyframes slide-in{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.animate-slide-in{animation:.2s ease-out slide-in}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}} diff --git a/static/assets/index-soeWpmRO.js b/static/assets/index-CLsUm3wk.js similarity index 53% rename from static/assets/index-soeWpmRO.js rename to static/assets/index-CLsUm3wk.js index 7eee36d0f..0185c3728 100644 --- a/static/assets/index-soeWpmRO.js +++ b/static/assets/index-CLsUm3wk.js @@ -1,18 +1,18 @@ -function Dte(t,e){for(var n=0;ni[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))i(r);new MutationObserver(r=>{for(const a of r)if(a.type==="childList")for(const s of a.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&i(s)}).observe(document,{childList:!0,subtree:!0});function n(r){const a={};return r.integrity&&(a.integrity=r.integrity),r.referrerPolicy&&(a.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?a.credentials="include":r.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function i(r){if(r.ep)return;r.ep=!0;const a=n(r);fetch(r.href,a)}})();var yy=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Ks(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var fA={exports:{}},bg={};var O4;function Ote(){if(O4)return bg;O4=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(i,r,a){var s=null;if(a!==void 0&&(s=""+a),r.key!==void 0&&(s=""+r.key),"key"in r){a={};for(var o in r)o!=="key"&&(a[o]=r[o])}else a=r;return r=a.ref,{$$typeof:t,type:i,key:s,ref:r!==void 0?r:null,props:a}}return bg.Fragment=e,bg.jsx=n,bg.jsxs=n,bg}var k4;function kte(){return k4||(k4=1,fA.exports=Ote()),fA.exports}var g=kte(),hA={exports:{}},Xt={};var L4;function Lte(){if(L4)return Xt;L4=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),r=Symbol.for("react.profiler"),a=Symbol.for("react.consumer"),s=Symbol.for("react.context"),o=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),c=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),f=Symbol.for("react.activity"),p=Symbol.iterator;function m(B){return B===null||typeof B!="object"?null:(B=p&&B[p]||B["@@iterator"],typeof B=="function"?B:null)}var b={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function x(B,X,ae){this.props=B,this.context=X,this.refs=v,this.updater=ae||b}x.prototype.isReactComponent={},x.prototype.setState=function(B,X){if(typeof B!="object"&&typeof B!="function"&&B!=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,B,X,"setState")},x.prototype.forceUpdate=function(B){this.updater.enqueueForceUpdate(this,B,"forceUpdate")};function M(){}M.prototype=x.prototype;function w(B,X,ae){this.props=B,this.context=X,this.refs=v,this.updater=ae||b}var E=w.prototype=new M;E.constructor=w,_(E,x.prototype),E.isPureReactComponent=!0;var T=Array.isArray;function P(){}var N={H:null,A:null,T:null,S:null},U=Object.prototype.hasOwnProperty;function C(B,X,ae){var ce=ae.ref;return{$$typeof:t,type:B,key:X,ref:ce!==void 0?ce:null,props:ae}}function D(B,X){return C(B.type,X,B.props)}function F(B){return typeof B=="object"&&B!==null&&B.$$typeof===t}function I(B){var X={"=":"=0",":":"=2"};return"$"+B.replace(/[=:]/g,function(ae){return X[ae]})}var q=/\/+/g;function L(B,X){return typeof B=="object"&&B!==null&&B.key!=null?I(""+B.key):X.toString(36)}function H(B){switch(B.status){case"fulfilled":return B.value;case"rejected":throw B.reason;default:switch(typeof B.status=="string"?B.then(P,P):(B.status="pending",B.then(function(X){B.status==="pending"&&(B.status="fulfilled",B.value=X)},function(X){B.status==="pending"&&(B.status="rejected",B.reason=X)})),B.status){case"fulfilled":return B.value;case"rejected":throw B.reason}}throw B}function V(B,X,ae,ce,xe){var ie=typeof B;(ie==="undefined"||ie==="boolean")&&(B=null);var ve=!1;if(B===null)ve=!0;else switch(ie){case"bigint":case"string":case"number":ve=!0;break;case"object":switch(B.$$typeof){case t:case e:ve=!0;break;case d:return ve=B._init,V(ve(B._payload),X,ae,ce,xe)}}if(ve)return xe=xe(B),ve=ce===""?"."+L(B,0):ce,T(xe)?(ae="",ve!=null&&(ae=ve.replace(q,"$&/")+"/"),V(xe,X,ae,"",function(we){return we})):xe!=null&&(F(xe)&&(xe=D(xe,ae+(xe.key==null||B&&B.key===xe.key?"":(""+xe.key).replace(q,"$&/")+"/")+ve)),X.push(xe)),1;ve=0;var Pe=ce===""?".":ce+":";if(T(B))for(var pe=0;pe>>1,se=V[Z];if(0>>1;Zr(ae,K))cer(xe,ae)?(V[Z]=xe,V[ce]=K,Z=ce):(V[Z]=ae,V[X]=K,Z=X);else if(cer(xe,K))V[Z]=xe,V[ce]=K,Z=ce;else break e}}return G}function r(V,G){var K=V.sortIndex-G.sortIndex;return K!==0?K:V.id-G.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var a=performance;t.unstable_now=function(){return a.now()}}else{var s=Date,o=s.now();t.unstable_now=function(){return s.now()-o}}var l=[],c=[],d=1,f=null,p=3,m=!1,b=!1,_=!1,v=!1,x=typeof setTimeout=="function"?setTimeout:null,M=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;function E(V){for(var G=n(c);G!==null;){if(G.callback===null)i(c);else if(G.startTime<=V)i(c),G.sortIndex=G.expirationTime,e(l,G);else break;G=n(c)}}function T(V){if(_=!1,E(V),!b)if(n(l)!==null)b=!0,P||(P=!0,I());else{var G=n(c);G!==null&&H(T,G.startTime-V)}}var P=!1,N=-1,U=5,C=-1;function D(){return v?!0:!(t.unstable_now()-CV&&D());){var Z=f.callback;if(typeof Z=="function"){f.callback=null,p=f.priorityLevel;var se=Z(f.expirationTime<=V);if(V=t.unstable_now(),typeof se=="function"){f.callback=se,E(V),G=!0;break t}f===n(l)&&i(l),E(V)}else i(l);f=n(l)}if(f!==null)G=!0;else{var B=n(c);B!==null&&H(T,B.startTime-V),G=!1}}break e}finally{f=null,p=K,m=!1}G=void 0}}finally{G?I():P=!1}}}var I;if(typeof w=="function")I=function(){w(F)};else if(typeof MessageChannel<"u"){var q=new MessageChannel,L=q.port2;q.port1.onmessage=F,I=function(){L.postMessage(null)}}else I=function(){x(F,0)};function H(V,G){N=x(function(){V(t.unstable_now())},G)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(V){V.callback=null},t.unstable_forceFrameRate=function(V){0>V||125Z?(V.sortIndex=K,e(c,V),n(l)===null&&V===n(c)&&(_?(M(N),N=-1):_=!0,H(T,K-Z))):(V.sortIndex=se,e(l,V),b||m||(b=!0,P||(P=!0,I()))),V},t.unstable_shouldYield=D,t.unstable_wrapCallback=function(V){var G=p;return function(){var K=p;p=G;try{return V.apply(this,arguments)}finally{p=K}}}})(gA)),gA}var j4;function jte(){return j4||(j4=1,mA.exports=Ute()),mA.exports}var xA={exports:{}},Wr={};var F4;function Fte(){if(F4)return Wr;F4=1;var t=lm();function e(l){var c="https://react.dev/errors/"+l;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),xA.exports=Fte(),xA.exports}var B4;function zte(){if(B4)return _g;B4=1;var t=jte(),e=lm(),n=K$();function i(u){var h="https://react.dev/errors/"+u;if(1se||(u.current=Z[se],Z[se]=null,se--)}function ae(u,h){se++,Z[se]=u.current,u.current=h}var ce=B(null),xe=B(null),ie=B(null),ve=B(null);function Pe(u,h){switch(ae(ie,h),ae(xe,u),ae(ce,null),h.nodeType){case 9:case 11:u=(u=h.documentElement)&&(u=u.namespaceURI)?n4(u):0;break;default:if(u=h.tagName,h=h.namespaceURI)h=n4(h),u=i4(h,u);else switch(u){case"svg":u=1;break;case"math":u=2;break;default:u=0}}X(ce),ae(ce,u)}function pe(){X(ce),X(xe),X(ie)}function we(u){u.memoizedState!==null&&ae(ve,u);var h=ce.current,y=i4(h,u.type);h!==y&&(ae(xe,u),ae(ce,y))}function ze(u){xe.current===u&&(X(ce),X(xe)),ve.current===u&&(X(ve),gg._currentValue=K)}var ue,ft;function z(u){if(ue===void 0)try{throw Error()}catch(y){var h=y.stack.trim().match(/\n( *(at )?)/);ue=h&&h[1]||"",ft=-1)":-1i[r]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))i(r);new MutationObserver(r=>{for(const a of r)if(a.type==="childList")for(const s of a.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&i(s)}).observe(document,{childList:!0,subtree:!0});function n(r){const a={};return r.integrity&&(a.integrity=r.integrity),r.referrerPolicy&&(a.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?a.credentials="include":r.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function i(r){if(r.ep)return;r.ep=!0;const a=n(r);fetch(r.href,a)}})();var Ay=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Ys(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var xA={exports:{}},Eg={};var jj;function Hte(){if(jj)return Eg;jj=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(i,r,a){var s=null;if(a!==void 0&&(s=""+a),r.key!==void 0&&(s=""+r.key),"key"in r){a={};for(var o in r)o!=="key"&&(a[o]=r[o])}else a=r;return r=a.ref,{$$typeof:t,type:i,key:s,ref:r!==void 0?r:null,props:a}}return Eg.Fragment=e,Eg.jsx=n,Eg.jsxs=n,Eg}var Fj;function Vte(){return Fj||(Fj=1,xA.exports=Hte()),xA.exports}var m=Vte(),vA={exports:{}},Kt={};var zj;function $te(){if(zj)return Kt;zj=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),r=Symbol.for("react.profiler"),a=Symbol.for("react.consumer"),s=Symbol.for("react.context"),o=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),c=Symbol.for("react.memo"),u=Symbol.for("react.lazy"),f=Symbol.for("react.activity"),p=Symbol.iterator;function g(B){return B===null||typeof B!="object"?null:(B=p&&B[p]||B["@@iterator"],typeof B=="function"?B:null)}var y={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function x(B,X,ae){this.props=B,this.context=X,this.refs=v,this.updater=ae||y}x.prototype.isReactComponent={},x.prototype.setState=function(B,X){if(typeof B!="object"&&typeof B!="function"&&B!=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,B,X,"setState")},x.prototype.forceUpdate=function(B){this.updater.enqueueForceUpdate(this,B,"forceUpdate")};function M(){}M.prototype=x.prototype;function w(B,X,ae){this.props=B,this.context=X,this.refs=v,this.updater=ae||y}var E=w.prototype=new M;E.constructor=w,_(E,x.prototype),E.isPureReactComponent=!0;var T=Array.isArray;function P(){}var N={H:null,A:null,T:null,S:null},U=Object.prototype.hasOwnProperty;function C(B,X,ae){var ce=ae.ref;return{$$typeof:t,type:B,key:X,ref:ce!==void 0?ce:null,props:ae}}function D(B,X){return C(B.type,X,B.props)}function F(B){return typeof B=="object"&&B!==null&&B.$$typeof===t}function I(B){var X={"=":"=0",":":"=2"};return"$"+B.replace(/[=:]/g,function(ae){return X[ae]})}var q=/\/+/g;function L(B,X){return typeof B=="object"&&B!==null&&B.key!=null?I(""+B.key):X.toString(36)}function H(B){switch(B.status){case"fulfilled":return B.value;case"rejected":throw B.reason;default:switch(typeof B.status=="string"?B.then(P,P):(B.status="pending",B.then(function(X){B.status==="pending"&&(B.status="fulfilled",B.value=X)},function(X){B.status==="pending"&&(B.status="rejected",B.reason=X)})),B.status){case"fulfilled":return B.value;case"rejected":throw B.reason}}throw B}function V(B,X,ae,ce,xe){var ie=typeof B;(ie==="undefined"||ie==="boolean")&&(B=null);var ve=!1;if(B===null)ve=!0;else switch(ie){case"bigint":case"string":case"number":ve=!0;break;case"object":switch(B.$$typeof){case t:case e:ve=!0;break;case u:return ve=B._init,V(ve(B._payload),X,ae,ce,xe)}}if(ve)return xe=xe(B),ve=ce===""?"."+L(B,0):ce,T(xe)?(ae="",ve!=null&&(ae=ve.replace(q,"$&/")+"/"),V(xe,X,ae,"",function(we){return we})):xe!=null&&(F(xe)&&(xe=D(xe,ae+(xe.key==null||B&&B.key===xe.key?"":(""+xe.key).replace(q,"$&/")+"/")+ve)),X.push(xe)),1;ve=0;var Pe=ce===""?".":ce+":";if(T(B))for(var pe=0;pe>>1,se=V[Z];if(0>>1;Zr(ae,K))cer(xe,ae)?(V[Z]=xe,V[ce]=K,Z=ce):(V[Z]=ae,V[X]=K,Z=X);else if(cer(xe,K))V[Z]=xe,V[ce]=K,Z=ce;else break e}}return G}function r(V,G){var K=V.sortIndex-G.sortIndex;return K!==0?K:V.id-G.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var a=performance;t.unstable_now=function(){return a.now()}}else{var s=Date,o=s.now();t.unstable_now=function(){return s.now()-o}}var l=[],c=[],u=1,f=null,p=3,g=!1,y=!1,_=!1,v=!1,x=typeof setTimeout=="function"?setTimeout:null,M=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;function E(V){for(var G=n(c);G!==null;){if(G.callback===null)i(c);else if(G.startTime<=V)i(c),G.sortIndex=G.expirationTime,e(l,G);else break;G=n(c)}}function T(V){if(_=!1,E(V),!y)if(n(l)!==null)y=!0,P||(P=!0,I());else{var G=n(c);G!==null&&H(T,G.startTime-V)}}var P=!1,N=-1,U=5,C=-1;function D(){return v?!0:!(t.unstable_now()-CV&&D());){var Z=f.callback;if(typeof Z=="function"){f.callback=null,p=f.priorityLevel;var se=Z(f.expirationTime<=V);if(V=t.unstable_now(),typeof se=="function"){f.callback=se,E(V),G=!0;break t}f===n(l)&&i(l),E(V)}else i(l);f=n(l)}if(f!==null)G=!0;else{var B=n(c);B!==null&&H(T,B.startTime-V),G=!1}}break e}finally{f=null,p=K,g=!1}G=void 0}}finally{G?I():P=!1}}}var I;if(typeof w=="function")I=function(){w(F)};else if(typeof MessageChannel<"u"){var q=new MessageChannel,L=q.port2;q.port1.onmessage=F,I=function(){L.postMessage(null)}}else I=function(){x(F,0)};function H(V,G){N=x(function(){V(t.unstable_now())},G)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(V){V.callback=null},t.unstable_forceFrameRate=function(V){0>V||125Z?(V.sortIndex=K,e(c,V),n(l)===null&&V===n(c)&&(_?(M(N),N=-1):_=!0,H(T,K-Z))):(V.sortIndex=se,e(l,V),y||g||(y=!0,P||(P=!0,I()))),V},t.unstable_shouldYield=D,t.unstable_wrapCallback=function(V){var G=p;return function(){var K=p;p=G;try{return V.apply(this,arguments)}finally{p=K}}}})(_A)),_A}var Vj;function qte(){return Vj||(Vj=1,bA.exports=Wte()),bA.exports}var SA={exports:{}},qr={};var $j;function Xte(){if($j)return qr;$j=1;var t=hm();function e(l){var c="https://react.dev/errors/"+l;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),SA.exports=Xte(),SA.exports}var Wj;function Kte(){if(Wj)return Ag;Wj=1;var t=qte(),e=hm(),n=nG();function i(d){var h="https://react.dev/errors/"+d;if(1se||(d.current=Z[se],Z[se]=null,se--)}function ae(d,h){se++,Z[se]=d.current,d.current=h}var ce=B(null),xe=B(null),ie=B(null),ve=B(null);function Pe(d,h){switch(ae(ie,h),ae(xe,d),ae(ce,null),h.nodeType){case 9:case 11:d=(d=h.documentElement)&&(d=d.namespaceURI)?oj(d):0;break;default:if(d=h.tagName,h=h.namespaceURI)h=oj(h),d=lj(h,d);else switch(d){case"svg":d=1;break;case"math":d=2;break;default:d=0}}X(ce),ae(ce,d)}function pe(){X(ce),X(xe),X(ie)}function we(d){d.memoizedState!==null&&ae(ve,d);var h=ce.current,b=lj(h,d.type);h!==b&&(ae(xe,d),ae(ce,b))}function ze(d){xe.current===d&&(X(ce),X(xe)),ve.current===d&&(X(ve),_g._currentValue=K)}var ue,ht;function z(d){if(ue===void 0)try{throw Error()}catch(b){var h=b.stack.trim().match(/\n( *(at )?)/);ue=h&&h[1]||"",ht=-1)":-1R||_e[S]!==Fe[R]){var Je=` -`+_e[S].replace(" at new "," at ");return u.displayName&&Je.includes("")&&(Je=Je.replace("",u.displayName)),Je}while(1<=S&&0<=R);break}}}finally{W=!1,Error.prepareStackTrace=y}return(y=u?u.displayName||u.name:"")?z(y):""}function J(u,h){switch(u.tag){case 26:case 27:case 5:return z(u.type);case 16:return z("Lazy");case 13:return u.child!==h&&h!==null?z("Suspense Fallback"):z("Suspense");case 19:return z("SuspenseList");case 0:case 15:return re(u.type,!1);case 11:return re(u.type.render,!1);case 1:return re(u.type,!0);case 31:return z("Activity");default:return""}}function ee(u){try{var h="",y=null;do h+=J(u,y),y=u,u=u.return;while(u);return h}catch(S){return` +`+_e[S].replace(" at new "," at ");return d.displayName&&Je.includes("")&&(Je=Je.replace("",d.displayName)),Je}while(1<=S&&0<=R);break}}}finally{W=!1,Error.prepareStackTrace=b}return(b=d?d.displayName||d.name:"")?z(b):""}function J(d,h){switch(d.tag){case 26:case 27:case 5:return z(d.type);case 16:return z("Lazy");case 13:return d.child!==h&&h!==null?z("Suspense Fallback"):z("Suspense");case 19:return z("SuspenseList");case 0:case 15:return re(d.type,!1);case 11:return re(d.type.render,!1);case 1:return re(d.type,!0);case 31:return z("Activity");default:return""}}function ee(d){try{var h="",b=null;do h+=J(d,b),b=d,d=d.return;while(d);return h}catch(S){return` Error generating stack: `+S.message+` -`+S.stack}}var oe=Object.prototype.hasOwnProperty,De=t.unstable_scheduleCallback,Ne=t.unstable_cancelCallback,te=t.unstable_shouldYield,j=t.unstable_requestPaint,k=t.unstable_now,Y=t.unstable_getCurrentPriorityLevel,me=t.unstable_ImmediatePriority,ye=t.unstable_UserBlockingPriority,he=t.unstable_NormalPriority,Ye=t.unstable_LowPriority,Le=t.unstable_IdlePriority,qe=t.log,rt=t.unstable_setDisableYieldValue,Ie=null,Re=null;function ht(u){if(typeof qe=="function"&&rt(u),Re&&typeof Re.setStrictMode=="function")try{Re.setStrictMode(Ie,u)}catch{}}var tt=Math.clz32?Math.clz32:de,et=Math.log,ct=Math.LN2;function de(u){return u>>>=0,u===0?32:31-(et(u)/ct|0)|0}var nt=256,fe=262144,ke=4194304;function Me(u){var h=u&42;if(h!==0)return h;switch(u&-u){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 u&261888;case 262144:case 524288:case 1048576:case 2097152:return u&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return u&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return u}}function ge(u,h,y){var S=u.pendingLanes;if(S===0)return 0;var R=0,O=u.suspendedLanes,$=u.pingedLanes;u=u.warmLanes;var ne=S&134217727;return ne!==0?(S=ne&~O,S!==0?R=Me(S):($&=ne,$!==0?R=Me($):y||(y=ne&~u,y!==0&&(R=Me(y))))):(ne=S&~O,ne!==0?R=Me(ne):$!==0?R=Me($):y||(y=S&~u,y!==0&&(R=Me(y)))),R===0?0:h!==0&&h!==R&&(h&O)===0&&(O=R&-R,y=h&-h,O>=y||O===32&&(y&4194048)!==0)?h:R}function Be(u,h){return(u.pendingLanes&~(u.suspendedLanes&~u.pingedLanes)&h)===0}function lt(u,h){switch(u){case 1:case 2:case 4:case 8:case 64:return h+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 h+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 bt(){var u=ke;return ke<<=1,(ke&62914560)===0&&(ke=4194304),u}function Nt(u){for(var h=[],y=0;31>y;y++)h.push(u);return h}function on(u,h){u.pendingLanes|=h,h!==268435456&&(u.suspendedLanes=0,u.pingedLanes=0,u.warmLanes=0)}function Dt(u,h,y,S,R,O){var $=u.pendingLanes;u.pendingLanes=y,u.suspendedLanes=0,u.pingedLanes=0,u.warmLanes=0,u.expiredLanes&=y,u.entangledLanes&=y,u.errorRecoveryDisabledLanes&=y,u.shellSuspendCounter=0;var ne=u.entanglements,_e=u.expirationTimes,Fe=u.hiddenUpdates;for(y=$&~y;0"u")return null;try{return u.activeElement||u.body}catch{return u.body}}var Ti=/[\n"\\]/g;function Cn(u){return u.replace(Ti,function(h){return"\\"+h.charCodeAt(0).toString(16)+" "})}function Qs(u,h,y,S,R,O,$,ne){u.name="",$!=null&&typeof $!="function"&&typeof $!="symbol"&&typeof $!="boolean"?u.type=$:u.removeAttribute("type"),h!=null?$==="number"?(h===0&&u.value===""||u.value!=h)&&(u.value=""+cn(h)):u.value!==""+cn(h)&&(u.value=""+cn(h)):$!=="submit"&&$!=="reset"||u.removeAttribute("value"),h!=null?mr(u,$,cn(h)):y!=null?mr(u,$,cn(y)):S!=null&&u.removeAttribute("value"),R==null&&O!=null&&(u.defaultChecked=!!O),R!=null&&(u.checked=R&&typeof R!="function"&&typeof R!="symbol"),ne!=null&&typeof ne!="function"&&typeof ne!="symbol"&&typeof ne!="boolean"?u.name=""+cn(ne):u.removeAttribute("name")}function Pn(u,h,y,S,R,O,$,ne){if(O!=null&&typeof O!="function"&&typeof O!="symbol"&&typeof O!="boolean"&&(u.type=O),h!=null||y!=null){if(!(O!=="submit"&&O!=="reset"||h!=null)){qt(u);return}y=y!=null?""+cn(y):"",h=h!=null?""+cn(h):y,ne||h===u.value||(u.value=h),u.defaultValue=h}S=S??R,S=typeof S!="function"&&typeof S!="symbol"&&!!S,u.checked=ne?u.checked:!!S,u.defaultChecked=!!S,$!=null&&typeof $!="function"&&typeof $!="symbol"&&typeof $!="boolean"&&(u.name=$),qt(u)}function mr(u,h,y){h==="number"&&yi(u.ownerDocument)===u||u.defaultValue===""+y||(u.defaultValue=""+y)}function Zi(u,h,y,S){if(u=u.options,h){h={};for(var R=0;R"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),fM=!1;if(ol)try{var km={};Object.defineProperty(km,"passive",{get:function(){fM=!0}}),window.addEventListener("test",km,km),window.removeEventListener("test",km,km)}catch{fM=!1}var Rc=null,hM=null,dv=null;function iL(){if(dv)return dv;var u,h=hM,y=h.length,S,R="value"in Rc?Rc.value:Rc.textContent,O=R.length;for(u=0;u=Um),cL=" ",uL=!1;function dL(u,h){switch(u){case"keyup":return eee.indexOf(h.keyCode)!==-1;case"keydown":return h.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function fL(u){return u=u.detail,typeof u=="object"&&"data"in u?u.data:null}var Xf=!1;function nee(u,h){switch(u){case"compositionend":return fL(h);case"keypress":return h.which!==32?null:(uL=!0,cL);case"textInput":return u=h.data,u===cL&&uL?null:u;default:return null}}function iee(u,h){if(Xf)return u==="compositionend"||!vM&&dL(u,h)?(u=iL(),dv=hM=Rc=null,Xf=!1,u):null;switch(u){case"paste":return null;case"keypress":if(!(h.ctrlKey||h.altKey||h.metaKey)||h.ctrlKey&&h.altKey){if(h.char&&1=h)return{node:y,offset:h-u};u=S}e:{for(;y;){if(y.nextSibling){y=y.nextSibling;break e}y=y.parentNode}y=void 0}y=bL(y)}}function SL(u,h){return u&&h?u===h?!0:u&&u.nodeType===3?!1:h&&h.nodeType===3?SL(u,h.parentNode):"contains"in u?u.contains(h):u.compareDocumentPosition?!!(u.compareDocumentPosition(h)&16):!1:!1}function wL(u){u=u!=null&&u.ownerDocument!=null&&u.ownerDocument.defaultView!=null?u.ownerDocument.defaultView:window;for(var h=yi(u.document);h instanceof u.HTMLIFrameElement;){try{var y=typeof h.contentWindow.location.href=="string"}catch{y=!1}if(y)u=h.contentWindow;else break;h=yi(u.document)}return h}function _M(u){var h=u&&u.nodeName&&u.nodeName.toLowerCase();return h&&(h==="input"&&(u.type==="text"||u.type==="search"||u.type==="tel"||u.type==="url"||u.type==="password")||h==="textarea"||u.contentEditable==="true")}var dee=ol&&"documentMode"in document&&11>=document.documentMode,Kf=null,SM=null,Bm=null,wM=!1;function ML(u,h,y){var S=y.window===y?y.document:y.nodeType===9?y:y.ownerDocument;wM||Kf==null||Kf!==yi(S)||(S=Kf,"selectionStart"in S&&_M(S)?S={start:S.selectionStart,end:S.selectionEnd}:(S=(S.ownerDocument&&S.ownerDocument.defaultView||window).getSelection(),S={anchorNode:S.anchorNode,anchorOffset:S.anchorOffset,focusNode:S.focusNode,focusOffset:S.focusOffset}),Bm&&zm(Bm,S)||(Bm=S,S=ry(SM,"onSelect"),0>=$,R-=$,To=1<<32-tt(h)+R|y<Qt?(xn=Pt,Pt=null):xn=Pt.sibling;var wn=Ve(Oe,Pt,je[Qt],it);if(wn===null){Pt===null&&(Pt=xn);break}u&&Pt&&wn.alternate===null&&h(Oe,Pt),Ee=O(wn,Ee,Qt),Sn===null?Lt=wn:Sn.sibling=wn,Sn=wn,Pt=xn}if(Qt===je.length)return y(Oe,Pt),yn&&cl(Oe,Qt),Lt;if(Pt===null){for(;QtQt?(xn=Pt,Pt=null):xn=Pt.sibling;var Qc=Ve(Oe,Pt,wn.value,it);if(Qc===null){Pt===null&&(Pt=xn);break}u&&Pt&&Qc.alternate===null&&h(Oe,Pt),Ee=O(Qc,Ee,Qt),Sn===null?Lt=Qc:Sn.sibling=Qc,Sn=Qc,Pt=xn}if(wn.done)return y(Oe,Pt),yn&&cl(Oe,Qt),Lt;if(Pt===null){for(;!wn.done;Qt++,wn=je.next())wn=st(Oe,wn.value,it),wn!==null&&(Ee=O(wn,Ee,Qt),Sn===null?Lt=wn:Sn.sibling=wn,Sn=wn);return yn&&cl(Oe,Qt),Lt}for(Pt=S(Pt);!wn.done;Qt++,wn=je.next())wn=Ke(Pt,Oe,Qt,wn.value,it),wn!==null&&(u&&wn.alternate!==null&&Pt.delete(wn.key===null?Qt:wn.key),Ee=O(wn,Ee,Qt),Sn===null?Lt=wn:Sn.sibling=wn,Sn=wn);return u&&Pt.forEach(function(Pte){return h(Oe,Pte)}),yn&&cl(Oe,Qt),Lt}function jn(Oe,Ee,je,it){if(typeof je=="object"&&je!==null&&je.type===_&&je.key===null&&(je=je.props.children),typeof je=="object"&&je!==null){switch(je.$$typeof){case m:e:{for(var Lt=je.key;Ee!==null;){if(Ee.key===Lt){if(Lt=je.type,Lt===_){if(Ee.tag===7){y(Oe,Ee.sibling),it=R(Ee,je.props.children),it.return=Oe,Oe=it;break e}}else if(Ee.elementType===Lt||typeof Lt=="object"&&Lt!==null&&Lt.$$typeof===U&&bd(Lt)===Ee.type){y(Oe,Ee.sibling),it=R(Ee,je.props),qm(it,je),it.return=Oe,Oe=it;break e}y(Oe,Ee);break}else h(Oe,Ee);Ee=Ee.sibling}je.type===_?(it=md(je.props.children,Oe.mode,it,je.key),it.return=Oe,Oe=it):(it=_v(je.type,je.key,je.props,null,Oe.mode,it),qm(it,je),it.return=Oe,Oe=it)}return $(Oe);case b:e:{for(Lt=je.key;Ee!==null;){if(Ee.key===Lt)if(Ee.tag===4&&Ee.stateNode.containerInfo===je.containerInfo&&Ee.stateNode.implementation===je.implementation){y(Oe,Ee.sibling),it=R(Ee,je.children||[]),it.return=Oe,Oe=it;break e}else{y(Oe,Ee);break}else h(Oe,Ee);Ee=Ee.sibling}it=RM(je,Oe.mode,it),it.return=Oe,Oe=it}return $(Oe);case U:return je=bd(je),jn(Oe,Ee,je,it)}if(H(je))return Ct(Oe,Ee,je,it);if(I(je)){if(Lt=I(je),typeof Lt!="function")throw Error(i(150));return je=Lt.call(je),zt(Oe,Ee,je,it)}if(typeof je.then=="function")return jn(Oe,Ee,Cv(je),it);if(je.$$typeof===w)return jn(Oe,Ee,Mv(Oe,je),it);Nv(Oe,je)}return typeof je=="string"&&je!==""||typeof je=="number"||typeof je=="bigint"?(je=""+je,Ee!==null&&Ee.tag===6?(y(Oe,Ee.sibling),it=R(Ee,je),it.return=Oe,Oe=it):(y(Oe,Ee),it=NM(je,Oe.mode,it),it.return=Oe,Oe=it),$(Oe)):y(Oe,Ee)}return function(Oe,Ee,je,it){try{Wm=0;var Lt=jn(Oe,Ee,je,it);return sh=null,Lt}catch(Pt){if(Pt===ah||Pt===Av)throw Pt;var Sn=Wa(29,Pt,null,Oe.mode);return Sn.lanes=it,Sn.return=Oe,Sn}finally{}}}var Sd=qL(!0),XL=qL(!1),Lc=!1;function HM(u){u.updateQueue={baseState:u.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function VM(u,h){u=u.updateQueue,h.updateQueue===u&&(h.updateQueue={baseState:u.baseState,firstBaseUpdate:u.firstBaseUpdate,lastBaseUpdate:u.lastBaseUpdate,shared:u.shared,callbacks:null})}function Ic(u){return{lane:u,tag:0,payload:null,callback:null,next:null}}function Uc(u,h,y){var S=u.updateQueue;if(S===null)return null;if(S=S.shared,(Tn&2)!==0){var R=S.pending;return R===null?h.next=h:(h.next=R.next,R.next=h),S.pending=h,h=bv(u),PL(u,null,y),h}return yv(u,S,h,y),bv(u)}function Xm(u,h,y){if(h=h.updateQueue,h!==null&&(h=h.shared,(y&4194048)!==0)){var S=h.lanes;S&=u.pendingLanes,y|=S,h.lanes=y,Wn(u,y)}}function $M(u,h){var y=u.updateQueue,S=u.alternate;if(S!==null&&(S=S.updateQueue,y===S)){var R=null,O=null;if(y=y.firstBaseUpdate,y!==null){do{var $={lane:y.lane,tag:y.tag,payload:y.payload,callback:null,next:null};O===null?R=O=$:O=O.next=$,y=y.next}while(y!==null);O===null?R=O=h:O=O.next=h}else R=O=h;y={baseState:S.baseState,firstBaseUpdate:R,lastBaseUpdate:O,shared:S.shared,callbacks:S.callbacks},u.updateQueue=y;return}u=y.lastBaseUpdate,u===null?y.firstBaseUpdate=h:u.next=h,y.lastBaseUpdate=h}var GM=!1;function Km(){if(GM){var u=rh;if(u!==null)throw u}}function Ym(u,h,y,S){GM=!1;var R=u.updateQueue;Lc=!1;var O=R.firstBaseUpdate,$=R.lastBaseUpdate,ne=R.shared.pending;if(ne!==null){R.shared.pending=null;var _e=ne,Fe=_e.next;_e.next=null,$===null?O=Fe:$.next=Fe,$=_e;var Je=u.alternate;Je!==null&&(Je=Je.updateQueue,ne=Je.lastBaseUpdate,ne!==$&&(ne===null?Je.firstBaseUpdate=Fe:ne.next=Fe,Je.lastBaseUpdate=_e))}if(O!==null){var st=R.baseState;$=0,Je=Fe=_e=null,ne=O;do{var Ve=ne.lane&-536870913,Ke=Ve!==ne.lane;if(Ke?(gn&Ve)===Ve:(S&Ve)===Ve){Ve!==0&&Ve===ih&&(GM=!0),Je!==null&&(Je=Je.next={lane:0,tag:ne.tag,payload:ne.payload,callback:null,next:null});e:{var Ct=u,zt=ne;Ve=h;var jn=y;switch(zt.tag){case 1:if(Ct=zt.payload,typeof Ct=="function"){st=Ct.call(jn,st,Ve);break e}st=Ct;break e;case 3:Ct.flags=Ct.flags&-65537|128;case 0:if(Ct=zt.payload,Ve=typeof Ct=="function"?Ct.call(jn,st,Ve):Ct,Ve==null)break e;st=f({},st,Ve);break e;case 2:Lc=!0}}Ve=ne.callback,Ve!==null&&(u.flags|=64,Ke&&(u.flags|=8192),Ke=R.callbacks,Ke===null?R.callbacks=[Ve]:Ke.push(Ve))}else Ke={lane:Ve,tag:ne.tag,payload:ne.payload,callback:ne.callback,next:null},Je===null?(Fe=Je=Ke,_e=st):Je=Je.next=Ke,$|=Ve;if(ne=ne.next,ne===null){if(ne=R.shared.pending,ne===null)break;Ke=ne,ne=Ke.next,Ke.next=null,R.lastBaseUpdate=Ke,R.shared.pending=null}}while(!0);Je===null&&(_e=st),R.baseState=_e,R.firstBaseUpdate=Fe,R.lastBaseUpdate=Je,O===null&&(R.shared.lanes=0),Hc|=$,u.lanes=$,u.memoizedState=st}}function KL(u,h){if(typeof u!="function")throw Error(i(191,u));u.call(h)}function YL(u,h){var y=u.callbacks;if(y!==null)for(u.callbacks=null,u=0;uO?O:8;var $=V.T,ne={};V.T=ne,uE(u,!1,h,y);try{var _e=R(),Fe=V.S;if(Fe!==null&&Fe(ne,_e),_e!==null&&typeof _e=="object"&&typeof _e.then=="function"){var Je=bee(_e,S);Jm(u,h,Je,Za(u))}else Jm(u,h,S,Za(u))}catch(st){Jm(u,h,{then:function(){},status:"rejected",reason:st},Za())}finally{G.p=O,$!==null&&ne.types!==null&&($.types=ne.types),V.T=$}}function Aee(){}function lE(u,h,y,S){if(u.tag!==5)throw Error(i(476));var R=CI(u).queue;TI(u,R,h,K,y===null?Aee:function(){return NI(u),y(S)})}function CI(u){var h=u.memoizedState;if(h!==null)return h;h={memoizedState:K,baseState:K,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:hl,lastRenderedState:K},next:null};var y={};return h.next={memoizedState:y,baseState:y,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:hl,lastRenderedState:y},next:null},u.memoizedState=h,u=u.alternate,u!==null&&(u.memoizedState=h),h}function NI(u){var h=CI(u);h.next===null&&(h=u.alternate.memoizedState),Jm(u,h.next.queue,{},Za())}function cE(){return Dr(gg)}function RI(){return Ni().memoizedState}function PI(){return Ni().memoizedState}function Tee(u){for(var h=u.return;h!==null;){switch(h.tag){case 24:case 3:var y=Za();u=Ic(y);var S=Uc(h,u,y);S!==null&&(Na(S,h,y),Xm(S,h,y)),h={cache:jM()},u.payload=h;return}h=h.return}}function Cee(u,h,y){var S=Za();y={lane:S,revertLane:0,gesture:null,action:y,hasEagerState:!1,eagerState:null,next:null},Fv(u)?OI(h,y):(y=TM(u,h,y,S),y!==null&&(Na(y,u,S),kI(y,h,S)))}function DI(u,h,y){var S=Za();Jm(u,h,y,S)}function Jm(u,h,y,S){var R={lane:S,revertLane:0,gesture:null,action:y,hasEagerState:!1,eagerState:null,next:null};if(Fv(u))OI(h,R);else{var O=u.alternate;if(u.lanes===0&&(O===null||O.lanes===0)&&(O=h.lastRenderedReducer,O!==null))try{var $=h.lastRenderedState,ne=O($,y);if(R.hasEagerState=!0,R.eagerState=ne,Ga(ne,$))return yv(u,h,R,0),qn===null&&vv(),!1}catch{}finally{}if(y=TM(u,h,R,S),y!==null)return Na(y,u,S),kI(y,h,S),!0}return!1}function uE(u,h,y,S){if(S={lane:2,revertLane:HE(),gesture:null,action:S,hasEagerState:!1,eagerState:null,next:null},Fv(u)){if(h)throw Error(i(479))}else h=TM(u,y,S,2),h!==null&&Na(h,u,2)}function Fv(u){var h=u.alternate;return u===Zt||h!==null&&h===Zt}function OI(u,h){lh=Dv=!0;var y=u.pending;y===null?h.next=h:(h.next=y.next,y.next=h),u.pending=h}function kI(u,h,y){if((y&4194048)!==0){var S=h.lanes;S&=u.pendingLanes,y|=S,h.lanes=y,Wn(u,y)}}var eg={readContext:Dr,use:Lv,useCallback:bi,useContext:bi,useEffect:bi,useImperativeHandle:bi,useLayoutEffect:bi,useInsertionEffect:bi,useMemo:bi,useReducer:bi,useRef:bi,useState:bi,useDebugValue:bi,useDeferredValue:bi,useTransition:bi,useSyncExternalStore:bi,useId:bi,useHostTransitionStatus:bi,useFormState:bi,useActionState:bi,useOptimistic:bi,useMemoCache:bi,useCacheRefresh:bi};eg.useEffectEvent=bi;var LI={readContext:Dr,use:Lv,useCallback:function(u,h){return oa().memoizedState=[u,h===void 0?null:h],u},useContext:Dr,useEffect:vI,useImperativeHandle:function(u,h,y){y=y!=null?y.concat([u]):null,Uv(4194308,4,SI.bind(null,h,u),y)},useLayoutEffect:function(u,h){return Uv(4194308,4,u,h)},useInsertionEffect:function(u,h){Uv(4,2,u,h)},useMemo:function(u,h){var y=oa();h=h===void 0?null:h;var S=u();if(wd){ht(!0);try{u()}finally{ht(!1)}}return y.memoizedState=[S,h],S},useReducer:function(u,h,y){var S=oa();if(y!==void 0){var R=y(h);if(wd){ht(!0);try{y(h)}finally{ht(!1)}}}else R=h;return S.memoizedState=S.baseState=R,u={pending:null,lanes:0,dispatch:null,lastRenderedReducer:u,lastRenderedState:R},S.queue=u,u=u.dispatch=Cee.bind(null,Zt,u),[S.memoizedState,u]},useRef:function(u){var h=oa();return u={current:u},h.memoizedState=u},useState:function(u){u=iE(u);var h=u.queue,y=DI.bind(null,Zt,h);return h.dispatch=y,[u.memoizedState,y]},useDebugValue:sE,useDeferredValue:function(u,h){var y=oa();return oE(y,u,h)},useTransition:function(){var u=iE(!1);return u=TI.bind(null,Zt,u.queue,!0,!1),oa().memoizedState=u,[!1,u]},useSyncExternalStore:function(u,h,y){var S=Zt,R=oa();if(yn){if(y===void 0)throw Error(i(407));y=y()}else{if(y=h(),qn===null)throw Error(i(349));(gn&127)!==0||nI(S,h,y)}R.memoizedState=y;var O={value:y,getSnapshot:h};return R.queue=O,vI(rI.bind(null,S,O,u),[u]),S.flags|=2048,uh(9,{destroy:void 0},iI.bind(null,S,O,y,h),null),y},useId:function(){var u=oa(),h=qn.identifierPrefix;if(yn){var y=Co,S=To;y=(S&~(1<<32-tt(S)-1)).toString(32)+y,h="_"+h+"R_"+y,y=Ov++,0<\/script>",O=O.removeChild(O.firstChild);break;case"select":O=typeof S.is=="string"?$.createElement("select",{is:S.is}):$.createElement("select"),S.multiple?O.multiple=!0:S.size&&(O.size=S.size);break;default:O=typeof S.is=="string"?$.createElement(R,{is:S.is}):$.createElement(R)}}O[hi]=h,O[Ai]=S;e:for($=h.child;$!==null;){if($.tag===5||$.tag===6)O.appendChild($.stateNode);else if($.tag!==4&&$.tag!==27&&$.child!==null){$.child.return=$,$=$.child;continue}if($===h)break e;for(;$.sibling===null;){if($.return===null||$.return===h)break e;$=$.return}$.sibling.return=$.return,$=$.sibling}h.stateNode=O;e:switch(kr(O,R,S),R){case"button":case"input":case"select":case"textarea":S=!!S.autoFocus;break e;case"img":S=!0;break e;default:S=!1}S&&ml(h)}}return ti(h),ME(h,h.type,u===null?null:u.memoizedProps,h.pendingProps,y),null;case 6:if(u&&h.stateNode!=null)u.memoizedProps!==S&&ml(h);else{if(typeof S!="string"&&h.stateNode===null)throw Error(i(166));if(u=ie.current,th(h)){if(u=h.stateNode,y=h.memoizedProps,S=null,R=Pr,R!==null)switch(R.tag){case 27:case 5:S=R.memoizedProps}u[hi]=h,u=!!(u.nodeValue===y||S!==null&&S.suppressHydrationWarning===!0||e4(u.nodeValue,y)),u||Oc(h,!0)}else u=ay(u).createTextNode(S),u[hi]=h,h.stateNode=u}return ti(h),null;case 31:if(y=h.memoizedState,u===null||u.memoizedState!==null){if(S=th(h),y!==null){if(u===null){if(!S)throw Error(i(318));if(u=h.memoizedState,u=u!==null?u.dehydrated:null,!u)throw Error(i(557));u[hi]=h}else gd(),(h.flags&128)===0&&(h.memoizedState=null),h.flags|=4;ti(h),u=!1}else y=kM(),u!==null&&u.memoizedState!==null&&(u.memoizedState.hydrationErrors=y),u=!0;if(!u)return h.flags&256?(Xa(h),h):(Xa(h),null);if((h.flags&128)!==0)throw Error(i(558))}return ti(h),null;case 13:if(S=h.memoizedState,u===null||u.memoizedState!==null&&u.memoizedState.dehydrated!==null){if(R=th(h),S!==null&&S.dehydrated!==null){if(u===null){if(!R)throw Error(i(318));if(R=h.memoizedState,R=R!==null?R.dehydrated:null,!R)throw Error(i(317));R[hi]=h}else gd(),(h.flags&128)===0&&(h.memoizedState=null),h.flags|=4;ti(h),R=!1}else R=kM(),u!==null&&u.memoizedState!==null&&(u.memoizedState.hydrationErrors=R),R=!0;if(!R)return h.flags&256?(Xa(h),h):(Xa(h),null)}return Xa(h),(h.flags&128)!==0?(h.lanes=y,h):(y=S!==null,u=u!==null&&u.memoizedState!==null,y&&(S=h.child,R=null,S.alternate!==null&&S.alternate.memoizedState!==null&&S.alternate.memoizedState.cachePool!==null&&(R=S.alternate.memoizedState.cachePool.pool),O=null,S.memoizedState!==null&&S.memoizedState.cachePool!==null&&(O=S.memoizedState.cachePool.pool),O!==R&&(S.flags|=2048)),y!==u&&y&&(h.child.flags|=8192),$v(h,h.updateQueue),ti(h),null);case 4:return pe(),u===null&&WE(h.stateNode.containerInfo),ti(h),null;case 10:return dl(h.type),ti(h),null;case 19:if(X(Ci),S=h.memoizedState,S===null)return ti(h),null;if(R=(h.flags&128)!==0,O=S.rendering,O===null)if(R)ng(S,!1);else{if(_i!==0||u!==null&&(u.flags&128)!==0)for(u=h.child;u!==null;){if(O=Pv(u),O!==null){for(h.flags|=128,ng(S,!1),u=O.updateQueue,h.updateQueue=u,$v(h,u),h.subtreeFlags=0,u=y,y=h.child;y!==null;)DL(y,u),y=y.sibling;return ae(Ci,Ci.current&1|2),yn&&cl(h,S.treeForkCount),h.child}u=u.sibling}S.tail!==null&&k()>Kv&&(h.flags|=128,R=!0,ng(S,!1),h.lanes=4194304)}else{if(!R)if(u=Pv(O),u!==null){if(h.flags|=128,R=!0,u=u.updateQueue,h.updateQueue=u,$v(h,u),ng(S,!0),S.tail===null&&S.tailMode==="hidden"&&!O.alternate&&!yn)return ti(h),null}else 2*k()-S.renderingStartTime>Kv&&y!==536870912&&(h.flags|=128,R=!0,ng(S,!1),h.lanes=4194304);S.isBackwards?(O.sibling=h.child,h.child=O):(u=S.last,u!==null?u.sibling=O:h.child=O,S.last=O)}return S.tail!==null?(u=S.tail,S.rendering=u,S.tail=u.sibling,S.renderingStartTime=k(),u.sibling=null,y=Ci.current,ae(Ci,R?y&1|2:y&1),yn&&cl(h,S.treeForkCount),u):(ti(h),null);case 22:case 23:return Xa(h),qM(),S=h.memoizedState!==null,u!==null?u.memoizedState!==null!==S&&(h.flags|=8192):S&&(h.flags|=8192),S?(y&536870912)!==0&&(h.flags&128)===0&&(ti(h),h.subtreeFlags&6&&(h.flags|=8192)):ti(h),y=h.updateQueue,y!==null&&$v(h,y.retryQueue),y=null,u!==null&&u.memoizedState!==null&&u.memoizedState.cachePool!==null&&(y=u.memoizedState.cachePool.pool),S=null,h.memoizedState!==null&&h.memoizedState.cachePool!==null&&(S=h.memoizedState.cachePool.pool),S!==y&&(h.flags|=2048),u!==null&&X(yd),null;case 24:return y=null,u!==null&&(y=u.memoizedState.cache),h.memoizedState.cache!==y&&(h.flags|=2048),dl(Li),ti(h),null;case 25:return null;case 30:return null}throw Error(i(156,h.tag))}function Oee(u,h){switch(DM(h),h.tag){case 1:return u=h.flags,u&65536?(h.flags=u&-65537|128,h):null;case 3:return dl(Li),pe(),u=h.flags,(u&65536)!==0&&(u&128)===0?(h.flags=u&-65537|128,h):null;case 26:case 27:case 5:return ze(h),null;case 31:if(h.memoizedState!==null){if(Xa(h),h.alternate===null)throw Error(i(340));gd()}return u=h.flags,u&65536?(h.flags=u&-65537|128,h):null;case 13:if(Xa(h),u=h.memoizedState,u!==null&&u.dehydrated!==null){if(h.alternate===null)throw Error(i(340));gd()}return u=h.flags,u&65536?(h.flags=u&-65537|128,h):null;case 19:return X(Ci),null;case 4:return pe(),null;case 10:return dl(h.type),null;case 22:case 23:return Xa(h),qM(),u!==null&&X(yd),u=h.flags,u&65536?(h.flags=u&-65537|128,h):null;case 24:return dl(Li),null;case 25:return null;default:return null}}function aU(u,h){switch(DM(h),h.tag){case 3:dl(Li),pe();break;case 26:case 27:case 5:ze(h);break;case 4:pe();break;case 31:h.memoizedState!==null&&Xa(h);break;case 13:Xa(h);break;case 19:X(Ci);break;case 10:dl(h.type);break;case 22:case 23:Xa(h),qM(),u!==null&&X(yd);break;case 24:dl(Li)}}function ig(u,h){try{var y=h.updateQueue,S=y!==null?y.lastEffect:null;if(S!==null){var R=S.next;y=R;do{if((y.tag&u)===u){S=void 0;var O=y.create,$=y.inst;S=O(),$.destroy=S}y=y.next}while(y!==R)}}catch(ne){On(h,h.return,ne)}}function zc(u,h,y){try{var S=h.updateQueue,R=S!==null?S.lastEffect:null;if(R!==null){var O=R.next;S=O;do{if((S.tag&u)===u){var $=S.inst,ne=$.destroy;if(ne!==void 0){$.destroy=void 0,R=h;var _e=y,Fe=ne;try{Fe()}catch(Je){On(R,_e,Je)}}}S=S.next}while(S!==O)}}catch(Je){On(h,h.return,Je)}}function sU(u){var h=u.updateQueue;if(h!==null){var y=u.stateNode;try{YL(h,y)}catch(S){On(u,u.return,S)}}}function oU(u,h,y){y.props=Md(u.type,u.memoizedProps),y.state=u.memoizedState;try{y.componentWillUnmount()}catch(S){On(u,h,S)}}function rg(u,h){try{var y=u.ref;if(y!==null){switch(u.tag){case 26:case 27:case 5:var S=u.stateNode;break;case 30:S=u.stateNode;break;default:S=u.stateNode}typeof y=="function"?u.refCleanup=y(S):y.current=S}}catch(R){On(u,h,R)}}function No(u,h){var y=u.ref,S=u.refCleanup;if(y!==null)if(typeof S=="function")try{S()}catch(R){On(u,h,R)}finally{u.refCleanup=null,u=u.alternate,u!=null&&(u.refCleanup=null)}else if(typeof y=="function")try{y(null)}catch(R){On(u,h,R)}else y.current=null}function lU(u){var h=u.type,y=u.memoizedProps,S=u.stateNode;try{e:switch(h){case"button":case"input":case"select":case"textarea":y.autoFocus&&S.focus();break e;case"img":y.src?S.src=y.src:y.srcSet&&(S.srcset=y.srcSet)}}catch(R){On(u,u.return,R)}}function EE(u,h,y){try{var S=u.stateNode;tte(S,u.type,y,h),S[Ai]=h}catch(R){On(u,u.return,R)}}function cU(u){return u.tag===5||u.tag===3||u.tag===26||u.tag===27&&qc(u.type)||u.tag===4}function AE(u){e:for(;;){for(;u.sibling===null;){if(u.return===null||cU(u.return))return null;u=u.return}for(u.sibling.return=u.return,u=u.sibling;u.tag!==5&&u.tag!==6&&u.tag!==18;){if(u.tag===27&&qc(u.type)||u.flags&2||u.child===null||u.tag===4)continue e;u.child.return=u,u=u.child}if(!(u.flags&2))return u.stateNode}}function TE(u,h,y){var S=u.tag;if(S===5||S===6)u=u.stateNode,h?(y.nodeType===9?y.body:y.nodeName==="HTML"?y.ownerDocument.body:y).insertBefore(u,h):(h=y.nodeType===9?y.body:y.nodeName==="HTML"?y.ownerDocument.body:y,h.appendChild(u),y=y._reactRootContainer,y!=null||h.onclick!==null||(h.onclick=sl));else if(S!==4&&(S===27&&qc(u.type)&&(y=u.stateNode,h=null),u=u.child,u!==null))for(TE(u,h,y),u=u.sibling;u!==null;)TE(u,h,y),u=u.sibling}function Gv(u,h,y){var S=u.tag;if(S===5||S===6)u=u.stateNode,h?y.insertBefore(u,h):y.appendChild(u);else if(S!==4&&(S===27&&qc(u.type)&&(y=u.stateNode),u=u.child,u!==null))for(Gv(u,h,y),u=u.sibling;u!==null;)Gv(u,h,y),u=u.sibling}function uU(u){var h=u.stateNode,y=u.memoizedProps;try{for(var S=u.type,R=h.attributes;R.length;)h.removeAttributeNode(R[0]);kr(h,S,y),h[hi]=u,h[Ai]=y}catch(O){On(u,u.return,O)}}var gl=!1,ji=!1,CE=!1,dU=typeof WeakSet=="function"?WeakSet:Set,xr=null;function kee(u,h){if(u=u.containerInfo,KE=fy,u=wL(u),_M(u)){if("selectionStart"in u)var y={start:u.selectionStart,end:u.selectionEnd};else e:{y=(y=u.ownerDocument)&&y.defaultView||window;var S=y.getSelection&&y.getSelection();if(S&&S.rangeCount!==0){y=S.anchorNode;var R=S.anchorOffset,O=S.focusNode;S=S.focusOffset;try{y.nodeType,O.nodeType}catch{y=null;break e}var $=0,ne=-1,_e=-1,Fe=0,Je=0,st=u,Ve=null;t:for(;;){for(var Ke;st!==y||R!==0&&st.nodeType!==3||(ne=$+R),st!==O||S!==0&&st.nodeType!==3||(_e=$+S),st.nodeType===3&&($+=st.nodeValue.length),(Ke=st.firstChild)!==null;)Ve=st,st=Ke;for(;;){if(st===u)break t;if(Ve===y&&++Fe===R&&(ne=$),Ve===O&&++Je===S&&(_e=$),(Ke=st.nextSibling)!==null)break;st=Ve,Ve=st.parentNode}st=Ke}y=ne===-1||_e===-1?null:{start:ne,end:_e}}else y=null}y=y||{start:0,end:0}}else y=null;for(YE={focusedElem:u,selectionRange:y},fy=!1,xr=h;xr!==null;)if(h=xr,u=h.child,(h.subtreeFlags&1028)!==0&&u!==null)u.return=h,xr=u;else for(;xr!==null;){switch(h=xr,O=h.alternate,u=h.flags,h.tag){case 0:if((u&4)!==0&&(u=h.updateQueue,u=u!==null?u.events:null,u!==null))for(y=0;y title"))),kr(O,S,y),O[hi]=u,Te(O),S=O;break e;case"link":var $=x4("link","href",R).get(S+(y.href||""));if($){for(var ne=0;ne<$.length;ne++)if(O=$[ne],O.getAttribute("href")===(y.href==null||y.href===""?null:y.href)&&O.getAttribute("rel")===(y.rel==null?null:y.rel)&&O.getAttribute("title")===(y.title==null?null:y.title)&&O.getAttribute("crossorigin")===(y.crossOrigin==null?null:y.crossOrigin)){$.splice(ne,1);break t}}O=R.createElement(S),kr(O,S,y),R.head.appendChild(O);break;case"meta":if($=x4("meta","content",R).get(S+(y.content||""))){for(ne=0;ne<$.length;ne++)if(O=$[ne],O.getAttribute("content")===(y.content==null?null:""+y.content)&&O.getAttribute("name")===(y.name==null?null:y.name)&&O.getAttribute("property")===(y.property==null?null:y.property)&&O.getAttribute("http-equiv")===(y.httpEquiv==null?null:y.httpEquiv)&&O.getAttribute("charset")===(y.charSet==null?null:y.charSet)){$.splice(ne,1);break t}}O=R.createElement(S),kr(O,S,y),R.head.appendChild(O);break;default:throw Error(i(468,S))}O[hi]=u,Te(O),S=O}u.stateNode=S}else v4(R,u.type,u.stateNode);else u.stateNode=g4(R,S,u.memoizedProps);else O!==S?(O===null?y.stateNode!==null&&(y=y.stateNode,y.parentNode.removeChild(y)):O.count--,S===null?v4(R,u.type,u.stateNode):g4(R,S,u.memoizedProps)):S===null&&u.stateNode!==null&&EE(u,u.memoizedProps,y.memoizedProps)}break;case 27:Aa(h,u),Ta(u),S&512&&(ji||y===null||No(y,y.return)),y!==null&&S&4&&EE(u,u.memoizedProps,y.memoizedProps);break;case 5:if(Aa(h,u),Ta(u),S&512&&(ji||y===null||No(y,y.return)),u.flags&32){R=u.stateNode;try{Ao(R,"")}catch(Ct){On(u,u.return,Ct)}}S&4&&u.stateNode!=null&&(R=u.memoizedProps,EE(u,R,y!==null?y.memoizedProps:R)),S&1024&&(CE=!0);break;case 6:if(Aa(h,u),Ta(u),S&4){if(u.stateNode===null)throw Error(i(162));S=u.memoizedProps,y=u.stateNode;try{y.nodeValue=S}catch(Ct){On(u,u.return,Ct)}}break;case 3:if(ly=null,R=eo,eo=sy(h.containerInfo),Aa(h,u),eo=R,Ta(u),S&4&&y!==null&&y.memoizedState.isDehydrated)try{Sh(h.containerInfo)}catch(Ct){On(u,u.return,Ct)}CE&&(CE=!1,vU(u));break;case 4:S=eo,eo=sy(u.stateNode.containerInfo),Aa(h,u),Ta(u),eo=S;break;case 12:Aa(h,u),Ta(u);break;case 31:Aa(h,u),Ta(u),S&4&&(S=u.updateQueue,S!==null&&(u.updateQueue=null,Wv(u,S)));break;case 13:Aa(h,u),Ta(u),u.child.flags&8192&&u.memoizedState!==null!=(y!==null&&y.memoizedState!==null)&&(Xv=k()),S&4&&(S=u.updateQueue,S!==null&&(u.updateQueue=null,Wv(u,S)));break;case 22:R=u.memoizedState!==null;var _e=y!==null&&y.memoizedState!==null,Fe=gl,Je=ji;if(gl=Fe||R,ji=Je||_e,Aa(h,u),ji=Je,gl=Fe,Ta(u),S&8192)e:for(h=u.stateNode,h._visibility=R?h._visibility&-2:h._visibility|1,R&&(y===null||_e||gl||ji||Ed(u)),y=null,h=u;;){if(h.tag===5||h.tag===26){if(y===null){_e=y=h;try{if(O=_e.stateNode,R)$=O.style,typeof $.setProperty=="function"?$.setProperty("display","none","important"):$.display="none";else{ne=_e.stateNode;var st=_e.memoizedProps.style,Ve=st!=null&&st.hasOwnProperty("display")?st.display:null;ne.style.display=Ve==null||typeof Ve=="boolean"?"":(""+Ve).trim()}}catch(Ct){On(_e,_e.return,Ct)}}}else if(h.tag===6){if(y===null){_e=h;try{_e.stateNode.nodeValue=R?"":_e.memoizedProps}catch(Ct){On(_e,_e.return,Ct)}}}else if(h.tag===18){if(y===null){_e=h;try{var Ke=_e.stateNode;R?o4(Ke,!0):o4(_e.stateNode,!1)}catch(Ct){On(_e,_e.return,Ct)}}}else if((h.tag!==22&&h.tag!==23||h.memoizedState===null||h===u)&&h.child!==null){h.child.return=h,h=h.child;continue}if(h===u)break e;for(;h.sibling===null;){if(h.return===null||h.return===u)break e;y===h&&(y=null),h=h.return}y===h&&(y=null),h.sibling.return=h.return,h=h.sibling}S&4&&(S=u.updateQueue,S!==null&&(y=S.retryQueue,y!==null&&(S.retryQueue=null,Wv(u,y))));break;case 19:Aa(h,u),Ta(u),S&4&&(S=u.updateQueue,S!==null&&(u.updateQueue=null,Wv(u,S)));break;case 30:break;case 21:break;default:Aa(h,u),Ta(u)}}function Ta(u){var h=u.flags;if(h&2){try{for(var y,S=u.return;S!==null;){if(cU(S)){y=S;break}S=S.return}if(y==null)throw Error(i(160));switch(y.tag){case 27:var R=y.stateNode,O=AE(u);Gv(u,O,R);break;case 5:var $=y.stateNode;y.flags&32&&(Ao($,""),y.flags&=-33);var ne=AE(u);Gv(u,ne,$);break;case 3:case 4:var _e=y.stateNode.containerInfo,Fe=AE(u);TE(u,Fe,_e);break;default:throw Error(i(161))}}catch(Je){On(u,u.return,Je)}u.flags&=-3}h&4096&&(u.flags&=-4097)}function vU(u){if(u.subtreeFlags&1024)for(u=u.child;u!==null;){var h=u;vU(h),h.tag===5&&h.flags&1024&&h.stateNode.reset(),u=u.sibling}}function vl(u,h){if(h.subtreeFlags&8772)for(h=h.child;h!==null;)fU(u,h.alternate,h),h=h.sibling}function Ed(u){for(u=u.child;u!==null;){var h=u;switch(h.tag){case 0:case 11:case 14:case 15:zc(4,h,h.return),Ed(h);break;case 1:No(h,h.return);var y=h.stateNode;typeof y.componentWillUnmount=="function"&&oU(h,h.return,y),Ed(h);break;case 27:hg(h.stateNode);case 26:case 5:No(h,h.return),Ed(h);break;case 22:h.memoizedState===null&&Ed(h);break;case 30:Ed(h);break;default:Ed(h)}u=u.sibling}}function yl(u,h,y){for(y=y&&(h.subtreeFlags&8772)!==0,h=h.child;h!==null;){var S=h.alternate,R=u,O=h,$=O.flags;switch(O.tag){case 0:case 11:case 15:yl(R,O,y),ig(4,O);break;case 1:if(yl(R,O,y),S=O,R=S.stateNode,typeof R.componentDidMount=="function")try{R.componentDidMount()}catch(Fe){On(S,S.return,Fe)}if(S=O,R=S.updateQueue,R!==null){var ne=S.stateNode;try{var _e=R.shared.hiddenCallbacks;if(_e!==null)for(R.shared.hiddenCallbacks=null,R=0;R<_e.length;R++)KL(_e[R],ne)}catch(Fe){On(S,S.return,Fe)}}y&&$&64&&sU(O),rg(O,O.return);break;case 27:uU(O);case 26:case 5:yl(R,O,y),y&&S===null&&$&4&&lU(O),rg(O,O.return);break;case 12:yl(R,O,y);break;case 31:yl(R,O,y),y&&$&4&&mU(R,O);break;case 13:yl(R,O,y),y&&$&4&&gU(R,O);break;case 22:O.memoizedState===null&&yl(R,O,y),rg(O,O.return);break;case 30:break;default:yl(R,O,y)}h=h.sibling}}function NE(u,h){var y=null;u!==null&&u.memoizedState!==null&&u.memoizedState.cachePool!==null&&(y=u.memoizedState.cachePool.pool),u=null,h.memoizedState!==null&&h.memoizedState.cachePool!==null&&(u=h.memoizedState.cachePool.pool),u!==y&&(u!=null&&u.refCount++,y!=null&&$m(y))}function RE(u,h){u=null,h.alternate!==null&&(u=h.alternate.memoizedState.cache),h=h.memoizedState.cache,h!==u&&(h.refCount++,u!=null&&$m(u))}function to(u,h,y,S){if(h.subtreeFlags&10256)for(h=h.child;h!==null;)yU(u,h,y,S),h=h.sibling}function yU(u,h,y,S){var R=h.flags;switch(h.tag){case 0:case 11:case 15:to(u,h,y,S),R&2048&&ig(9,h);break;case 1:to(u,h,y,S);break;case 3:to(u,h,y,S),R&2048&&(u=null,h.alternate!==null&&(u=h.alternate.memoizedState.cache),h=h.memoizedState.cache,h!==u&&(h.refCount++,u!=null&&$m(u)));break;case 12:if(R&2048){to(u,h,y,S),u=h.stateNode;try{var O=h.memoizedProps,$=O.id,ne=O.onPostCommit;typeof ne=="function"&&ne($,h.alternate===null?"mount":"update",u.passiveEffectDuration,-0)}catch(_e){On(h,h.return,_e)}}else to(u,h,y,S);break;case 31:to(u,h,y,S);break;case 13:to(u,h,y,S);break;case 23:break;case 22:O=h.stateNode,$=h.alternate,h.memoizedState!==null?O._visibility&2?to(u,h,y,S):ag(u,h):O._visibility&2?to(u,h,y,S):(O._visibility|=2,dh(u,h,y,S,(h.subtreeFlags&10256)!==0||!1)),R&2048&&NE($,h);break;case 24:to(u,h,y,S),R&2048&&RE(h.alternate,h);break;default:to(u,h,y,S)}}function dh(u,h,y,S,R){for(R=R&&((h.subtreeFlags&10256)!==0||!1),h=h.child;h!==null;){var O=u,$=h,ne=y,_e=S,Fe=$.flags;switch($.tag){case 0:case 11:case 15:dh(O,$,ne,_e,R),ig(8,$);break;case 23:break;case 22:var Je=$.stateNode;$.memoizedState!==null?Je._visibility&2?dh(O,$,ne,_e,R):ag(O,$):(Je._visibility|=2,dh(O,$,ne,_e,R)),R&&Fe&2048&&NE($.alternate,$);break;case 24:dh(O,$,ne,_e,R),R&&Fe&2048&&RE($.alternate,$);break;default:dh(O,$,ne,_e,R)}h=h.sibling}}function ag(u,h){if(h.subtreeFlags&10256)for(h=h.child;h!==null;){var y=u,S=h,R=S.flags;switch(S.tag){case 22:ag(y,S),R&2048&&NE(S.alternate,S);break;case 24:ag(y,S),R&2048&&RE(S.alternate,S);break;default:ag(y,S)}h=h.sibling}}var sg=8192;function fh(u,h,y){if(u.subtreeFlags&sg)for(u=u.child;u!==null;)bU(u,h,y),u=u.sibling}function bU(u,h,y){switch(u.tag){case 26:fh(u,h,y),u.flags&sg&&u.memoizedState!==null&&_te(y,eo,u.memoizedState,u.memoizedProps);break;case 5:fh(u,h,y);break;case 3:case 4:var S=eo;eo=sy(u.stateNode.containerInfo),fh(u,h,y),eo=S;break;case 22:u.memoizedState===null&&(S=u.alternate,S!==null&&S.memoizedState!==null?(S=sg,sg=16777216,fh(u,h,y),sg=S):fh(u,h,y));break;default:fh(u,h,y)}}function _U(u){var h=u.alternate;if(h!==null&&(u=h.child,u!==null)){h.child=null;do h=u.sibling,u.sibling=null,u=h;while(u!==null)}}function og(u){var h=u.deletions;if((u.flags&16)!==0){if(h!==null)for(var y=0;yjn&&($=jn,jn=zt,zt=$);var Oe=_L(ne,zt),Ee=_L(ne,jn);if(Oe&&Ee&&(Ke.rangeCount!==1||Ke.anchorNode!==Oe.node||Ke.anchorOffset!==Oe.offset||Ke.focusNode!==Ee.node||Ke.focusOffset!==Ee.offset)){var je=st.createRange();je.setStart(Oe.node,Oe.offset),Ke.removeAllRanges(),zt>jn?(Ke.addRange(je),Ke.extend(Ee.node,Ee.offset)):(je.setEnd(Ee.node,Ee.offset),Ke.addRange(je))}}}}for(st=[],Ke=ne;Ke=Ke.parentNode;)Ke.nodeType===1&&st.push({element:Ke,left:Ke.scrollLeft,top:Ke.scrollTop});for(typeof ne.focus=="function"&&ne.focus(),ne=0;ney?32:y,V.T=null,y=LE,LE=null;var O=$c,$=_l;if(Qi=0,mh=$c=null,_l=0,(Tn&6)!==0)throw Error(i(331));var ne=Tn;if(Tn|=4,SU(O.current),yU(O,O.current,$,y),Tn=ne,ug(0,!1),Re&&typeof Re.onPostCommitFiberRoot=="function")try{Re.onPostCommitFiberRoot(Ie,O)}catch{}return!0}finally{G.p=R,V.T=S,zU(u,h)}}function HU(u,h,y){h=gs(y,h),h=pE(u.stateNode,h,2),u=Uc(u,h,2),u!==null&&(on(u,2),Ro(u))}function On(u,h,y){if(u.tag===3)HU(u,u,y);else for(;h!==null;){if(h.tag===3){HU(h,u,y);break}else if(h.tag===1){var S=h.stateNode;if(typeof h.type.getDerivedStateFromError=="function"||typeof S.componentDidCatch=="function"&&(Vc===null||!Vc.has(S))){u=gs(y,u),y=VI(2),S=Uc(h,y,2),S!==null&&($I(y,S,h,u),on(S,2),Ro(S));break}}h=h.return}}function FE(u,h,y){var S=u.pingCache;if(S===null){S=u.pingCache=new Uee;var R=new Set;S.set(h,R)}else R=S.get(h),R===void 0&&(R=new Set,S.set(h,R));R.has(y)||(PE=!0,R.add(y),u=Hee.bind(null,u,h,y),h.then(u,u))}function Hee(u,h,y){var S=u.pingCache;S!==null&&S.delete(h),u.pingedLanes|=u.suspendedLanes&y,u.warmLanes&=~y,qn===u&&(gn&y)===y&&(_i===4||_i===3&&(gn&62914560)===gn&&300>k()-Xv?(Tn&2)===0&&gh(u,0):DE|=y,ph===gn&&(ph=0)),Ro(u)}function VU(u,h){h===0&&(h=bt()),u=pd(u,h),u!==null&&(on(u,h),Ro(u))}function Vee(u){var h=u.memoizedState,y=0;h!==null&&(y=h.retryLane),VU(u,y)}function $ee(u,h){var y=0;switch(u.tag){case 31:case 13:var S=u.stateNode,R=u.memoizedState;R!==null&&(y=R.retryLane);break;case 19:S=u.stateNode;break;case 22:S=u.stateNode._retryCache;break;default:throw Error(i(314))}S!==null&&S.delete(h),VU(u,y)}function Gee(u,h){return De(u,h)}var ty=null,vh=null,zE=!1,ny=!1,BE=!1,Wc=0;function Ro(u){u!==vh&&u.next===null&&(vh===null?ty=vh=u:vh=vh.next=u),ny=!0,zE||(zE=!0,qee())}function ug(u,h){if(!BE&&ny){BE=!0;do for(var y=!1,S=ty;S!==null;){if(u!==0){var R=S.pendingLanes;if(R===0)var O=0;else{var $=S.suspendedLanes,ne=S.pingedLanes;O=(1<<31-tt(42|u)+1)-1,O&=R&~($&~ne),O=O&201326741?O&201326741|1:O?O|2:0}O!==0&&(y=!0,qU(S,O))}else O=gn,O=ge(S,S===qn?O:0,S.cancelPendingCommit!==null||S.timeoutHandle!==-1),(O&3)===0||Be(S,O)||(y=!0,qU(S,O));S=S.next}while(y);BE=!1}}function Wee(){$U()}function $U(){ny=zE=!1;var u=0;Wc!==0&&ite()&&(u=Wc);for(var h=k(),y=null,S=ty;S!==null;){var R=S.next,O=GU(S,h);O===0?(S.next=null,y===null?ty=R:y.next=R,R===null&&(vh=y)):(y=S,(u!==0||(O&3)!==0)&&(ny=!0)),S=R}Qi!==0&&Qi!==5||ug(u),Wc!==0&&(Wc=0)}function GU(u,h){for(var y=u.suspendedLanes,S=u.pingedLanes,R=u.expirationTimes,O=u.pendingLanes&-62914561;0ne)break;var Je=_e.transferSize,st=_e.initiatorType;Je&&t4(st)&&(_e=_e.responseEnd,$+=Je*(_e"u"?null:document;function h4(u,h,y){var S=yh;if(S&&typeof h=="string"&&h){var R=Cn(h);R='link[rel="'+u+'"][href="'+R+'"]',typeof y=="string"&&(R+='[crossorigin="'+y+'"]'),f4.has(R)||(f4.add(R),u={rel:u,crossOrigin:y,href:h},S.querySelector(R)===null&&(h=S.createElement("link"),kr(h,"link",u),Te(h),S.head.appendChild(h)))}}function fte(u){Sl.D(u),h4("dns-prefetch",u,null)}function hte(u,h){Sl.C(u,h),h4("preconnect",u,h)}function pte(u,h,y){Sl.L(u,h,y);var S=yh;if(S&&u&&h){var R='link[rel="preload"][as="'+Cn(h)+'"]';h==="image"&&y&&y.imageSrcSet?(R+='[imagesrcset="'+Cn(y.imageSrcSet)+'"]',typeof y.imageSizes=="string"&&(R+='[imagesizes="'+Cn(y.imageSizes)+'"]')):R+='[href="'+Cn(u)+'"]';var O=R;switch(h){case"style":O=bh(u);break;case"script":O=_h(u)}Ss.has(O)||(u=f({rel:"preload",href:h==="image"&&y&&y.imageSrcSet?void 0:u,as:h},y),Ss.set(O,u),S.querySelector(R)!==null||h==="style"&&S.querySelector(pg(O))||h==="script"&&S.querySelector(mg(O))||(h=S.createElement("link"),kr(h,"link",u),Te(h),S.head.appendChild(h)))}}function mte(u,h){Sl.m(u,h);var y=yh;if(y&&u){var S=h&&typeof h.as=="string"?h.as:"script",R='link[rel="modulepreload"][as="'+Cn(S)+'"][href="'+Cn(u)+'"]',O=R;switch(S){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":O=_h(u)}if(!Ss.has(O)&&(u=f({rel:"modulepreload",href:u},h),Ss.set(O,u),y.querySelector(R)===null)){switch(S){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(y.querySelector(mg(O)))return}S=y.createElement("link"),kr(S,"link",u),Te(S),y.head.appendChild(S)}}}function gte(u,h,y){Sl.S(u,h,y);var S=yh;if(S&&u){var R=Ce(S).hoistableStyles,O=bh(u);h=h||"default";var $=R.get(O);if(!$){var ne={loading:0,preload:null};if($=S.querySelector(pg(O)))ne.loading=5;else{u=f({rel:"stylesheet",href:u,"data-precedence":h},y),(y=Ss.get(O))&&iA(u,y);var _e=$=S.createElement("link");Te(_e),kr(_e,"link",u),_e._p=new Promise(function(Fe,Je){_e.onload=Fe,_e.onerror=Je}),_e.addEventListener("load",function(){ne.loading|=1}),_e.addEventListener("error",function(){ne.loading|=2}),ne.loading|=4,oy($,h,S)}$={type:"stylesheet",instance:$,count:1,state:ne},R.set(O,$)}}}function xte(u,h){Sl.X(u,h);var y=yh;if(y&&u){var S=Ce(y).hoistableScripts,R=_h(u),O=S.get(R);O||(O=y.querySelector(mg(R)),O||(u=f({src:u,async:!0},h),(h=Ss.get(R))&&rA(u,h),O=y.createElement("script"),Te(O),kr(O,"link",u),y.head.appendChild(O)),O={type:"script",instance:O,count:1,state:null},S.set(R,O))}}function vte(u,h){Sl.M(u,h);var y=yh;if(y&&u){var S=Ce(y).hoistableScripts,R=_h(u),O=S.get(R);O||(O=y.querySelector(mg(R)),O||(u=f({src:u,async:!0,type:"module"},h),(h=Ss.get(R))&&rA(u,h),O=y.createElement("script"),Te(O),kr(O,"link",u),y.head.appendChild(O)),O={type:"script",instance:O,count:1,state:null},S.set(R,O))}}function p4(u,h,y,S){var R=(R=ie.current)?sy(R):null;if(!R)throw Error(i(446));switch(u){case"meta":case"title":return null;case"style":return typeof y.precedence=="string"&&typeof y.href=="string"?(h=bh(y.href),y=Ce(R).hoistableStyles,S=y.get(h),S||(S={type:"style",instance:null,count:0,state:null},y.set(h,S)),S):{type:"void",instance:null,count:0,state:null};case"link":if(y.rel==="stylesheet"&&typeof y.href=="string"&&typeof y.precedence=="string"){u=bh(y.href);var O=Ce(R).hoistableStyles,$=O.get(u);if($||(R=R.ownerDocument||R,$={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},O.set(u,$),(O=R.querySelector(pg(u)))&&!O._p&&($.instance=O,$.state.loading=5),Ss.has(u)||(y={rel:"preload",as:"style",href:y.href,crossOrigin:y.crossOrigin,integrity:y.integrity,media:y.media,hrefLang:y.hrefLang,referrerPolicy:y.referrerPolicy},Ss.set(u,y),O||yte(R,u,y,$.state))),h&&S===null)throw Error(i(528,""));return $}if(h&&S!==null)throw Error(i(529,""));return null;case"script":return h=y.async,y=y.src,typeof y=="string"&&h&&typeof h!="function"&&typeof h!="symbol"?(h=_h(y),y=Ce(R).hoistableScripts,S=y.get(h),S||(S={type:"script",instance:null,count:0,state:null},y.set(h,S)),S):{type:"void",instance:null,count:0,state:null};default:throw Error(i(444,u))}}function bh(u){return'href="'+Cn(u)+'"'}function pg(u){return'link[rel="stylesheet"]['+u+"]"}function m4(u){return f({},u,{"data-precedence":u.precedence,precedence:null})}function yte(u,h,y,S){u.querySelector('link[rel="preload"][as="style"]['+h+"]")?S.loading=1:(h=u.createElement("link"),S.preload=h,h.addEventListener("load",function(){return S.loading|=1}),h.addEventListener("error",function(){return S.loading|=2}),kr(h,"link",y),Te(h),u.head.appendChild(h))}function _h(u){return'[src="'+Cn(u)+'"]'}function mg(u){return"script[async]"+u}function g4(u,h,y){if(h.count++,h.instance===null)switch(h.type){case"style":var S=u.querySelector('style[data-href~="'+Cn(y.href)+'"]');if(S)return h.instance=S,Te(S),S;var R=f({},y,{"data-href":y.href,"data-precedence":y.precedence,href:null,precedence:null});return S=(u.ownerDocument||u).createElement("style"),Te(S),kr(S,"style",R),oy(S,y.precedence,u),h.instance=S;case"stylesheet":R=bh(y.href);var O=u.querySelector(pg(R));if(O)return h.state.loading|=4,h.instance=O,Te(O),O;S=m4(y),(R=Ss.get(R))&&iA(S,R),O=(u.ownerDocument||u).createElement("link"),Te(O);var $=O;return $._p=new Promise(function(ne,_e){$.onload=ne,$.onerror=_e}),kr(O,"link",S),h.state.loading|=4,oy(O,y.precedence,u),h.instance=O;case"script":return O=_h(y.src),(R=u.querySelector(mg(O)))?(h.instance=R,Te(R),R):(S=y,(R=Ss.get(O))&&(S=f({},y),rA(S,R)),u=u.ownerDocument||u,R=u.createElement("script"),Te(R),kr(R,"link",S),u.head.appendChild(R),h.instance=R);case"void":return null;default:throw Error(i(443,h.type))}else h.type==="stylesheet"&&(h.state.loading&4)===0&&(S=h.instance,h.state.loading|=4,oy(S,y.precedence,u));return h.instance}function oy(u,h,y){for(var S=y.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),R=S.length?S[S.length-1]:null,O=R,$=0;$ title"):null)}function bte(u,h,y){if(y===1||h.itemProp!=null)return!1;switch(u){case"meta":case"title":return!0;case"style":if(typeof h.precedence!="string"||typeof h.href!="string"||h.href==="")break;return!0;case"link":if(typeof h.rel!="string"||typeof h.href!="string"||h.href===""||h.onLoad||h.onError)break;switch(h.rel){case"stylesheet":return u=h.disabled,typeof h.precedence=="string"&&u==null;default:return!0}case"script":if(h.async&&typeof h.async!="function"&&typeof h.async!="symbol"&&!h.onLoad&&!h.onError&&h.src&&typeof h.src=="string")return!0}return!1}function y4(u){return!(u.type==="stylesheet"&&(u.state.loading&3)===0)}function _te(u,h,y,S){if(y.type==="stylesheet"&&(typeof S.media!="string"||matchMedia(S.media).matches!==!1)&&(y.state.loading&4)===0){if(y.instance===null){var R=bh(S.href),O=h.querySelector(pg(R));if(O){h=O._p,h!==null&&typeof h=="object"&&typeof h.then=="function"&&(u.count++,u=cy.bind(u),h.then(u,u)),y.state.loading|=4,y.instance=O,Te(O);return}O=h.ownerDocument||h,S=m4(S),(R=Ss.get(R))&&iA(S,R),O=O.createElement("link"),Te(O);var $=O;$._p=new Promise(function(ne,_e){$.onload=ne,$.onerror=_e}),kr(O,"link",S),y.instance=O}u.stylesheets===null&&(u.stylesheets=new Map),u.stylesheets.set(y,h),(h=y.state.preload)&&(y.state.loading&3)===0&&(u.count++,y=cy.bind(u),h.addEventListener("load",y),h.addEventListener("error",y))}}var aA=0;function Ste(u,h){return u.stylesheets&&u.count===0&&dy(u,u.stylesheets),0aA?50:800)+h);return u.unsuspend=y,function(){u.unsuspend=null,clearTimeout(S),clearTimeout(R)}}:null}function cy(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)dy(this,this.stylesheets);else if(this.unsuspend){var u=this.unsuspend;this.unsuspend=null,u()}}}var uy=null;function dy(u,h){u.stylesheets=null,u.unsuspend!==null&&(u.count++,uy=new Map,h.forEach(wte,u),uy=null,cy.call(u))}function wte(u,h){if(!(h.state.loading&4)){var y=uy.get(u);if(y)var S=y.get(null);else{y=new Map,uy.set(u,y);for(var R=u.querySelectorAll("link[data-precedence],style[data-precedence]"),O=0;O"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),pA.exports=zte(),pA.exports}var Hte=Bte();const Ht=t=>typeof t=="string",Sg=()=>{let t,e;const n=new Promise((i,r)=>{t=i,e=r});return n.resolve=t,n.reject=e,n},V4=t=>t==null?"":""+t,Vte=(t,e,n)=>{t.forEach(i=>{e[i]&&(n[i]=e[i])})},$te=/###/g,$4=t=>t&&t.indexOf("###")>-1?t.replace($te,"."):t,G4=t=>!t||Ht(t),a0=(t,e,n)=>{const i=Ht(e)?e.split("."):e;let r=0;for(;r{const{obj:i,k:r}=a0(t,e,Object);if(i!==void 0||e.length===1){i[r]=n;return}let a=e[e.length-1],s=e.slice(0,e.length-1),o=a0(t,s,Object);for(;o.obj===void 0&&s.length;)a=`${s[s.length-1]}.${a}`,s=s.slice(0,s.length-1),o=a0(t,s,Object),o?.obj&&typeof o.obj[`${o.k}.${a}`]<"u"&&(o.obj=void 0);o.obj[`${o.k}.${a}`]=n},Gte=(t,e,n,i)=>{const{obj:r,k:a}=a0(t,e,Object);r[a]=r[a]||[],r[a].push(n)},M_=(t,e)=>{const{obj:n,k:i}=a0(t,e);if(n&&Object.prototype.hasOwnProperty.call(n,i))return n[i]},Wte=(t,e,n)=>{const i=M_(t,n);return i!==void 0?i:M_(e,n)},Y$=(t,e,n)=>{for(const i in e)i!=="__proto__"&&i!=="constructor"&&(i in t?Ht(t[i])||t[i]instanceof String||Ht(e[i])||e[i]instanceof String?n&&(t[i]=e[i]):Y$(t[i],e[i],n):t[i]=e[i]);return t},wh=t=>t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var qte={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const Xte=t=>Ht(t)?t.replace(/[&<>"'\/]/g,e=>qte[e]):t;class Kte{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){const n=this.regExpMap.get(e);if(n!==void 0)return n;const i=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,i),this.regExpQueue.push(e),i}}const Yte=[" ",",","?","!",";"],Zte=new Kte(20),Qte=(t,e,n)=>{e=e||"",n=n||"";const i=Yte.filter(s=>e.indexOf(s)<0&&n.indexOf(s)<0);if(i.length===0)return!0;const r=Zte.getRegExp(`(${i.map(s=>s==="?"?"\\?":s).join("|")})`);let a=!r.test(t);if(!a){const s=t.indexOf(n);s>0&&!r.test(t.substring(0,s))&&(a=!0)}return a},iN=(t,e,n=".")=>{if(!t)return;if(t[e])return Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0;const i=e.split(n);let r=t;for(let a=0;a-1&&lt?.replace("_","-"),Jte={type:"logger",log(t){this.output("log",t)},warn(t){this.output("warn",t)},error(t){this.output("error",t)},output(t,e){console?.[t]?.apply?.(console,e)}};class E_{constructor(e,n={}){this.init(e,n)}init(e,n={}){this.prefix=n.prefix||"i18next:",this.logger=e||Jte,this.options=n,this.debug=n.debug}log(...e){return this.forward(e,"log","",!0)}warn(...e){return this.forward(e,"warn","",!0)}error(...e){return this.forward(e,"error","")}deprecate(...e){return this.forward(e,"warn","WARNING DEPRECATED: ",!0)}forward(e,n,i,r){return r&&!this.debug?null:(Ht(e[0])&&(e[0]=`${i}${this.prefix} ${e[0]}`),this.logger[n](e))}create(e){return new E_(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return e=e||this.options,e.prefix=e.prefix||this.prefix,new E_(this.logger,e)}}var zo=new E_;let OS=class{constructor(){this.observers={}}on(e,n){return e.split(" ").forEach(i=>{this.observers[i]||(this.observers[i]=new Map);const r=this.observers[i].get(n)||0;this.observers[i].set(n,r+1)}),this}off(e,n){if(this.observers[e]){if(!n){delete this.observers[e];return}this.observers[e].delete(n)}}emit(e,...n){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([r,a])=>{for(let s=0;s{for(let s=0;s-1&&this.options.ns.splice(n,1)}getResource(e,n,i,r={}){const a=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator,s=r.ignoreJSONStructure!==void 0?r.ignoreJSONStructure:this.options.ignoreJSONStructure;let o;e.indexOf(".")>-1?o=e.split("."):(o=[e,n],i&&(Array.isArray(i)?o.push(...i):Ht(i)&&a?o.push(...i.split(a)):o.push(i)));const l=M_(this.data,o);return!l&&!n&&!i&&e.indexOf(".")>-1&&(e=o[0],n=o[1],i=o.slice(2).join(".")),l||!s||!Ht(i)?l:iN(this.data?.[e]?.[n],i,a)}addResource(e,n,i,r,a={silent:!1}){const s=a.keySeparator!==void 0?a.keySeparator:this.options.keySeparator;let o=[e,n];i&&(o=o.concat(s?i.split(s):i)),e.indexOf(".")>-1&&(o=e.split("."),r=n,n=o[1]),this.addNamespaces(n),W4(this.data,o,r),a.silent||this.emit("added",e,n,i,r)}addResources(e,n,i,r={silent:!1}){for(const a in i)(Ht(i[a])||Array.isArray(i[a]))&&this.addResource(e,n,a,i[a],{silent:!0});r.silent||this.emit("added",e,n,i)}addResourceBundle(e,n,i,r,a,s={silent:!1,skipCopy:!1}){let o=[e,n];e.indexOf(".")>-1&&(o=e.split("."),r=i,i=n,n=o[1]),this.addNamespaces(n);let l=M_(this.data,o)||{};s.skipCopy||(i=JSON.parse(JSON.stringify(i))),r?Y$(l,i,a):l={...l,...i},W4(this.data,o,l),s.silent||this.emit("added",e,n,i)}removeResourceBundle(e,n){this.hasResourceBundle(e,n)&&delete this.data[e][n],this.removeNamespaces(n),this.emit("removed",e,n)}hasResourceBundle(e,n){return this.getResource(e,n)!==void 0}getResourceBundle(e,n){return n||(n=this.options.defaultNS),this.getResource(e,n)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){const n=this.getDataByLanguage(e);return!!(n&&Object.keys(n)||[]).find(r=>n[r]&&Object.keys(n[r]).length>0)}toJSON(){return this.data}}var Z$={processors:{},addPostProcessor(t){this.processors[t.name]=t},handle(t,e,n,i,r){return t.forEach(a=>{e=this.processors[a]?.process(e,n,i,r)??e}),e}};const Q$=Symbol("i18next/PATH_KEY");function ene(){const t=[],e=Object.create(null);let n;return e.get=(i,r)=>(n?.revoke?.(),r===Q$?t:(t.push(r),n=Proxy.revocable(i,e),n.proxy)),Proxy.revocable(Object.create(null),e).proxy}function rN(t,e){const{[Q$]:n}=t(ene());return n.join(e?.keySeparator??".")}const X4={},vA=t=>!Ht(t)&&typeof t!="boolean"&&typeof t!="number";class A_ extends OS{constructor(e,n={}){super(),Vte(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,this),this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=zo.create("translator")}changeLanguage(e){e&&(this.language=e)}exists(e,n={interpolation:{}}){const i={...n};if(e==null)return!1;const r=this.resolve(e,i);if(r?.res===void 0)return!1;const a=vA(r.res);return!(i.returnObjects===!1&&a)}extractFromKey(e,n){let i=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;i===void 0&&(i=":");const r=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator;let a=n.ns||this.options.defaultNS||[];const s=i&&e.indexOf(i)>-1,o=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!Qte(e,i,r);if(s&&!o){const l=e.match(this.interpolator.nestingRegexp);if(l&&l.length>0)return{key:e,namespaces:Ht(a)?[a]:a};const c=e.split(i);(i!==r||i===r&&this.options.ns.indexOf(c[0])>-1)&&(a=c.shift()),e=c.join(r)}return{key:e,namespaces:Ht(a)?[a]:a}}translate(e,n,i){let r=typeof n=="object"?{...n}:n;if(typeof r!="object"&&this.options.overloadTranslationOptionHandler&&(r=this.options.overloadTranslationOptionHandler(arguments)),typeof r=="object"&&(r={...r}),r||(r={}),e==null)return"";typeof e=="function"&&(e=rN(e,{...this.options,...r})),Array.isArray(e)||(e=[String(e)]);const a=r.returnDetails!==void 0?r.returnDetails:this.options.returnDetails,s=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator,{key:o,namespaces:l}=this.extractFromKey(e[e.length-1],r),c=l[l.length-1];let d=r.nsSeparator!==void 0?r.nsSeparator:this.options.nsSeparator;d===void 0&&(d=":");const f=r.lng||this.language,p=r.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(f?.toLowerCase()==="cimode")return p?a?{res:`${c}${d}${o}`,usedKey:o,exactUsedKey:o,usedLng:f,usedNS:c,usedParams:this.getUsedParamsDetails(r)}:`${c}${d}${o}`:a?{res:o,usedKey:o,exactUsedKey:o,usedLng:f,usedNS:c,usedParams:this.getUsedParamsDetails(r)}:o;const m=this.resolve(e,r);let b=m?.res;const _=m?.usedKey||o,v=m?.exactUsedKey||o,x=["[object Number]","[object Function]","[object RegExp]"],M=r.joinArrays!==void 0?r.joinArrays:this.options.joinArrays,w=!this.i18nFormat||this.i18nFormat.handleAsObject,E=r.count!==void 0&&!Ht(r.count),T=A_.hasDefaultValue(r),P=E?this.pluralResolver.getSuffix(f,r.count,r):"",N=r.ordinal&&E?this.pluralResolver.getSuffix(f,r.count,{ordinal:!1}):"",U=E&&!r.ordinal&&r.count===0,C=U&&r[`defaultValue${this.options.pluralSeparator}zero`]||r[`defaultValue${P}`]||r[`defaultValue${N}`]||r.defaultValue;let D=b;w&&!b&&T&&(D=C);const F=vA(D),I=Object.prototype.toString.apply(D);if(w&&D&&F&&x.indexOf(I)<0&&!(Ht(M)&&Array.isArray(D))){if(!r.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const q=this.options.returnedObjectHandler?this.options.returnedObjectHandler(_,D,{...r,ns:l}):`key '${o} (${this.language})' returned an object instead of string.`;return a?(m.res=q,m.usedParams=this.getUsedParamsDetails(r),m):q}if(s){const q=Array.isArray(D),L=q?[]:{},H=q?v:_;for(const V in D)if(Object.prototype.hasOwnProperty.call(D,V)){const G=`${H}${s}${V}`;T&&!b?L[V]=this.translate(G,{...r,defaultValue:vA(C)?C[V]:void 0,joinArrays:!1,ns:l}):L[V]=this.translate(G,{...r,joinArrays:!1,ns:l}),L[V]===G&&(L[V]=D[V])}b=L}}else if(w&&Ht(M)&&Array.isArray(b))b=b.join(M),b&&(b=this.extendTranslation(b,e,r,i));else{let q=!1,L=!1;!this.isValidLookup(b)&&T&&(q=!0,b=C),this.isValidLookup(b)||(L=!0,b=o);const V=(r.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&L?void 0:b,G=T&&C!==b&&this.options.updateMissing;if(L||q||G){if(this.logger.log(G?"updateKey":"missingKey",f,c,o,G?C:b),s){const B=this.resolve(o,{...r,keySeparator:!1});B&&B.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let K=[];const Z=this.languageUtils.getFallbackCodes(this.options.fallbackLng,r.lng||this.language);if(this.options.saveMissingTo==="fallback"&&Z&&Z[0])for(let B=0;B{const ce=T&&ae!==b?ae:V;this.options.missingKeyHandler?this.options.missingKeyHandler(B,c,X,ce,G,r):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(B,c,X,ce,G,r),this.emit("missingKey",B,c,X,b)};this.options.saveMissing&&(this.options.saveMissingPlurals&&E?K.forEach(B=>{const X=this.pluralResolver.getSuffixes(B,r);U&&r[`defaultValue${this.options.pluralSeparator}zero`]&&X.indexOf(`${this.options.pluralSeparator}zero`)<0&&X.push(`${this.options.pluralSeparator}zero`),X.forEach(ae=>{se([B],o+ae,r[`defaultValue${ae}`]||C)})}):se(K,o,C))}b=this.extendTranslation(b,e,r,m,i),L&&b===o&&this.options.appendNamespaceToMissingKey&&(b=`${c}${d}${o}`),(L||q)&&this.options.parseMissingKeyHandler&&(b=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${c}${d}${o}`:o,q?b:void 0,r))}return a?(m.res=b,m.usedParams=this.getUsedParamsDetails(r),m):b}extendTranslation(e,n,i,r,a){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...i},i.lng||this.language||r.usedLng,r.usedNS,r.usedKey,{resolved:r});else if(!i.skipInterpolation){i.interpolation&&this.interpolator.init({...i,interpolation:{...this.options.interpolation,...i.interpolation}});const l=Ht(e)&&(i?.interpolation?.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let c;if(l){const f=e.match(this.interpolator.nestingRegexp);c=f&&f.length}let d=i.replace&&!Ht(i.replace)?i.replace:i;if(this.options.interpolation.defaultVariables&&(d={...this.options.interpolation.defaultVariables,...d}),e=this.interpolator.interpolate(e,d,i.lng||this.language||r.usedLng,i),l){const f=e.match(this.interpolator.nestingRegexp),p=f&&f.length;ca?.[0]===f[0]&&!i.context?(this.logger.warn(`It seems you are nesting recursively key: ${f[0]} in key: ${n[0]}`),null):this.translate(...f,n),i)),i.interpolation&&this.interpolator.reset()}const s=i.postProcess||this.options.postProcess,o=Ht(s)?[s]:s;return e!=null&&o?.length&&i.applyPostProcessor!==!1&&(e=Z$.handle(o,e,n,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...r,usedParams:this.getUsedParamsDetails(i)},...i}:i,this)),e}resolve(e,n={}){let i,r,a,s,o;return Ht(e)&&(e=[e]),e.forEach(l=>{if(this.isValidLookup(i))return;const c=this.extractFromKey(l,n),d=c.key;r=d;let f=c.namespaces;this.options.fallbackNS&&(f=f.concat(this.options.fallbackNS));const p=n.count!==void 0&&!Ht(n.count),m=p&&!n.ordinal&&n.count===0,b=n.context!==void 0&&(Ht(n.context)||typeof n.context=="number")&&n.context!=="",_=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);f.forEach(v=>{this.isValidLookup(i)||(o=v,!X4[`${_[0]}-${v}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(o)&&(X4[`${_[0]}-${v}`]=!0,this.logger.warn(`key "${r}" for languages "${_.join(", ")}" won't get resolved as namespace "${o}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),_.forEach(x=>{if(this.isValidLookup(i))return;s=x;const M=[d];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(M,d,x,v,n);else{let E;p&&(E=this.pluralResolver.getSuffix(x,n.count,n));const T=`${this.options.pluralSeparator}zero`,P=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(p&&(n.ordinal&&E.indexOf(P)===0&&M.push(d+E.replace(P,this.options.pluralSeparator)),M.push(d+E),m&&M.push(d+T)),b){const N=`${d}${this.options.contextSeparator||"_"}${n.context}`;M.push(N),p&&(n.ordinal&&E.indexOf(P)===0&&M.push(N+E.replace(P,this.options.pluralSeparator)),M.push(N+E),m&&M.push(N+T))}}let w;for(;w=M.pop();)this.isValidLookup(i)||(a=w,i=this.getResource(x,v,w,n))}))})}),{res:i,usedKey:r,exactUsedKey:a,usedLng:s,usedNS:o}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e==="")}getResource(e,n,i,r={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,n,i,r):this.resourceStore.getResource(e,n,i,r)}getUsedParamsDetails(e={}){const n=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],i=e.replace&&!Ht(e.replace);let r=i?e.replace:e;if(i&&typeof e.count<"u"&&(r.count=e.count),this.options.interpolation.defaultVariables&&(r={...this.options.interpolation.defaultVariables,...r}),!i){r={...r};for(const a of n)delete r[a]}return r}static hasDefaultValue(e){const n="defaultValue";for(const i in e)if(Object.prototype.hasOwnProperty.call(e,i)&&n===i.substring(0,n.length)&&e[i]!==void 0)return!0;return!1}}class K4{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=zo.create("languageUtils")}getScriptPartFromCode(e){if(e=C0(e),!e||e.indexOf("-")<0)return null;const n=e.split("-");return n.length===2||(n.pop(),n[n.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(n.join("-"))}getLanguagePartFromCode(e){if(e=C0(e),!e||e.indexOf("-")<0)return e;const n=e.split("-");return this.formatLanguageCode(n[0])}formatLanguageCode(e){if(Ht(e)&&e.indexOf("-")>-1){let n;try{n=Intl.getCanonicalLocales(e)[0]}catch{}return n&&this.options.lowerCaseLng&&(n=n.toLowerCase()),n||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}getBestMatchFromCodes(e){if(!e)return null;let n;return e.forEach(i=>{if(n)return;const r=this.formatLanguageCode(i);(!this.options.supportedLngs||this.isSupportedCode(r))&&(n=r)}),!n&&this.options.supportedLngs&&e.forEach(i=>{if(n)return;const r=this.getScriptPartFromCode(i);if(this.isSupportedCode(r))return n=r;const a=this.getLanguagePartFromCode(i);if(this.isSupportedCode(a))return n=a;n=this.options.supportedLngs.find(s=>{if(s===a)return s;if(!(s.indexOf("-")<0&&a.indexOf("-")<0)&&(s.indexOf("-")>0&&a.indexOf("-")<0&&s.substring(0,s.indexOf("-"))===a||s.indexOf(a)===0&&a.length>1))return s})}),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n}getFallbackCodes(e,n){if(!e)return[];if(typeof e=="function"&&(e=e(n)),Ht(e)&&(e=[e]),Array.isArray(e))return e;if(!n)return e.default||[];let i=e[n];return i||(i=e[this.getScriptPartFromCode(n)]),i||(i=e[this.formatLanguageCode(n)]),i||(i=e[this.getLanguagePartFromCode(n)]),i||(i=e.default),i||[]}toResolveHierarchy(e,n){const i=this.getFallbackCodes((n===!1?[]:n)||this.options.fallbackLng||[],e),r=[],a=s=>{s&&(this.isSupportedCode(s)?r.push(s):this.logger.warn(`rejecting language code not found in supportedLngs: ${s}`))};return Ht(e)&&(e.indexOf("-")>-1||e.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&a(this.formatLanguageCode(e)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&a(this.getScriptPartFromCode(e)),this.options.load!=="currentOnly"&&a(this.getLanguagePartFromCode(e))):Ht(e)&&a(this.formatLanguageCode(e)),i.forEach(s=>{r.indexOf(s)<0&&a(this.formatLanguageCode(s))}),r}}const Y4={zero:0,one:1,two:2,few:3,many:4,other:5},Z4={select:t=>t===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class tne{constructor(e,n={}){this.languageUtils=e,this.options=n,this.logger=zo.create("pluralResolver"),this.pluralRulesCache={}}addRule(e,n){this.rules[e]=n}clearCache(){this.pluralRulesCache={}}getRule(e,n={}){const i=C0(e==="dev"?"en":e),r=n.ordinal?"ordinal":"cardinal",a=JSON.stringify({cleanedCode:i,type:r});if(a in this.pluralRulesCache)return this.pluralRulesCache[a];let s;try{s=new Intl.PluralRules(i,{type:r})}catch{if(!Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),Z4;if(!e.match(/-|_/))return Z4;const l=this.languageUtils.getLanguagePartFromCode(e);s=this.getRule(l,n)}return this.pluralRulesCache[a]=s,s}needsPlural(e,n={}){let i=this.getRule(e,n);return i||(i=this.getRule("dev",n)),i?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,n,i={}){return this.getSuffixes(e,i).map(r=>`${n}${r}`)}getSuffixes(e,n={}){let i=this.getRule(e,n);return i||(i=this.getRule("dev",n)),i?i.resolvedOptions().pluralCategories.sort((r,a)=>Y4[r]-Y4[a]).map(r=>`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${r}`):[]}getSuffix(e,n,i={}){const r=this.getRule(e,i);return r?`${this.options.prepend}${i.ordinal?`ordinal${this.options.prepend}`:""}${r.select(n)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix("dev",n,i))}}const Q4=(t,e,n,i=".",r=!0)=>{let a=Wte(t,e,n);return!a&&r&&Ht(n)&&(a=iN(t,n,i),a===void 0&&(a=iN(e,n,i))),a},yA=t=>t.replace(/\$/g,"$$$$");class nne{constructor(e={}){this.logger=zo.create("interpolator"),this.options=e,this.format=e?.interpolation?.format||(n=>n),this.init(e)}init(e={}){e.interpolation||(e.interpolation={escapeValue:!0});const{escape:n,escapeValue:i,useRawValueToEscape:r,prefix:a,prefixEscaped:s,suffix:o,suffixEscaped:l,formatSeparator:c,unescapeSuffix:d,unescapePrefix:f,nestingPrefix:p,nestingPrefixEscaped:m,nestingSuffix:b,nestingSuffixEscaped:_,nestingOptionsSeparator:v,maxReplaces:x,alwaysFormat:M}=e.interpolation;this.escape=n!==void 0?n:Xte,this.escapeValue=i!==void 0?i:!0,this.useRawValueToEscape=r!==void 0?r:!1,this.prefix=a?wh(a):s||"{{",this.suffix=o?wh(o):l||"}}",this.formatSeparator=c||",",this.unescapePrefix=d?"":f||"-",this.unescapeSuffix=this.unescapePrefix?"":d||"",this.nestingPrefix=p?wh(p):m||wh("$t("),this.nestingSuffix=b?wh(b):_||wh(")"),this.nestingOptionsSeparator=v||",",this.maxReplaces=x||1e3,this.alwaysFormat=M!==void 0?M:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const e=(n,i)=>n?.source===i?(n.lastIndex=0,n):new RegExp(i,"g");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,n,i,r){let a,s,o;const l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},c=m=>{if(m.indexOf(this.formatSeparator)<0){const x=Q4(n,l,m,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(x,void 0,i,{...r,...n,interpolationkey:m}):x}const b=m.split(this.formatSeparator),_=b.shift().trim(),v=b.join(this.formatSeparator).trim();return this.format(Q4(n,l,_,this.options.keySeparator,this.options.ignoreJSONStructure),v,i,{...r,...n,interpolationkey:_})};this.resetRegExp();const d=r?.missingInterpolationHandler||this.options.missingInterpolationHandler,f=r?.interpolation?.skipOnVariables!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:m=>yA(m)},{regex:this.regexp,safeValue:m=>this.escapeValue?yA(this.escape(m)):yA(m)}].forEach(m=>{for(o=0;a=m.regex.exec(e);){const b=a[1].trim();if(s=c(b),s===void 0)if(typeof d=="function"){const v=d(e,a,r);s=Ht(v)?v:""}else if(r&&Object.prototype.hasOwnProperty.call(r,b))s="";else if(f){s=a[0];continue}else this.logger.warn(`missed to pass in variable ${b} for interpolating ${e}`),s="";else!Ht(s)&&!this.useRawValueToEscape&&(s=V4(s));const _=m.safeValue(s);if(e=e.replace(a[0],_),f?(m.regex.lastIndex+=s.length,m.regex.lastIndex-=a[0].length):m.regex.lastIndex=0,o++,o>=this.maxReplaces)break}}),e}nest(e,n,i={}){let r,a,s;const o=(l,c)=>{const d=this.nestingOptionsSeparator;if(l.indexOf(d)<0)return l;const f=l.split(new RegExp(`${d}[ ]*{`));let p=`{${f[1]}`;l=f[0],p=this.interpolate(p,s);const m=p.match(/'/g),b=p.match(/"/g);((m?.length??0)%2===0&&!b||b.length%2!==0)&&(p=p.replace(/'/g,'"'));try{s=JSON.parse(p),c&&(s={...c,...s})}catch(_){return this.logger.warn(`failed parsing options string in nesting for key ${l}`,_),`${l}${d}${p}`}return s.defaultValue&&s.defaultValue.indexOf(this.prefix)>-1&&delete s.defaultValue,l};for(;r=this.nestingRegexp.exec(e);){let l=[];s={...i},s=s.replace&&!Ht(s.replace)?s.replace:s,s.applyPostProcessor=!1,delete s.defaultValue;const c=/{.*}/.test(r[1])?r[1].lastIndexOf("}")+1:r[1].indexOf(this.formatSeparator);if(c!==-1&&(l=r[1].slice(c).split(this.formatSeparator).map(d=>d.trim()).filter(Boolean),r[1]=r[1].slice(0,c)),a=n(o.call(this,r[1].trim(),s),s),a&&r[0]===e&&!Ht(a))return a;Ht(a)||(a=V4(a)),a||(this.logger.warn(`missed to resolve ${r[1]} for nesting ${e}`),a=""),l.length&&(a=l.reduce((d,f)=>this.format(d,f,i.lng,{...i,interpolationkey:r[1].trim()}),a.trim())),e=e.replace(r[0],a),this.regexp.lastIndex=0}return e}}const ine=t=>{let e=t.toLowerCase().trim();const n={};if(t.indexOf("(")>-1){const i=t.split("(");e=i[0].toLowerCase().trim();const r=i[1].substring(0,i[1].length-1);e==="currency"&&r.indexOf(":")<0?n.currency||(n.currency=r.trim()):e==="relativetime"&&r.indexOf(":")<0?n.range||(n.range=r.trim()):r.split(";").forEach(s=>{if(s){const[o,...l]=s.split(":"),c=l.join(":").trim().replace(/^'+|'+$/g,""),d=o.trim();n[d]||(n[d]=c),c==="false"&&(n[d]=!1),c==="true"&&(n[d]=!0),isNaN(c)||(n[d]=parseInt(c,10))}})}return{formatName:e,formatOptions:n}},J4=t=>{const e={};return(n,i,r)=>{let a=r;r&&r.interpolationkey&&r.formatParams&&r.formatParams[r.interpolationkey]&&r[r.interpolationkey]&&(a={...a,[r.interpolationkey]:void 0});const s=i+JSON.stringify(a);let o=e[s];return o||(o=t(C0(i),r),e[s]=o),o(n)}},rne=t=>(e,n,i)=>t(C0(n),i)(e);class ane{constructor(e={}){this.logger=zo.create("formatter"),this.options=e,this.init(e)}init(e,n={interpolation:{}}){this.formatSeparator=n.interpolation.formatSeparator||",";const i=n.cacheInBuiltFormats?J4:rne;this.formats={number:i((r,a)=>{const s=new Intl.NumberFormat(r,{...a});return o=>s.format(o)}),currency:i((r,a)=>{const s=new Intl.NumberFormat(r,{...a,style:"currency"});return o=>s.format(o)}),datetime:i((r,a)=>{const s=new Intl.DateTimeFormat(r,{...a});return o=>s.format(o)}),relativetime:i((r,a)=>{const s=new Intl.RelativeTimeFormat(r,{...a});return o=>s.format(o,a.range||"day")}),list:i((r,a)=>{const s=new Intl.ListFormat(r,{...a});return o=>s.format(o)})}}add(e,n){this.formats[e.toLowerCase().trim()]=n}addCached(e,n){this.formats[e.toLowerCase().trim()]=J4(n)}format(e,n,i,r={}){const a=n.split(this.formatSeparator);if(a.length>1&&a[0].indexOf("(")>1&&a[0].indexOf(")")<0&&a.find(o=>o.indexOf(")")>-1)){const o=a.findIndex(l=>l.indexOf(")")>-1);a[0]=[a[0],...a.splice(1,o)].join(this.formatSeparator)}return a.reduce((o,l)=>{const{formatName:c,formatOptions:d}=ine(l);if(this.formats[c]){let f=o;try{const p=r?.formatParams?.[r.interpolationkey]||{},m=p.locale||p.lng||r.locale||r.lng||i;f=this.formats[c](o,m,{...d,...r,...p})}catch(p){this.logger.warn(p)}return f}else this.logger.warn(`there was no format function for ${c}`);return o},e)}}const sne=(t,e)=>{t.pending[e]!==void 0&&(delete t.pending[e],t.pendingCount--)};class one extends OS{constructor(e,n,i,r={}){super(),this.backend=e,this.store=n,this.services=i,this.languageUtils=i.languageUtils,this.options=r,this.logger=zo.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=r.maxParallelReads||10,this.readingCalls=0,this.maxRetries=r.maxRetries>=0?r.maxRetries:5,this.retryTimeout=r.retryTimeout>=1?r.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(i,r.backend,r)}queueLoad(e,n,i,r){const a={},s={},o={},l={};return e.forEach(c=>{let d=!0;n.forEach(f=>{const p=`${c}|${f}`;!i.reload&&this.store.hasResourceBundle(c,f)?this.state[p]=2:this.state[p]<0||(this.state[p]===1?s[p]===void 0&&(s[p]=!0):(this.state[p]=1,d=!1,s[p]===void 0&&(s[p]=!0),a[p]===void 0&&(a[p]=!0),l[f]===void 0&&(l[f]=!0)))}),d||(o[c]=!0)}),(Object.keys(a).length||Object.keys(s).length)&&this.queue.push({pending:s,pendingCount:Object.keys(s).length,loaded:{},errors:[],callback:r}),{toLoad:Object.keys(a),pending:Object.keys(s),toLoadLanguages:Object.keys(o),toLoadNamespaces:Object.keys(l)}}loaded(e,n,i){const r=e.split("|"),a=r[0],s=r[1];n&&this.emit("failedLoading",a,s,n),!n&&i&&this.store.addResourceBundle(a,s,i,void 0,void 0,{skipCopy:!0}),this.state[e]=n?-1:2,n&&i&&(this.state[e]=0);const o={};this.queue.forEach(l=>{Gte(l.loaded,[a],s),sne(l,e),n&&l.errors.push(n),l.pendingCount===0&&!l.done&&(Object.keys(l.loaded).forEach(c=>{o[c]||(o[c]={});const d=l.loaded[c];d.length&&d.forEach(f=>{o[c][f]===void 0&&(o[c][f]=!0)})}),l.done=!0,l.errors.length?l.callback(l.errors):l.callback())}),this.emit("loaded",o),this.queue=this.queue.filter(l=>!l.done)}read(e,n,i,r=0,a=this.retryTimeout,s){if(!e.length)return s(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:n,fcName:i,tried:r,wait:a,callback:s});return}this.readingCalls++;const o=(c,d)=>{if(this.readingCalls--,this.waitingReads.length>0){const f=this.waitingReads.shift();this.read(f.lng,f.ns,f.fcName,f.tried,f.wait,f.callback)}if(c&&d&&r{this.read.call(this,e,n,i,r+1,a*2,s)},a);return}s(c,d)},l=this.backend[i].bind(this.backend);if(l.length===2){try{const c=l(e,n);c&&typeof c.then=="function"?c.then(d=>o(null,d)).catch(o):o(null,c)}catch(c){o(c)}return}return l(e,n,o)}prepareLoading(e,n,i={},r){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),r&&r();Ht(e)&&(e=this.languageUtils.toResolveHierarchy(e)),Ht(n)&&(n=[n]);const a=this.queueLoad(e,n,i,r);if(!a.toLoad.length)return a.pending.length||r(),null;a.toLoad.forEach(s=>{this.loadOne(s)})}load(e,n,i){this.prepareLoading(e,n,{},i)}reload(e,n,i){this.prepareLoading(e,n,{reload:!0},i)}loadOne(e,n=""){const i=e.split("|"),r=i[0],a=i[1];this.read(r,a,"read",void 0,void 0,(s,o)=>{s&&this.logger.warn(`${n}loading namespace ${a} for language ${r} failed`,s),!s&&o&&this.logger.log(`${n}loaded namespace ${a} for language ${r}`,o),this.loaded(e,s,o)})}saveMissing(e,n,i,r,a,s={},o=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(n)){this.logger.warn(`did not save key "${i}" as the namespace "${n}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(i==null||i==="")){if(this.backend?.create){const l={...s,isUpdate:a},c=this.backend.create.bind(this.backend);if(c.length<6)try{let d;c.length===5?d=c(e,n,i,r,l):d=c(e,n,i,r),d&&typeof d.then=="function"?d.then(f=>o(null,f)).catch(o):o(null,d)}catch(d){o(d)}else c(e,n,i,r,o,l)}!e||!e[0]||this.store.addResource(e[0],n,i,r)}}}const ej=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:t=>{let e={};if(typeof t[1]=="object"&&(e=t[1]),Ht(t[1])&&(e.defaultValue=t[1]),Ht(t[2])&&(e.tDescription=t[2]),typeof t[2]=="object"||typeof t[3]=="object"){const n=t[3]||t[2];Object.keys(n).forEach(i=>{e[i]=n[i]})}return e},interpolation:{escapeValue:!0,format:t=>t,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),tj=t=>(Ht(t.ns)&&(t.ns=[t.ns]),Ht(t.fallbackLng)&&(t.fallbackLng=[t.fallbackLng]),Ht(t.fallbackNS)&&(t.fallbackNS=[t.fallbackNS]),t.supportedLngs?.indexOf?.("cimode")<0&&(t.supportedLngs=t.supportedLngs.concat(["cimode"])),typeof t.initImmediate=="boolean"&&(t.initAsync=t.initImmediate),t),by=()=>{},lne=t=>{Object.getOwnPropertyNames(Object.getPrototypeOf(t)).forEach(n=>{typeof t[n]=="function"&&(t[n]=t[n].bind(t))})};class s0 extends OS{constructor(e={},n){if(super(),this.options=tj(e),this.services={},this.logger=zo,this.modules={external:[]},lne(this),n&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,n),this;setTimeout(()=>{this.init(e,n)},0)}}init(e={},n){this.isInitializing=!0,typeof e=="function"&&(n=e,e={}),e.defaultNS==null&&e.ns&&(Ht(e.ns)?e.defaultNS=e.ns:e.ns.indexOf("translation")<0&&(e.defaultNS=e.ns[0]));const i=ej();this.options={...i,...this.options,...tj(e)},this.options.interpolation={...i.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator);const r=c=>c?typeof c=="function"?new c:c:null;if(!this.options.isClone){this.modules.logger?zo.init(r(this.modules.logger),this.options):zo.init(null,this.options);let c;this.modules.formatter?c=this.modules.formatter:c=ane;const d=new K4(this.options);this.store=new q4(this.options.resources,this.options);const f=this.services;f.logger=zo,f.resourceStore=this.store,f.languageUtils=d,f.pluralResolver=new tne(d,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==i.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),c&&(!this.options.interpolation.format||this.options.interpolation.format===i.interpolation.format)&&(f.formatter=r(c),f.formatter.init&&f.formatter.init(f,this.options),this.options.interpolation.format=f.formatter.format.bind(f.formatter)),f.interpolator=new nne(this.options),f.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},f.backendConnector=new one(r(this.modules.backend),f.resourceStore,f,this.options),f.backendConnector.on("*",(m,...b)=>{this.emit(m,...b)}),this.modules.languageDetector&&(f.languageDetector=r(this.modules.languageDetector),f.languageDetector.init&&f.languageDetector.init(f,this.options.detection,this.options)),this.modules.i18nFormat&&(f.i18nFormat=r(this.modules.i18nFormat),f.i18nFormat.init&&f.i18nFormat.init(this)),this.translator=new A_(this.services,this.options),this.translator.on("*",(m,...b)=>{this.emit(m,...b)}),this.modules.external.forEach(m=>{m.init&&m.init(this)})}if(this.format=this.options.interpolation.format,n||(n=by),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const c=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);c.length>0&&c[0]!=="dev"&&(this.options.lng=c[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(c=>{this[c]=(...d)=>this.store[c](...d)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(c=>{this[c]=(...d)=>(this.store[c](...d),this)});const o=Sg(),l=()=>{const c=(d,f)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),o.resolve(f),n(d,f)};if(this.languages&&!this.isInitialized)return c(null,this.t.bind(this));this.changeLanguage(this.options.lng,c)};return this.options.resources||!this.options.initAsync?l():setTimeout(l,0),o}loadResources(e,n=by){let i=n;const r=Ht(e)?e:this.language;if(typeof e=="function"&&(i=e),!this.options.resources||this.options.partialBundledLanguages){if(r?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return i();const a=[],s=o=>{if(!o||o==="cimode")return;this.services.languageUtils.toResolveHierarchy(o).forEach(c=>{c!=="cimode"&&a.indexOf(c)<0&&a.push(c)})};r?s(r):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(l=>s(l)),this.options.preload?.forEach?.(o=>s(o)),this.services.backendConnector.load(a,this.options.ns,o=>{!o&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),i(o)})}else i(null)}reloadResources(e,n,i){const r=Sg();return typeof e=="function"&&(i=e,e=void 0),typeof n=="function"&&(i=n,n=void 0),e||(e=this.languages),n||(n=this.options.ns),i||(i=by),this.services.backendConnector.reload(e,n,a=>{r.resolve(),i(a)}),r}use(e){if(!e)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!e.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return e.type==="backend"&&(this.modules.backend=e),(e.type==="logger"||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type==="languageDetector"&&(this.modules.languageDetector=e),e.type==="i18nFormat"&&(this.modules.i18nFormat=e),e.type==="postProcessor"&&Z$.addPostProcessor(e),e.type==="formatter"&&(this.modules.formatter=e),e.type==="3rdParty"&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!(["cimode","dev"].indexOf(e)>-1)){for(let n=0;n-1)&&this.store.hasLanguageSomeTranslations(i)){this.resolvedLanguage=i;break}}!this.resolvedLanguage&&this.languages.indexOf(e)<0&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,n){this.isLanguageChangingTo=e;const i=Sg();this.emit("languageChanging",e);const r=o=>{this.language=o,this.languages=this.services.languageUtils.toResolveHierarchy(o),this.resolvedLanguage=void 0,this.setResolvedLanguage(o)},a=(o,l)=>{l?this.isLanguageChangingTo===e&&(r(l),this.translator.changeLanguage(l),this.isLanguageChangingTo=void 0,this.emit("languageChanged",l),this.logger.log("languageChanged",l)):this.isLanguageChangingTo=void 0,i.resolve((...c)=>this.t(...c)),n&&n(o,(...c)=>this.t(...c))},s=o=>{!e&&!o&&this.services.languageDetector&&(o=[]);const l=Ht(o)?o:o&&o[0],c=this.store.hasLanguageSomeTranslations(l)?l:this.services.languageUtils.getBestMatchFromCodes(Ht(o)?[o]:o);c&&(this.language||r(c),this.translator.language||this.translator.changeLanguage(c),this.services.languageDetector?.cacheUserLanguage?.(c)),this.loadResources(c,d=>{a(d,c)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?s(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(s):this.services.languageDetector.detect(s):s(e),i}getFixedT(e,n,i){const r=(a,s,...o)=>{let l;typeof s!="object"?l=this.options.overloadTranslationOptionHandler([a,s].concat(o)):l={...s},l.lng=l.lng||r.lng,l.lngs=l.lngs||r.lngs,l.ns=l.ns||r.ns,l.keyPrefix!==""&&(l.keyPrefix=l.keyPrefix||i||r.keyPrefix);const c=this.options.keySeparator||".";let d;return l.keyPrefix&&Array.isArray(a)?d=a.map(f=>(typeof f=="function"&&(f=rN(f,{...this.options,...s})),`${l.keyPrefix}${c}${f}`)):(typeof a=="function"&&(a=rN(a,{...this.options,...s})),d=l.keyPrefix?`${l.keyPrefix}${c}${a}`:a),this.t(d,l)};return Ht(e)?r.lng=e:r.lngs=e,r.ns=n,r.keyPrefix=i,r}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,n={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const i=n.lng||this.resolvedLanguage||this.languages[0],r=this.options?this.options.fallbackLng:!1,a=this.languages[this.languages.length-1];if(i.toLowerCase()==="cimode")return!0;const s=(o,l)=>{const c=this.services.backendConnector.state[`${o}|${l}`];return c===-1||c===0||c===2};if(n.precheck){const o=n.precheck(this,s);if(o!==void 0)return o}return!!(this.hasResourceBundle(i,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||s(i,e)&&(!r||s(a,e)))}loadNamespaces(e,n){const i=Sg();return this.options.ns?(Ht(e)&&(e=[e]),e.forEach(r=>{this.options.ns.indexOf(r)<0&&this.options.ns.push(r)}),this.loadResources(r=>{i.resolve(),n&&n(r)}),i):(n&&n(),Promise.resolve())}loadLanguages(e,n){const i=Sg();Ht(e)&&(e=[e]);const r=this.options.preload||[],a=e.filter(s=>r.indexOf(s)<0&&this.services.languageUtils.isSupportedCode(s));return a.length?(this.options.preload=r.concat(a),this.loadResources(s=>{i.resolve(),n&&n(s)}),i):(n&&n(),Promise.resolve())}dir(e){if(e||(e=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!e)return"rtl";try{const r=new Intl.Locale(e);if(r&&r.getTextInfo){const a=r.getTextInfo();if(a&&a.direction)return a.direction}}catch{}const n=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],i=this.services?.languageUtils||new K4(ej());return e.toLowerCase().indexOf("-latn")>1?"ltr":n.indexOf(i.getLanguagePartFromCode(e))>-1||e.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(e={},n){const i=new s0(e,n);return i.createInstance=s0.createInstance,i}cloneInstance(e={},n=by){const i=e.forkResourceStore;i&&delete e.forkResourceStore;const r={...this.options,...e,isClone:!0},a=new s0(r);if((e.debug!==void 0||e.prefix!==void 0)&&(a.logger=a.logger.clone(e)),["store","services","language"].forEach(o=>{a[o]=this[o]}),a.services={...this.services},a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},i){const o=Object.keys(this.store.data).reduce((l,c)=>(l[c]={...this.store.data[c]},l[c]=Object.keys(l[c]).reduce((d,f)=>(d[f]={...l[c][f]},d),l[c]),l),{});a.store=new q4(o,r),a.services.resourceStore=a.store}return a.translator=new A_(a.services,r),a.translator.on("*",(o,...l)=>{a.emit(o,...l)}),a.init(r,n),a.translator.options=r,a.translator.backendConnector.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const wa=s0.createInstance();wa.createInstance;wa.dir;wa.init;wa.loadResources;wa.reloadResources;wa.use;wa.changeLanguage;wa.getFixedT;wa.t;wa.exists;wa.setDefaultNamespace;wa.hasLoadedNamespace;wa.loadNamespaces;wa.loadLanguages;const cne=(t,e,n,i)=>{const r=[n,{code:e,...i||{}}];if(t?.services?.logger?.forward)return t.services.logger.forward(r,"warn","react-i18next::",!0);vf(r[0])&&(r[0]=`react-i18next:: ${r[0]}`),t?.services?.logger?.warn?t.services.logger.warn(...r):console?.warn&&console.warn(...r)},nj={},J$=(t,e,n,i)=>{vf(n)&&nj[n]||(vf(n)&&(nj[n]=new Date),cne(t,e,n,i))},eG=(t,e)=>()=>{if(t.isInitialized)e();else{const n=()=>{setTimeout(()=>{t.off("initialized",n)},0),e()};t.on("initialized",n)}},aN=(t,e,n)=>{t.loadNamespaces(e,eG(t,n))},ij=(t,e,n,i)=>{if(vf(n)&&(n=[n]),t.options.preload&&t.options.preload.indexOf(e)>-1)return aN(t,n,i);n.forEach(r=>{t.options.ns.indexOf(r)<0&&t.options.ns.push(r)}),t.loadLanguages(e,eG(t,i))},une=(t,e,n={})=>!e.languages||!e.languages.length?(J$(e,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:e.languages}),!0):e.hasLoadedNamespace(t,{lng:n.lng,precheck:(i,r)=>{if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&i.services.backendConnector.backend&&i.isLanguageChangingTo&&!r(i.isLanguageChangingTo,t))return!1}}),vf=t=>typeof t=="string",dne=t=>typeof t=="object"&&t!==null,fne=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,hne={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},pne=t=>hne[t],mne=t=>t.replace(fne,pne);let sN={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:mne};const gne=(t={})=>{sN={...sN,...t}},xne=()=>sN;let tG;const vne=t=>{tG=t},yne=()=>tG,bne={type:"3rdParty",init(t){gne(t.options.react),vne(t)}},_ne=A.createContext();class Sne{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(n=>{this.usedNamespaces[n]||(this.usedNamespaces[n]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}var bA={exports:{}},_A={};var rj;function wne(){if(rj)return _A;rj=1;var t=lm();function e(f,p){return f===p&&(f!==0||1/f===1/p)||f!==f&&p!==p}var n=typeof Object.is=="function"?Object.is:e,i=t.useState,r=t.useEffect,a=t.useLayoutEffect,s=t.useDebugValue;function o(f,p){var m=p(),b=i({inst:{value:m,getSnapshot:p}}),_=b[0].inst,v=b[1];return a(function(){_.value=m,_.getSnapshot=p,l(_)&&v({inst:_})},[f,m,p]),r(function(){return l(_)&&v({inst:_}),f(function(){l(_)&&v({inst:_})})},[f]),s(m),m}function l(f){var p=f.getSnapshot;f=f.value;try{var m=p();return!n(f,m)}catch{return!0}}function c(f,p){return p()}var d=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?c:o;return _A.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:d,_A}var aj;function nG(){return aj||(aj=1,bA.exports=wne()),bA.exports}var dP=nG();const Mne=(t,e)=>vf(e)?e:dne(e)&&vf(e.defaultValue)?e.defaultValue:Array.isArray(t)?t[t.length-1]:t,Ene={t:Mne,ready:!1},Ane=()=>()=>{},fP=(t,e={})=>{const{i18n:n}=e,{i18n:i,defaultNS:r}=A.useContext(_ne)||{},a=n||i||yne();a&&!a.reportNamespaces&&(a.reportNamespaces=new Sne),a||J$(a,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const s=A.useMemo(()=>({...xne(),...a?.options?.react,...e}),[a,e]),{useSuspense:o,keyPrefix:l}=s,c=r||a?.options?.defaultNS,d=vf(c)?[c]:c||["translation"],f=A.useMemo(()=>d,d);a?.reportNamespaces?.addUsedNamespaces?.(f);const p=A.useRef(0),m=A.useCallback(C=>{if(!a)return Ane;const{bindI18n:D,bindI18nStore:F}=s,I=()=>{p.current+=1,C()};return D&&a.on(D,I),F&&a.store.on(F,I),()=>{D&&D.split(" ").forEach(q=>a.off(q,I)),F&&F.split(" ").forEach(q=>a.store.off(q,I))}},[a,s]),b=A.useRef(),_=A.useCallback(()=>{if(!a)return Ene;const C=!!(a.isInitialized||a.initializedStoreOnce)&&f.every(H=>une(H,a,s)),D=e.lng||a.language,F=p.current,I=b.current;if(I&&I.ready===C&&I.lng===D&&I.keyPrefix===l&&I.revision===F)return I;const L={t:a.getFixedT(D,s.nsMode==="fallback"?f:f[0],l),ready:C,lng:D,keyPrefix:l,revision:F};return b.current=L,L},[a,f,l,s,e.lng]),[v,x]=A.useState(0),{t:M,ready:w}=dP.useSyncExternalStore(m,_,_);A.useEffect(()=>{if(a&&!w&&!o){const C=()=>x(D=>D+1);e.lng?ij(a,e.lng,f,C):aN(a,f,C)}},[a,e.lng,f,w,o,v]);const E=a||{},T=A.useRef(null),P=A.useRef(),N=C=>{const D=Object.getOwnPropertyDescriptors(C);D.__original&&delete D.__original;const F=Object.create(Object.getPrototypeOf(C),D);if(!Object.prototype.hasOwnProperty.call(F,"__original"))try{Object.defineProperty(F,"__original",{value:C,writable:!1,enumerable:!1,configurable:!1})}catch{}return F},U=A.useMemo(()=>{const C=E,D=C?.language;let F=C;C&&(T.current&&T.current.__original===C?P.current!==D?(F=N(C),T.current=F,P.current=D):F=T.current:(F=N(C),T.current=F,P.current=D));const I=[M,F,w];return I.t=M,I.i18n=F,I.ready=w,I},[M,E,w,E.resolvedLanguage,E.language,E.languages]);if(a&&o&&!w)throw new Promise(C=>{const D=()=>C();e.lng?ij(a,e.lng,f,D):aN(a,f,D)});return U},{slice:Tne,forEach:Cne}=[];function Nne(t){return Cne.call(Tne.call(arguments,1),e=>{if(e)for(const n in e)t[n]===void 0&&(t[n]=e[n])}),t}function Rne(t){return typeof t!="string"?!1:[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(n=>n.test(t))}const sj=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,Pne=function(t,e){const i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:"/"},r=encodeURIComponent(e);let a=`${t}=${r}`;if(i.maxAge>0){const s=i.maxAge-0;if(Number.isNaN(s))throw new Error("maxAge should be a Number");a+=`; Max-Age=${Math.floor(s)}`}if(i.domain){if(!sj.test(i.domain))throw new TypeError("option domain is invalid");a+=`; Domain=${i.domain}`}if(i.path){if(!sj.test(i.path))throw new TypeError("option path is invalid");a+=`; Path=${i.path}`}if(i.expires){if(typeof i.expires.toUTCString!="function")throw new TypeError("option expires is invalid");a+=`; Expires=${i.expires.toUTCString()}`}if(i.httpOnly&&(a+="; HttpOnly"),i.secure&&(a+="; Secure"),i.sameSite)switch(typeof i.sameSite=="string"?i.sameSite.toLowerCase():i.sameSite){case!0:a+="; SameSite=Strict";break;case"lax":a+="; SameSite=Lax";break;case"strict":a+="; SameSite=Strict";break;case"none":a+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return i.partitioned&&(a+="; Partitioned"),a},oj={create(t,e,n,i){let r=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};n&&(r.expires=new Date,r.expires.setTime(r.expires.getTime()+n*60*1e3)),i&&(r.domain=i),document.cookie=Pne(t,e,r)},read(t){const e=`${t}=`,n=document.cookie.split(";");for(let i=0;i-1&&(i=window.location.hash.substring(window.location.hash.indexOf("?")));const a=i.substring(1).split("&");for(let s=0;s0&&a[s].substring(0,o)===e&&(n=a[s].substring(o+1))}}return n}},kne={name:"hash",lookup(t){let{lookupHash:e,lookupFromHashIndex:n}=t,i;if(typeof window<"u"){const{hash:r}=window.location;if(r&&r.length>2){const a=r.substring(1);if(e){const s=a.split("&");for(let o=0;o0&&s[o].substring(0,l)===e&&(i=s[o].substring(l+1))}}if(i)return i;if(!i&&n>-1){const s=r.match(/\/([a-zA-Z-]*)/g);return Array.isArray(s)?s[typeof n=="number"?n:0]?.replace("/",""):void 0}}}return i}};let Mh=null;const lj=()=>{if(Mh!==null)return Mh;try{if(Mh=typeof window<"u"&&window.localStorage!==null,!Mh)return!1;const t="i18next.translate.boo";window.localStorage.setItem(t,"foo"),window.localStorage.removeItem(t)}catch{Mh=!1}return Mh};var Lne={name:"localStorage",lookup(t){let{lookupLocalStorage:e}=t;if(e&&lj())return window.localStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupLocalStorage:n}=e;n&&lj()&&window.localStorage.setItem(n,t)}};let Eh=null;const cj=()=>{if(Eh!==null)return Eh;try{if(Eh=typeof window<"u"&&window.sessionStorage!==null,!Eh)return!1;const t="i18next.translate.boo";window.sessionStorage.setItem(t,"foo"),window.sessionStorage.removeItem(t)}catch{Eh=!1}return Eh};var Ine={name:"sessionStorage",lookup(t){let{lookupSessionStorage:e}=t;if(e&&cj())return window.sessionStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupSessionStorage:n}=e;n&&cj()&&window.sessionStorage.setItem(n,t)}},Une={name:"navigator",lookup(t){const e=[];if(typeof navigator<"u"){const{languages:n,userLanguage:i,language:r}=navigator;if(n)for(let a=0;a0?e:void 0}},jne={name:"htmlTag",lookup(t){let{htmlTag:e}=t,n;const i=e||(typeof document<"u"?document.documentElement:null);return i&&typeof i.getAttribute=="function"&&(n=i.getAttribute("lang")),n}},Fne={name:"path",lookup(t){let{lookupFromPathIndex:e}=t;if(typeof window>"u")return;const n=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(n)?n[typeof e=="number"?e:0]?.replace("/",""):void 0}},zne={name:"subdomain",lookup(t){let{lookupFromSubdomainIndex:e}=t;const n=typeof e=="number"?e+1:1,i=typeof window<"u"&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(i)return i[n]}};let iG=!1;try{document.cookie,iG=!0}catch{}const rG=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];iG||rG.splice(1,1);const Bne=()=>({order:rG,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:t=>t});class aG{constructor(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(e,n)}init(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=e,this.options=Nne(n,this.options||{},Bne()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=r=>r.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=i,this.addDetector(Dne),this.addDetector(One),this.addDetector(Lne),this.addDetector(Ine),this.addDetector(Une),this.addDetector(jne),this.addDetector(Fne),this.addDetector(zne),this.addDetector(kne)}addDetector(e){return this.detectors[e.name]=e,this}detect(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,n=[];return e.forEach(i=>{if(this.detectors[i]){let r=this.detectors[i].lookup(this.options);r&&typeof r=="string"&&(r=[r]),r&&(n=n.concat(r))}}),n=n.filter(i=>i!=null&&!Rne(i)).map(i=>this.options.convertDetectedLanguage(i)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?n:n.length>0?n[0]:null}cacheUserLanguage(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;n&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||n.forEach(i=>{this.detectors[i]&&this.detectors[i].cacheUserLanguage(e,this.options)}))}}aG.type="languageDetector";const Hne={nav:{printers:"Printers",archives:"Archives",queue:"Queue",stats:"Statistics",profiles:"Profiles",maintenance:"Maintenance",settings:"Settings",collapseSidebar:"Collapse sidebar",expandSidebar:"Expand sidebar",update:"Update",updateAvailable:"Update available: v{{version}}",viewOnGithub:"View on GitHub",keyboardShortcuts:"Keyboard shortcuts (?)",switchToLight:"Switch to light mode",switchToDark:"Switch to dark mode"},common:{save:"Save",cancel:"Cancel",delete:"Delete",edit:"Edit",add:"Add",close:"Close",confirm:"Confirm",loading:"Loading...",error:"Error",success:"Success",warning:"Warning",enabled:"Enabled",disabled:"Disabled",yes:"Yes",no:"No",on:"On",off:"Off",all:"All",none:"None",search:"Search",filter:"Filter",sort:"Sort",refresh:"Refresh",download:"Download",upload:"Upload",actions:"Actions",status:"Status",name:"Name",description:"Description",date:"Date",time:"Time",hours:"hours",minutes:"minutes",seconds:"seconds",noPrinters:"No printers configured",noData:"No data available",required:"Required",optional:"Optional"},printers:{title:"Printers",addPrinter:"Add Printer",editPrinter:"Edit Printer",deletePrinter:"Delete Printer",printerName:"Printer Name",serialNumber:"Serial Number",ipAddress:"IP Address",accessCode:"Access Code",model:"Model",nozzleCount:"Nozzle Count",autoArchive:"Auto Archive",status:{idle:"Idle",printing:"Printing",paused:"Paused",offline:"Offline",error:"Error",finished:"Finished",unknown:"Unknown"},temperatures:{nozzle:"Nozzle",bed:"Bed",chamber:"Chamber"},progress:"{{percent}}% complete",timeRemaining:"{{time}} remaining",deleteConfirm:'Are you sure you want to delete "{{name}}"?',maintenanceOk:"Maintenance OK",maintenanceWarning:"{{count}} warning",maintenanceWarning_plural:"{{count}} warnings",maintenanceDue:"{{count}} due",maintenanceDue_plural:"{{count}} due"},archives:{title:"Print Archives",searchPlaceholder:"Search archives...",filterByPrinter:"Filter by printer",filterByStatus:"Filter by status",sortBy:"Sort by",sortNewest:"Newest first",sortOldest:"Oldest first",sortName:"Name",sortDuration:"Duration",noArchives:"No archives found",printTime:"Print Time",filamentUsed:"Filament Used",cost:"Cost",reprint:"Reprint",preview:"Preview",deleteArchive:"Delete Archive",deleteConfirm:"Are you sure you want to delete this archive?",favorite:"Favorite",unfavorite:"Remove from favorites",viewDetails:"View Details",status:{completed:"Completed",failed:"Failed",stopped:"Stopped"}},queue:{title:"Print Queue",addToQueue:"Add to Queue",clearQueue:"Clear Queue",emptyQueue:"Queue is empty",position:"Position",scheduledTime:"Scheduled Time",moveUp:"Move Up",moveDown:"Move Down",remove:"Remove",startNow:"Start Now",status:{pending:"Pending",printing:"Printing",completed:"Completed",failed:"Failed",cancelled:"Cancelled"}},stats:{title:"Statistics",overview:"Overview",totalPrints:"Total Prints",successRate:"Success Rate",totalPrintTime:"Total Print Time",totalFilament:"Total Filament Used",totalCost:"Total Cost",averagePrintTime:"Average Print Time",printsPerDay:"Prints per Day",byPrinter:"By Printer",byMaterial:"By Material",byMonth:"By Month",last7Days:"Last 7 Days",last30Days:"Last 30 Days",last90Days:"Last 90 Days",allTime:"All Time"},profiles:{title:"Filament Profiles",addProfile:"Add Profile",editProfile:"Edit Profile",deleteProfile:"Delete Profile",material:"Material",brand:"Brand",color:"Color",diameter:"Diameter",density:"Density",costPerKg:"Cost per kg",spoolWeight:"Spool Weight",noProfiles:"No profiles configured",deleteConfirm:"Are you sure you want to delete this profile?"},maintenance:{title:"Maintenance",overview:"Overview",allOk:"All maintenance up to date",dueCount:"{{count}} item due",dueCount_plural:"{{count}} items due",warningCount:"{{count}} warning",warningCount_plural:"{{count}} warnings",totalPrintTime:"Total Print Time",nextMaintenance:"Next Maintenance",nothingDue:"Nothing due",tasks:"Tasks",lastPerformed:"Last performed",interval:"Interval",hoursRemaining:"{{hours}}h remaining",hoursOverdue:"{{hours}}h overdue",markDone:"Mark as Done",performMaintenance:"Perform Maintenance",history:"History",noHistory:"No maintenance history",editPrintHours:"Edit Print Hours",currentHours:"Current Hours",types:{lubricateRails:"Lubricate Linear Rails",cleanNozzle:"Clean Nozzle/Hotend",checkBelts:"Check Belt Tension",cleanBuildPlate:"Clean Build Plate",checkExtruder:"Check Extruder Gears",checkCooling:"Check Cooling Fans",generalInspection:"General Inspection"}},settings:{title:"Settings",general:"General",appearance:"Appearance",notifications:"Notifications",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Language",languageDescription:"Select your preferred language",theme:"Theme",themeLight:"Light",themeDark:"Dark",themeSystem:"System",defaultView:"Default View",defaultViewDescription:"Page to show when opening the app",checkForUpdates:"Check for Updates",autoUpdate:"Auto Update",currentVersion:"Current Version",latestVersion:"Latest Version",upToDate:"You are up to date",updateAvailable:"Update available",notificationLanguage:"Notification Language",notificationLanguageDescription:"Language for push notifications",notificationProviders:"Notification Providers",addProvider:"Add Provider",editProvider:"Edit Provider",providerType:"Provider Type",testNotification:"Test Notification",testSuccess:"Test notification sent successfully",testFailed:"Failed to send test notification",quietHours:"Quiet Hours",quietHoursDescription:"Do not disturb during these hours",quietHoursStart:"Start",quietHoursEnd:"End",events:{title:"Notification Events",printStart:"Print Started",printComplete:"Print Completed",printFailed:"Print Failed",printStopped:"Print Stopped",printProgress:"Progress Milestones",printProgressDescription:"Notify at 25%, 50%, 75%",printerOffline:"Printer Offline",printerError:"Printer Error",filamentLow:"Low Filament",maintenanceDue:"Maintenance Due",maintenanceDueDescription:"Notify when maintenance is needed"},smartPlug:{title:"Smart Plugs",add:"Add Smart Plug",edit:"Edit Smart Plug",name:"Name",ipAddress:"IP Address",linkedPrinter:"Linked Printer",autoOn:"Auto Power On",autoOnDescription:"Turn on when print starts",autoOff:"Auto Power Off",autoOffDescription:"Turn off after print completes",offDelay:"Off Delay",offDelayMinutes:"Minutes after print",offDelayTemp:"When nozzle below temperature",currentState:"Current State",turnOn:"Turn On",turnOff:"Turn Off"},spoolmanEnabled:"Enable Spoolman Integration",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Connected",spoolmanDisconnected:"Disconnected"},notification:{printStarted:{title:"Print Started",body:"{{printer}}: {{filename}} has started printing"},printCompleted:{title:"Print Completed",body:"{{printer}}: {{filename}} completed successfully"},printFailed:{title:"Print Failed",body:"{{printer}}: {{filename}} has failed"},printStopped:{title:"Print Stopped",body:"{{printer}}: {{filename}} was stopped"},printProgress:{title:"Print Progress",body:"{{printer}}: {{filename}} is {{percent}}% complete"},printerOffline:{title:"Printer Offline",body:"{{printer}} is offline"},printerError:{title:"Printer Error",body:"{{printer}}: {{error}}"},filamentLow:{title:"Low Filament",body:"{{printer}}: Filament is running low"},maintenanceDue:{title:"Maintenance Due",body:"{{printer}}: {{items}} need attention"}},errors:{generic:"Something went wrong",networkError:"Network error. Please check your connection.",notFound:"Not found",unauthorized:"Unauthorized",serverError:"Server error",validationError:"Please check your input",printerConnectionFailed:"Failed to connect to printer",saveFailed:"Failed to save changes",deleteFailed:"Failed to delete",loadFailed:"Failed to load data"},confirm:{delete:"Are you sure you want to delete this?",unsavedChanges:"You have unsaved changes. Are you sure you want to leave?",clearQueue:"Are you sure you want to clear the queue?"}},Vne={nav:{printers:"Drucker",archives:"Archiv",queue:"Warteschlange",stats:"Statistiken",profiles:"Profile",maintenance:"Wartung",settings:"Einstellungen",collapseSidebar:"Seitenleiste einklappen",expandSidebar:"Seitenleiste ausklappen",update:"Update",updateAvailable:"Update verfügbar: v{{version}}",viewOnGithub:"Auf GitHub ansehen",keyboardShortcuts:"Tastaturkürzel (?)",switchToLight:"Zum hellen Modus wechseln",switchToDark:"Zum dunklen Modus wechseln"},common:{save:"Speichern",cancel:"Abbrechen",delete:"Löschen",edit:"Bearbeiten",add:"Hinzufügen",close:"Schließen",confirm:"Bestätigen",loading:"Lädt...",error:"Fehler",success:"Erfolg",warning:"Warnung",enabled:"Aktiviert",disabled:"Deaktiviert",yes:"Ja",no:"Nein",on:"An",off:"Aus",all:"Alle",none:"Keine",search:"Suchen",filter:"Filtern",sort:"Sortieren",refresh:"Aktualisieren",download:"Herunterladen",upload:"Hochladen",actions:"Aktionen",status:"Status",name:"Name",description:"Beschreibung",date:"Datum",time:"Zeit",hours:"Stunden",minutes:"Minuten",seconds:"Sekunden",noPrinters:"Keine Drucker konfiguriert",noData:"Keine Daten verfügbar",required:"Erforderlich",optional:"Optional"},printers:{title:"Drucker",addPrinter:"Drucker hinzufügen",editPrinter:"Drucker bearbeiten",deletePrinter:"Drucker löschen",printerName:"Druckername",serialNumber:"Seriennummer",ipAddress:"IP-Adresse",accessCode:"Zugangscode",model:"Modell",nozzleCount:"Düsenanzahl",autoArchive:"Automatische Archivierung",status:{idle:"Bereit",printing:"Druckt",paused:"Pausiert",offline:"Offline",error:"Fehler",finished:"Fertig",unknown:"Unbekannt"},temperatures:{nozzle:"Düse",bed:"Druckbett",chamber:"Kammer"},progress:"{{percent}}% abgeschlossen",timeRemaining:"Noch {{time}}",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',maintenanceOk:"Wartung OK",maintenanceWarning:"{{count}} Warnung",maintenanceWarning_plural:"{{count}} Warnungen",maintenanceDue:"{{count}} fällig",maintenanceDue_plural:"{{count}} fällig"},archives:{title:"Druckarchiv",searchPlaceholder:"Archiv durchsuchen...",filterByPrinter:"Nach Drucker filtern",filterByStatus:"Nach Status filtern",sortBy:"Sortieren nach",sortNewest:"Neueste zuerst",sortOldest:"Älteste zuerst",sortName:"Name",sortDuration:"Dauer",noArchives:"Keine Archive gefunden",printTime:"Druckzeit",filamentUsed:"Verbrauchtes Filament",cost:"Kosten",reprint:"Erneut drucken",preview:"Vorschau",deleteArchive:"Archiv löschen",deleteConfirm:"Möchten Sie dieses Archiv wirklich löschen?",favorite:"Favorit",unfavorite:"Aus Favoriten entfernen",viewDetails:"Details anzeigen",status:{completed:"Abgeschlossen",failed:"Fehlgeschlagen",stopped:"Gestoppt"}},queue:{title:"Druckwarteschlange",addToQueue:"Zur Warteschlange hinzufügen",clearQueue:"Warteschlange leeren",emptyQueue:"Warteschlange ist leer",position:"Position",scheduledTime:"Geplante Zeit",moveUp:"Nach oben",moveDown:"Nach unten",remove:"Entfernen",startNow:"Jetzt starten",status:{pending:"Ausstehend",printing:"Druckt",completed:"Abgeschlossen",failed:"Fehlgeschlagen",cancelled:"Abgebrochen"}},stats:{title:"Statistiken",overview:"Übersicht",totalPrints:"Gesamtdrucke",successRate:"Erfolgsrate",totalPrintTime:"Gesamtdruckzeit",totalFilament:"Gesamtverbrauch Filament",totalCost:"Gesamtkosten",averagePrintTime:"Durchschnittliche Druckzeit",printsPerDay:"Drucke pro Tag",byPrinter:"Nach Drucker",byMaterial:"Nach Material",byMonth:"Nach Monat",last7Days:"Letzte 7 Tage",last30Days:"Letzte 30 Tage",last90Days:"Letzte 90 Tage",allTime:"Gesamt"},profiles:{title:"Filament-Profile",addProfile:"Profil hinzufügen",editProfile:"Profil bearbeiten",deleteProfile:"Profil löschen",material:"Material",brand:"Marke",color:"Farbe",diameter:"Durchmesser",density:"Dichte",costPerKg:"Kosten pro kg",spoolWeight:"Spulengewicht",noProfiles:"Keine Profile konfiguriert",deleteConfirm:"Möchten Sie dieses Profil wirklich löschen?"},maintenance:{title:"Wartung",overview:"Übersicht",allOk:"Alle Wartungen aktuell",dueCount:"{{count}} Aufgabe fällig",dueCount_plural:"{{count}} Aufgaben fällig",warningCount:"{{count}} Warnung",warningCount_plural:"{{count}} Warnungen",totalPrintTime:"Gesamtdruckzeit",nextMaintenance:"Nächste Wartung",nothingDue:"Nichts fällig",tasks:"Aufgaben",lastPerformed:"Zuletzt durchgeführt",interval:"Intervall",hoursRemaining:"{{hours}}h verbleibend",hoursOverdue:"{{hours}}h überfällig",markDone:"Als erledigt markieren",performMaintenance:"Wartung durchführen",history:"Verlauf",noHistory:"Kein Wartungsverlauf",editPrintHours:"Druckstunden bearbeiten",currentHours:"Aktuelle Stunden",types:{lubricateRails:"Linearschienen schmieren",cleanNozzle:"Düse/Hotend reinigen",checkBelts:"Riemenspannung prüfen",cleanBuildPlate:"Druckbett reinigen",checkExtruder:"Extruderzahnräder prüfen",checkCooling:"Kühlungslüfter prüfen",generalInspection:"Allgemeine Inspektion"}},settings:{title:"Einstellungen",general:"Allgemein",appearance:"Erscheinungsbild",notifications:"Benachrichtigungen",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Sprache",languageDescription:"Wählen Sie Ihre bevorzugte Sprache",theme:"Design",themeLight:"Hell",themeDark:"Dunkel",themeSystem:"System",defaultView:"Standardansicht",defaultViewDescription:"Seite, die beim Öffnen der App angezeigt wird",checkForUpdates:"Nach Updates suchen",autoUpdate:"Automatische Updates",currentVersion:"Aktuelle Version",latestVersion:"Neueste Version",upToDate:"Sie sind auf dem neuesten Stand",updateAvailable:"Update verfügbar",notificationLanguage:"Benachrichtigungssprache",notificationLanguageDescription:"Sprache für Push-Benachrichtigungen",notificationProviders:"Benachrichtigungsanbieter",addProvider:"Anbieter hinzufügen",editProvider:"Anbieter bearbeiten",providerType:"Anbietertyp",testNotification:"Testbenachrichtigung",testSuccess:"Testbenachrichtigung erfolgreich gesendet",testFailed:"Testbenachrichtigung konnte nicht gesendet werden",quietHours:"Ruhezeiten",quietHoursDescription:"Keine Störungen während dieser Zeiten",quietHoursStart:"Beginn",quietHoursEnd:"Ende",events:{title:"Benachrichtigungsereignisse",printStart:"Druck gestartet",printComplete:"Druck abgeschlossen",printFailed:"Druck fehlgeschlagen",printStopped:"Druck gestoppt",printProgress:"Fortschrittsmeldungen",printProgressDescription:"Bei 25%, 50%, 75% benachrichtigen",printerOffline:"Drucker offline",printerError:"Druckerfehler",filamentLow:"Filament niedrig",maintenanceDue:"Wartung fällig",maintenanceDueDescription:"Benachrichtigen, wenn Wartung erforderlich"},smartPlug:{title:"Smart Plugs",add:"Smart Plug hinzufügen",edit:"Smart Plug bearbeiten",name:"Name",ipAddress:"IP-Adresse",linkedPrinter:"Verknüpfter Drucker",autoOn:"Automatisch einschalten",autoOnDescription:"Einschalten beim Druckstart",autoOff:"Automatisch ausschalten",autoOffDescription:"Ausschalten nach Druckende",offDelay:"Ausschaltverzögerung",offDelayMinutes:"Minuten nach Druck",offDelayTemp:"Wenn Düse unter Temperatur",currentState:"Aktueller Status",turnOn:"Einschalten",turnOff:"Ausschalten"},spoolmanEnabled:"Spoolman-Integration aktivieren",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Verbunden",spoolmanDisconnected:"Nicht verbunden"},notification:{printStarted:{title:"Druck gestartet",body:"{{printer}}: {{filename}} wird gedruckt"},printCompleted:{title:"Druck abgeschlossen",body:"{{printer}}: {{filename}} erfolgreich abgeschlossen"},printFailed:{title:"Druck fehlgeschlagen",body:"{{printer}}: {{filename}} ist fehlgeschlagen"},printStopped:{title:"Druck gestoppt",body:"{{printer}}: {{filename}} wurde gestoppt"},printProgress:{title:"Druckfortschritt",body:"{{printer}}: {{filename}} ist zu {{percent}}% abgeschlossen"},printerOffline:{title:"Drucker offline",body:"{{printer}} ist offline"},printerError:{title:"Druckerfehler",body:"{{printer}}: {{error}}"},filamentLow:{title:"Filament niedrig",body:"{{printer}}: Filament geht zur Neige"},maintenanceDue:{title:"Wartung fällig",body:"{{printer}}: {{items}} benötigen Aufmerksamkeit"}},errors:{generic:"Etwas ist schiefgelaufen",networkError:"Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung.",notFound:"Nicht gefunden",unauthorized:"Nicht autorisiert",serverError:"Serverfehler",validationError:"Bitte überprüfen Sie Ihre Eingabe",printerConnectionFailed:"Verbindung zum Drucker fehlgeschlagen",saveFailed:"Speichern fehlgeschlagen",deleteFailed:"Löschen fehlgeschlagen",loadFailed:"Laden der Daten fehlgeschlagen"},confirm:{delete:"Möchten Sie dies wirklich löschen?",unsavedChanges:"Sie haben ungespeicherte Änderungen. Möchten Sie wirklich verlassen?",clearQueue:"Möchten Sie die Warteschlange wirklich leeren?"}},$ne={en:{translation:Hne},de:{translation:Vne}};wa.use(aG).use(bne).init({resources:$ne,fallbackLng:"en",supportedLngs:["en","de"],detection:{order:["localStorage","navigator","htmlTag"],lookupLocalStorage:"bambutrack_language",caches:["localStorage"]},interpolation:{escapeValue:!1},react:{useSuspense:!1}});const uj=[{code:"en",name:"English",nativeName:"English"},{code:"de",name:"German",nativeName:"Deutsch"}];var dj="popstate";function Gne(t={}){function e(i,r){let{pathname:a,search:s,hash:o}=i.location;return oN("",{pathname:a,search:s,hash:o},r.state&&r.state.usr||null,r.state&&r.state.key||"default")}function n(i,r){return typeof r=="string"?r:N0(r)}return qne(e,n,null,t)}function mi(t,e){if(t===!1||t===null||typeof t>"u")throw new Error(e)}function bo(t,e){if(!t){typeof console<"u"&&console.warn(e);try{throw new Error(e)}catch{}}}function Wne(){return Math.random().toString(36).substring(2,10)}function fj(t,e){return{usr:t.state,key:t.key,idx:e}}function oN(t,e,n=null,i){return{pathname:typeof t=="string"?t:t.pathname,search:"",hash:"",...typeof e=="string"?cm(e):e,state:n,key:e&&e.key||i||Wne()}}function N0({pathname:t="/",search:e="",hash:n=""}){return e&&e!=="?"&&(t+=e.charAt(0)==="?"?e:"?"+e),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function cm(t){let e={};if(t){let n=t.indexOf("#");n>=0&&(e.hash=t.substring(n),t=t.substring(0,n));let i=t.indexOf("?");i>=0&&(e.search=t.substring(i),t=t.substring(0,i)),t&&(e.pathname=t)}return e}function qne(t,e,n,i={}){let{window:r=document.defaultView,v5Compat:a=!1}=i,s=r.history,o="POP",l=null,c=d();c==null&&(c=0,s.replaceState({...s.state,idx:c},""));function d(){return(s.state||{idx:null}).idx}function f(){o="POP";let v=d(),x=v==null?null:v-c;c=v,l&&l({action:o,location:_.location,delta:x})}function p(v,x){o="PUSH";let M=oN(_.location,v,x);c=d()+1;let w=fj(M,c),E=_.createHref(M);try{s.pushState(w,"",E)}catch(T){if(T instanceof DOMException&&T.name==="DataCloneError")throw T;r.location.assign(E)}a&&l&&l({action:o,location:_.location,delta:1})}function m(v,x){o="REPLACE";let M=oN(_.location,v,x);c=d();let w=fj(M,c),E=_.createHref(M);s.replaceState(w,"",E),a&&l&&l({action:o,location:_.location,delta:0})}function b(v){return Xne(v)}let _={get action(){return o},get location(){return t(r,s)},listen(v){if(l)throw new Error("A history only accepts one active listener");return r.addEventListener(dj,f),l=v,()=>{r.removeEventListener(dj,f),l=null}},createHref(v){return e(r,v)},createURL:b,encodeLocation(v){let x=b(v);return{pathname:x.pathname,search:x.search,hash:x.hash}},push:p,replace:m,go(v){return s.go(v)}};return _}function Xne(t,e=!1){let n="http://localhost";typeof window<"u"&&(n=window.location.origin!=="null"?window.location.origin:window.location.href),mi(n,"No window.location.(origin|href) available to create URL");let i=typeof t=="string"?t:N0(t);return i=i.replace(/ $/,"%20"),!e&&i.startsWith("//")&&(i=n+i),new URL(i,n)}function sG(t,e,n="/"){return Kne(t,e,n,!1)}function Kne(t,e,n,i){let r=typeof e=="string"?cm(e):e,a=lc(r.pathname||"/",n);if(a==null)return null;let s=oG(t);Yne(s);let o=null;for(let l=0;o==null&&l{let d={relativePath:c===void 0?s.path||"":c,caseSensitive:s.caseSensitive===!0,childrenIndex:o,route:s};if(d.relativePath.startsWith("/")){if(!d.relativePath.startsWith(i)&&l)return;mi(d.relativePath.startsWith(i),`Absolute route path "${d.relativePath}" nested under path "${i}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),d.relativePath=d.relativePath.slice(i.length)}let f=ec([i,d.relativePath]),p=n.concat(d);s.children&&s.children.length>0&&(mi(s.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${f}".`),oG(s.children,e,p,f,l)),!(s.path==null&&!s.index)&&e.push({path:f,score:iie(f,s.index),routesMeta:p})};return t.forEach((s,o)=>{if(s.path===""||!s.path?.includes("?"))a(s,o);else for(let l of lG(s.path))a(s,o,!0,l)}),e}function lG(t){let e=t.split("/");if(e.length===0)return[];let[n,...i]=e,r=n.endsWith("?"),a=n.replace(/\?$/,"");if(i.length===0)return r?[a,""]:[a];let s=lG(i.join("/")),o=[];return o.push(...s.map(l=>l===""?a:[a,l].join("/"))),r&&o.push(...s),o.map(l=>t.startsWith("/")&&l===""?"/":l)}function Yne(t){t.sort((e,n)=>e.score!==n.score?n.score-e.score:rie(e.routesMeta.map(i=>i.childrenIndex),n.routesMeta.map(i=>i.childrenIndex)))}var Zne=/^:[\w-]+$/,Qne=3,Jne=2,eie=1,tie=10,nie=-2,hj=t=>t==="*";function iie(t,e){let n=t.split("/"),i=n.length;return n.some(hj)&&(i+=nie),e&&(i+=Jne),n.filter(r=>!hj(r)).reduce((r,a)=>r+(Zne.test(a)?Qne:a===""?eie:tie),i)}function rie(t,e){return t.length===e.length&&t.slice(0,-1).every((i,r)=>i===e[r])?t[t.length-1]-e[e.length-1]:0}function aie(t,e,n=!1){let{routesMeta:i}=t,r={},a="/",s=[];for(let o=0;o{if(d==="*"){let b=o[p]||"";s=a.slice(0,a.length-b.length).replace(/(.)\/+$/,"$1")}const m=o[p];return f&&!m?c[d]=void 0:c[d]=(m||"").replace(/%2F/g,"/"),c},{}),pathname:a,pathnameBase:s,pattern:t}}function sie(t,e=!1,n=!0){bo(t==="*"||!t.endsWith("*")||t.endsWith("/*"),`Route path "${t}" will be treated as if it were "${t.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${t.replace(/\*$/,"/*")}".`);let i=[],r="^"+t.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(s,o,l)=>(i.push({paramName:o,isOptional:l!=null}),l?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return t.endsWith("*")?(i.push({paramName:"*"}),r+=t==="*"||t==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?r+="\\/*$":t!==""&&t!=="/"&&(r+="(?:(?=\\/|$))"),[new RegExp(r,e?void 0:"i"),i]}function oie(t){try{return t.split("/").map(e=>decodeURIComponent(e).replace(/\//g,"%2F")).join("/")}catch(e){return bo(!1,`The URL path "${t}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${e}).`),t}}function lc(t,e){if(e==="/")return t;if(!t.toLowerCase().startsWith(e.toLowerCase()))return null;let n=e.endsWith("/")?e.length-1:e.length,i=t.charAt(n);return i&&i!=="/"?null:t.slice(n)||"/"}var lie=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,cie=t=>lie.test(t);function uie(t,e="/"){let{pathname:n,search:i="",hash:r=""}=typeof t=="string"?cm(t):t,a;if(n)if(cie(n))a=n;else{if(n.includes("//")){let s=n;n=n.replace(/\/\/+/g,"/"),bo(!1,`Pathnames cannot have embedded double slashes - normalizing ${s} -> ${n}`)}n.startsWith("/")?a=pj(n.substring(1),"/"):a=pj(n,e)}else a=e;return{pathname:a,search:hie(i),hash:pie(r)}}function pj(t,e){let n=e.replace(/\/+$/,"").split("/");return t.split("/").forEach(r=>{r===".."?n.length>1&&n.pop():r!=="."&&n.push(r)}),n.length>1?n.join("/"):"/"}function SA(t,e,n,i){return`Cannot include a '${t}' character in a manually specified \`to.${e}\` field [${JSON.stringify(i)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function die(t){return t.filter((e,n)=>n===0||e.route.path&&e.route.path.length>0)}function cG(t){let e=die(t);return e.map((n,i)=>i===e.length-1?n.pathname:n.pathnameBase)}function uG(t,e,n,i=!1){let r;typeof t=="string"?r=cm(t):(r={...t},mi(!r.pathname||!r.pathname.includes("?"),SA("?","pathname","search",r)),mi(!r.pathname||!r.pathname.includes("#"),SA("#","pathname","hash",r)),mi(!r.search||!r.search.includes("#"),SA("#","search","hash",r)));let a=t===""||r.pathname==="",s=a?"/":r.pathname,o;if(s==null)o=n;else{let f=e.length-1;if(!i&&s.startsWith("..")){let p=s.split("/");for(;p[0]==="..";)p.shift(),f-=1;r.pathname=p.join("/")}o=f>=0?e[f]:"/"}let l=uie(r,o),c=s&&s!=="/"&&s.endsWith("/"),d=(a||s===".")&&n.endsWith("/");return!l.pathname.endsWith("/")&&(c||d)&&(l.pathname+="/"),l}var ec=t=>t.join("/").replace(/\/\/+/g,"/"),fie=t=>t.replace(/\/+$/,"").replace(/^\/*/,"/"),hie=t=>!t||t==="?"?"":t.startsWith("?")?t:"?"+t,pie=t=>!t||t==="#"?"":t.startsWith("#")?t:"#"+t;function mie(t){return t!=null&&typeof t.status=="number"&&typeof t.statusText=="string"&&typeof t.internal=="boolean"&&"data"in t}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var dG=["POST","PUT","PATCH","DELETE"];new Set(dG);var gie=["GET",...dG];new Set(gie);var um=A.createContext(null);um.displayName="DataRouter";var kS=A.createContext(null);kS.displayName="DataRouterState";A.createContext(!1);var fG=A.createContext({isTransitioning:!1});fG.displayName="ViewTransition";var xie=A.createContext(new Map);xie.displayName="Fetchers";var vie=A.createContext(null);vie.displayName="Await";var nl=A.createContext(null);nl.displayName="Navigation";var Sx=A.createContext(null);Sx.displayName="Location";var il=A.createContext({outlet:null,matches:[],isDataRoute:!1});il.displayName="Route";var hP=A.createContext(null);hP.displayName="RouteError";function yie(t,{relative:e}={}){mi(wx(),"useHref() may be used only in the context of a component.");let{basename:n,navigator:i}=A.useContext(nl),{hash:r,pathname:a,search:s}=Mx(t,{relative:e}),o=a;return n!=="/"&&(o=a==="/"?n:ec([n,a])),i.createHref({pathname:o,search:s,hash:r})}function wx(){return A.useContext(Sx)!=null}function nd(){return mi(wx(),"useLocation() may be used only in the context of a component."),A.useContext(Sx).location}var hG="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function pG(t){A.useContext(nl).static||A.useLayoutEffect(t)}function pP(){let{isDataRoute:t}=A.useContext(il);return t?kie():bie()}function bie(){mi(wx(),"useNavigate() may be used only in the context of a component.");let t=A.useContext(um),{basename:e,navigator:n}=A.useContext(nl),{matches:i}=A.useContext(il),{pathname:r}=nd(),a=JSON.stringify(cG(i)),s=A.useRef(!1);return pG(()=>{s.current=!0}),A.useCallback((l,c={})=>{if(bo(s.current,hG),!s.current)return;if(typeof l=="number"){n.go(l);return}let d=uG(l,JSON.parse(a),r,c.relative==="path");t==null&&e!=="/"&&(d.pathname=d.pathname==="/"?e:ec([e,d.pathname])),(c.replace?n.replace:n.push)(d,c.state,c)},[e,n,a,r,t])}var _ie=A.createContext(null);function Sie(t){let e=A.useContext(il).outlet;return A.useMemo(()=>e&&A.createElement(_ie.Provider,{value:t},e),[e,t])}function Mx(t,{relative:e}={}){let{matches:n}=A.useContext(il),{pathname:i}=nd(),r=JSON.stringify(cG(n));return A.useMemo(()=>uG(t,JSON.parse(r),i,e==="path"),[t,r,i,e])}function wie(t,e){return mG(t,e)}function mG(t,e,n,i,r){mi(wx(),"useRoutes() may be used only in the context of a component.");let{navigator:a}=A.useContext(nl),{matches:s}=A.useContext(il),o=s[s.length-1],l=o?o.params:{},c=o?o.pathname:"/",d=o?o.pathnameBase:"/",f=o&&o.route;{let M=f&&f.path||"";gG(c,!f||M.endsWith("*")||M.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${c}" (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. +`+S.stack}}var oe=Object.prototype.hasOwnProperty,De=t.unstable_scheduleCallback,Ne=t.unstable_cancelCallback,te=t.unstable_shouldYield,j=t.unstable_requestPaint,O=t.unstable_now,Y=t.unstable_getCurrentPriorityLevel,me=t.unstable_ImmediatePriority,ye=t.unstable_UserBlockingPriority,he=t.unstable_NormalPriority,Ze=t.unstable_LowPriority,Le=t.unstable_IdlePriority,Xe=t.log,at=t.unstable_setDisableYieldValue,Ie=null,Re=null;function pt(d){if(typeof Xe=="function"&&at(d),Re&&typeof Re.setStrictMode=="function")try{Re.setStrictMode(Ie,d)}catch{}}var nt=Math.clz32?Math.clz32:de,tt=Math.log,ut=Math.LN2;function de(d){return d>>>=0,d===0?32:31-(tt(d)/ut|0)|0}var it=256,fe=262144,Oe=4194304;function Me(d){var h=d&42;if(h!==0)return h;switch(d&-d){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 d&261888;case 262144:case 524288:case 1048576:case 2097152:return d&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return d&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return d}}function ge(d,h,b){var S=d.pendingLanes;if(S===0)return 0;var R=0,k=d.suspendedLanes,$=d.pingedLanes;d=d.warmLanes;var ne=S&134217727;return ne!==0?(S=ne&~k,S!==0?R=Me(S):($&=ne,$!==0?R=Me($):b||(b=ne&~d,b!==0&&(R=Me(b))))):(ne=S&~k,ne!==0?R=Me(ne):$!==0?R=Me($):b||(b=S&~d,b!==0&&(R=Me(b)))),R===0?0:h!==0&&h!==R&&(h&k)===0&&(k=R&-R,b=h&-h,k>=b||k===32&&(b&4194048)!==0)?h:R}function Be(d,h){return(d.pendingLanes&~(d.suspendedLanes&~d.pingedLanes)&h)===0}function ct(d,h){switch(d){case 1:case 2:case 4:case 8:case 64:return h+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 h+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 bt(){var d=Oe;return Oe<<=1,(Oe&62914560)===0&&(Oe=4194304),d}function Rt(d){for(var h=[],b=0;31>b;b++)h.push(d);return h}function on(d,h){d.pendingLanes|=h,h!==268435456&&(d.suspendedLanes=0,d.pingedLanes=0,d.warmLanes=0)}function kt(d,h,b,S,R,k){var $=d.pendingLanes;d.pendingLanes=b,d.suspendedLanes=0,d.pingedLanes=0,d.warmLanes=0,d.expiredLanes&=b,d.entangledLanes&=b,d.errorRecoveryDisabledLanes&=b,d.shellSuspendCounter=0;var ne=d.entanglements,_e=d.expirationTimes,Fe=d.hiddenUpdates;for(b=$&~b;0"u")return null;try{return d.activeElement||d.body}catch{return d.body}}var Ti=/[\n"\\]/g;function Cn(d){return d.replace(Ti,function(h){return"\\"+h.charCodeAt(0).toString(16)+" "})}function Js(d,h,b,S,R,k,$,ne){d.name="",$!=null&&typeof $!="function"&&typeof $!="symbol"&&typeof $!="boolean"?d.type=$:d.removeAttribute("type"),h!=null?$==="number"?(h===0&&d.value===""||d.value!=h)&&(d.value=""+cn(h)):d.value!==""+cn(h)&&(d.value=""+cn(h)):$!=="submit"&&$!=="reset"||d.removeAttribute("value"),h!=null?mr(d,$,cn(h)):b!=null?mr(d,$,cn(b)):S!=null&&d.removeAttribute("value"),R==null&&k!=null&&(d.defaultChecked=!!k),R!=null&&(d.checked=R&&typeof R!="function"&&typeof R!="symbol"),ne!=null&&typeof ne!="function"&&typeof ne!="symbol"&&typeof ne!="boolean"?d.name=""+cn(ne):d.removeAttribute("name")}function Pn(d,h,b,S,R,k,$,ne){if(k!=null&&typeof k!="function"&&typeof k!="symbol"&&typeof k!="boolean"&&(d.type=k),h!=null||b!=null){if(!(k!=="submit"&&k!=="reset"||h!=null)){Xt(d);return}b=b!=null?""+cn(b):"",h=h!=null?""+cn(h):b,ne||h===d.value||(d.value=h),d.defaultValue=h}S=S??R,S=typeof S!="function"&&typeof S!="symbol"&&!!S,d.checked=ne?d.checked:!!S,d.defaultChecked=!!S,$!=null&&typeof $!="function"&&typeof $!="symbol"&&typeof $!="boolean"&&(d.name=$),Xt(d)}function mr(d,h,b){h==="number"&&yi(d.ownerDocument)===d||d.defaultValue===""+b||(d.defaultValue=""+b)}function Qi(d,h,b,S){if(d=d.options,h){h={};for(var R=0;R"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),xM=!1;if(cl)try{var Fm={};Object.defineProperty(Fm,"passive",{get:function(){xM=!0}}),window.addEventListener("test",Fm,Fm),window.removeEventListener("test",Fm,Fm)}catch{xM=!1}var Dc=null,vM=null,vv=null;function lL(){if(vv)return vv;var d,h=vM,b=h.length,S,R="value"in Dc?Dc.value:Dc.textContent,k=R.length;for(d=0;d=Hm),pL=" ",mL=!1;function gL(d,h){switch(d){case"keyup":return cee.indexOf(h.keyCode)!==-1;case"keydown":return h.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function xL(d){return d=d.detail,typeof d=="object"&&"data"in d?d.data:null}var Kf=!1;function dee(d,h){switch(d){case"compositionend":return xL(h);case"keypress":return h.which!==32?null:(mL=!0,pL);case"textInput":return d=h.data,d===pL&&mL?null:d;default:return null}}function fee(d,h){if(Kf)return d==="compositionend"||!wM&&gL(d,h)?(d=lL(),vv=vM=Dc=null,Kf=!1,d):null;switch(d){case"paste":return null;case"keypress":if(!(h.ctrlKey||h.altKey||h.metaKey)||h.ctrlKey&&h.altKey){if(h.char&&1=h)return{node:b,offset:h-d};d=S}e:{for(;b;){if(b.nextSibling){b=b.nextSibling;break e}b=b.parentNode}b=void 0}b=EL(b)}}function TL(d,h){return d&&h?d===h?!0:d&&d.nodeType===3?!1:h&&h.nodeType===3?TL(d,h.parentNode):"contains"in d?d.contains(h):d.compareDocumentPosition?!!(d.compareDocumentPosition(h)&16):!1:!1}function CL(d){d=d!=null&&d.ownerDocument!=null&&d.ownerDocument.defaultView!=null?d.ownerDocument.defaultView:window;for(var h=yi(d.document);h instanceof d.HTMLIFrameElement;){try{var b=typeof h.contentWindow.location.href=="string"}catch{b=!1}if(b)d=h.contentWindow;else break;h=yi(d.document)}return h}function AM(d){var h=d&&d.nodeName&&d.nodeName.toLowerCase();return h&&(h==="input"&&(d.type==="text"||d.type==="search"||d.type==="tel"||d.type==="url"||d.type==="password")||h==="textarea"||d.contentEditable==="true")}var bee=cl&&"documentMode"in document&&11>=document.documentMode,Yf=null,TM=null,Wm=null,CM=!1;function NL(d,h,b){var S=b.window===b?b.document:b.nodeType===9?b:b.ownerDocument;CM||Yf==null||Yf!==yi(S)||(S=Yf,"selectionStart"in S&&AM(S)?S={start:S.selectionStart,end:S.selectionEnd}:(S=(S.ownerDocument&&S.ownerDocument.defaultView||window).getSelection(),S={anchorNode:S.anchorNode,anchorOffset:S.anchorOffset,focusNode:S.focusNode,focusOffset:S.focusOffset}),Wm&&Gm(Wm,S)||(Wm=S,S=dy(TM,"onSelect"),0>=$,R-=$,Co=1<<32-nt(h)+R|b<Qt?(xn=Dt,Dt=null):xn=Dt.sibling;var wn=Ve(ke,Dt,je[Qt],rt);if(wn===null){Dt===null&&(Dt=xn);break}d&&Dt&&wn.alternate===null&&h(ke,Dt),Ee=k(wn,Ee,Qt),Sn===null?It=wn:Sn.sibling=wn,Sn=wn,Dt=xn}if(Qt===je.length)return b(ke,Dt),yn&&dl(ke,Qt),It;if(Dt===null){for(;QtQt?(xn=Dt,Dt=null):xn=Dt.sibling;var eu=Ve(ke,Dt,wn.value,rt);if(eu===null){Dt===null&&(Dt=xn);break}d&&Dt&&eu.alternate===null&&h(ke,Dt),Ee=k(eu,Ee,Qt),Sn===null?It=eu:Sn.sibling=eu,Sn=eu,Dt=xn}if(wn.done)return b(ke,Dt),yn&&dl(ke,Qt),It;if(Dt===null){for(;!wn.done;Qt++,wn=je.next())wn=st(ke,wn.value,rt),wn!==null&&(Ee=k(wn,Ee,Qt),Sn===null?It=wn:Sn.sibling=wn,Sn=wn);return yn&&dl(ke,Qt),It}for(Dt=S(Dt);!wn.done;Qt++,wn=je.next())wn=Ye(Dt,ke,Qt,wn.value,rt),wn!==null&&(d&&wn.alternate!==null&&Dt.delete(wn.key===null?Qt:wn.key),Ee=k(wn,Ee,Qt),Sn===null?It=wn:Sn.sibling=wn,Sn=wn);return d&&Dt.forEach(function(zte){return h(ke,zte)}),yn&&dl(ke,Qt),It}function jn(ke,Ee,je,rt){if(typeof je=="object"&&je!==null&&je.type===_&&je.key===null&&(je=je.props.children),typeof je=="object"&&je!==null){switch(je.$$typeof){case g:e:{for(var It=je.key;Ee!==null;){if(Ee.key===It){if(It=je.type,It===_){if(Ee.tag===7){b(ke,Ee.sibling),rt=R(Ee,je.props.children),rt.return=ke,ke=rt;break e}}else if(Ee.elementType===It||typeof It=="object"&&It!==null&&It.$$typeof===U&&Sd(It)===Ee.type){b(ke,Ee.sibling),rt=R(Ee,je.props),Qm(rt,je),rt.return=ke,ke=rt;break e}b(ke,Ee);break}else h(ke,Ee);Ee=Ee.sibling}je.type===_?(rt=xd(je.props.children,ke.mode,rt,je.key),rt.return=ke,ke=rt):(rt=Cv(je.type,je.key,je.props,null,ke.mode,rt),Qm(rt,je),rt.return=ke,ke=rt)}return $(ke);case y:e:{for(It=je.key;Ee!==null;){if(Ee.key===It)if(Ee.tag===4&&Ee.stateNode.containerInfo===je.containerInfo&&Ee.stateNode.implementation===je.implementation){b(ke,Ee.sibling),rt=R(Ee,je.children||[]),rt.return=ke,ke=rt;break e}else{b(ke,Ee);break}else h(ke,Ee);Ee=Ee.sibling}rt=LM(je,ke.mode,rt),rt.return=ke,ke=rt}return $(ke);case U:return je=Sd(je),jn(ke,Ee,je,rt)}if(H(je))return Nt(ke,Ee,je,rt);if(I(je)){if(It=I(je),typeof It!="function")throw Error(i(150));return je=It.call(je),Bt(ke,Ee,je,rt)}if(typeof je.then=="function")return jn(ke,Ee,Lv(je),rt);if(je.$$typeof===w)return jn(ke,Ee,Pv(ke,je),rt);Iv(ke,je)}return typeof je=="string"&&je!==""||typeof je=="number"||typeof je=="bigint"?(je=""+je,Ee!==null&&Ee.tag===6?(b(ke,Ee.sibling),rt=R(Ee,je),rt.return=ke,ke=rt):(b(ke,Ee),rt=OM(je,ke.mode,rt),rt.return=ke,ke=rt),$(ke)):b(ke,Ee)}return function(ke,Ee,je,rt){try{Zm=0;var It=jn(ke,Ee,je,rt);return oh=null,It}catch(Dt){if(Dt===sh||Dt===kv)throw Dt;var Sn=Wa(29,Dt,null,ke.mode);return Sn.lanes=rt,Sn.return=ke,Sn}finally{}}}var Md=QL(!0),JL=QL(!1),Uc=!1;function qM(d){d.updateQueue={baseState:d.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function XM(d,h){d=d.updateQueue,h.updateQueue===d&&(h.updateQueue={baseState:d.baseState,firstBaseUpdate:d.firstBaseUpdate,lastBaseUpdate:d.lastBaseUpdate,shared:d.shared,callbacks:null})}function jc(d){return{lane:d,tag:0,payload:null,callback:null,next:null}}function Fc(d,h,b){var S=d.updateQueue;if(S===null)return null;if(S=S.shared,(Tn&2)!==0){var R=S.pending;return R===null?h.next=h:(h.next=R.next,R.next=h),S.pending=h,h=Tv(d),IL(d,null,b),h}return Av(d,S,h,b),Tv(d)}function Jm(d,h,b){if(h=h.updateQueue,h!==null&&(h=h.shared,(b&4194048)!==0)){var S=h.lanes;S&=d.pendingLanes,b|=S,h.lanes=b,Wn(d,b)}}function KM(d,h){var b=d.updateQueue,S=d.alternate;if(S!==null&&(S=S.updateQueue,b===S)){var R=null,k=null;if(b=b.firstBaseUpdate,b!==null){do{var $={lane:b.lane,tag:b.tag,payload:b.payload,callback:null,next:null};k===null?R=k=$:k=k.next=$,b=b.next}while(b!==null);k===null?R=k=h:k=k.next=h}else R=k=h;b={baseState:S.baseState,firstBaseUpdate:R,lastBaseUpdate:k,shared:S.shared,callbacks:S.callbacks},d.updateQueue=b;return}d=b.lastBaseUpdate,d===null?b.firstBaseUpdate=h:d.next=h,b.lastBaseUpdate=h}var YM=!1;function eg(){if(YM){var d=ah;if(d!==null)throw d}}function tg(d,h,b,S){YM=!1;var R=d.updateQueue;Uc=!1;var k=R.firstBaseUpdate,$=R.lastBaseUpdate,ne=R.shared.pending;if(ne!==null){R.shared.pending=null;var _e=ne,Fe=_e.next;_e.next=null,$===null?k=Fe:$.next=Fe,$=_e;var Je=d.alternate;Je!==null&&(Je=Je.updateQueue,ne=Je.lastBaseUpdate,ne!==$&&(ne===null?Je.firstBaseUpdate=Fe:ne.next=Fe,Je.lastBaseUpdate=_e))}if(k!==null){var st=R.baseState;$=0,Je=Fe=_e=null,ne=k;do{var Ve=ne.lane&-536870913,Ye=Ve!==ne.lane;if(Ye?(gn&Ve)===Ve:(S&Ve)===Ve){Ve!==0&&Ve===rh&&(YM=!0),Je!==null&&(Je=Je.next={lane:0,tag:ne.tag,payload:ne.payload,callback:null,next:null});e:{var Nt=d,Bt=ne;Ve=h;var jn=b;switch(Bt.tag){case 1:if(Nt=Bt.payload,typeof Nt=="function"){st=Nt.call(jn,st,Ve);break e}st=Nt;break e;case 3:Nt.flags=Nt.flags&-65537|128;case 0:if(Nt=Bt.payload,Ve=typeof Nt=="function"?Nt.call(jn,st,Ve):Nt,Ve==null)break e;st=f({},st,Ve);break e;case 2:Uc=!0}}Ve=ne.callback,Ve!==null&&(d.flags|=64,Ye&&(d.flags|=8192),Ye=R.callbacks,Ye===null?R.callbacks=[Ve]:Ye.push(Ve))}else Ye={lane:Ve,tag:ne.tag,payload:ne.payload,callback:ne.callback,next:null},Je===null?(Fe=Je=Ye,_e=st):Je=Je.next=Ye,$|=Ve;if(ne=ne.next,ne===null){if(ne=R.shared.pending,ne===null)break;Ye=ne,ne=Ye.next,Ye.next=null,R.lastBaseUpdate=Ye,R.shared.pending=null}}while(!0);Je===null&&(_e=st),R.baseState=_e,R.firstBaseUpdate=Fe,R.lastBaseUpdate=Je,k===null&&(R.shared.lanes=0),$c|=$,d.lanes=$,d.memoizedState=st}}function eI(d,h){if(typeof d!="function")throw Error(i(191,d));d.call(h)}function tI(d,h){var b=d.callbacks;if(b!==null)for(d.callbacks=null,d=0;dk?k:8;var $=V.T,ne={};V.T=ne,mE(d,!1,h,b);try{var _e=R(),Fe=V.S;if(Fe!==null&&Fe(ne,_e),_e!==null&&typeof _e=="object"&&typeof _e.then=="function"){var Je=Nee(_e,S);rg(d,h,Je,Za(d))}else rg(d,h,S,Za(d))}catch(st){rg(d,h,{then:function(){},status:"rejected",reason:st},Za())}finally{G.p=k,$!==null&&ne.types!==null&&($.types=ne.types),V.T=$}}function Lee(){}function hE(d,h,b,S){if(d.tag!==5)throw Error(i(476));var R=kI(d).queue;DI(d,R,h,K,b===null?Lee:function(){return OI(d),b(S)})}function kI(d){var h=d.memoizedState;if(h!==null)return h;h={memoizedState:K,baseState:K,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ml,lastRenderedState:K},next:null};var b={};return h.next={memoizedState:b,baseState:b,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ml,lastRenderedState:b},next:null},d.memoizedState=h,d=d.alternate,d!==null&&(d.memoizedState=h),h}function OI(d){var h=kI(d);h.next===null&&(h=d.alternate.memoizedState),rg(d,h.next.queue,{},Za())}function pE(){return kr(_g)}function LI(){return Ni().memoizedState}function II(){return Ni().memoizedState}function Iee(d){for(var h=d.return;h!==null;){switch(h.tag){case 24:case 3:var b=Za();d=jc(b);var S=Fc(h,d,b);S!==null&&(Na(S,h,b),Jm(S,h,b)),h={cache:VM()},d.payload=h;return}h=h.return}}function Uee(d,h,b){var S=Za();b={lane:S,revertLane:0,gesture:null,action:b,hasEagerState:!1,eagerState:null,next:null},Wv(d)?jI(h,b):(b=DM(d,h,b,S),b!==null&&(Na(b,d,S),FI(b,h,S)))}function UI(d,h,b){var S=Za();rg(d,h,b,S)}function rg(d,h,b,S){var R={lane:S,revertLane:0,gesture:null,action:b,hasEagerState:!1,eagerState:null,next:null};if(Wv(d))jI(h,R);else{var k=d.alternate;if(d.lanes===0&&(k===null||k.lanes===0)&&(k=h.lastRenderedReducer,k!==null))try{var $=h.lastRenderedState,ne=k($,b);if(R.hasEagerState=!0,R.eagerState=ne,Ga(ne,$))return Av(d,h,R,0),qn===null&&Ev(),!1}catch{}finally{}if(b=DM(d,h,R,S),b!==null)return Na(b,d,S),FI(b,h,S),!0}return!1}function mE(d,h,b,S){if(S={lane:2,revertLane:qE(),gesture:null,action:S,hasEagerState:!1,eagerState:null,next:null},Wv(d)){if(h)throw Error(i(479))}else h=DM(d,b,S,2),h!==null&&Na(h,d,2)}function Wv(d){var h=d.alternate;return d===Zt||h!==null&&h===Zt}function jI(d,h){ch=Fv=!0;var b=d.pending;b===null?h.next=h:(h.next=b.next,b.next=h),d.pending=h}function FI(d,h,b){if((b&4194048)!==0){var S=h.lanes;S&=d.pendingLanes,b|=S,h.lanes=b,Wn(d,b)}}var ag={readContext:kr,use:Hv,useCallback:bi,useContext:bi,useEffect:bi,useImperativeHandle:bi,useLayoutEffect:bi,useInsertionEffect:bi,useMemo:bi,useReducer:bi,useRef:bi,useState:bi,useDebugValue:bi,useDeferredValue:bi,useTransition:bi,useSyncExternalStore:bi,useId:bi,useHostTransitionStatus:bi,useFormState:bi,useActionState:bi,useOptimistic:bi,useMemoCache:bi,useCacheRefresh:bi};ag.useEffectEvent=bi;var zI={readContext:kr,use:Hv,useCallback:function(d,h){return ca().memoizedState=[d,h===void 0?null:h],d},useContext:kr,useEffect:wI,useImperativeHandle:function(d,h,b){b=b!=null?b.concat([d]):null,$v(4194308,4,TI.bind(null,h,d),b)},useLayoutEffect:function(d,h){return $v(4194308,4,d,h)},useInsertionEffect:function(d,h){$v(4,2,d,h)},useMemo:function(d,h){var b=ca();h=h===void 0?null:h;var S=d();if(Ed){pt(!0);try{d()}finally{pt(!1)}}return b.memoizedState=[S,h],S},useReducer:function(d,h,b){var S=ca();if(b!==void 0){var R=b(h);if(Ed){pt(!0);try{b(h)}finally{pt(!1)}}}else R=h;return S.memoizedState=S.baseState=R,d={pending:null,lanes:0,dispatch:null,lastRenderedReducer:d,lastRenderedState:R},S.queue=d,d=d.dispatch=Uee.bind(null,Zt,d),[S.memoizedState,d]},useRef:function(d){var h=ca();return d={current:d},h.memoizedState=d},useState:function(d){d=lE(d);var h=d.queue,b=UI.bind(null,Zt,h);return h.dispatch=b,[d.memoizedState,b]},useDebugValue:dE,useDeferredValue:function(d,h){var b=ca();return fE(b,d,h)},useTransition:function(){var d=lE(!1);return d=DI.bind(null,Zt,d.queue,!0,!1),ca().memoizedState=d,[!1,d]},useSyncExternalStore:function(d,h,b){var S=Zt,R=ca();if(yn){if(b===void 0)throw Error(i(407));b=b()}else{if(b=h(),qn===null)throw Error(i(349));(gn&127)!==0||oI(S,h,b)}R.memoizedState=b;var k={value:b,getSnapshot:h};return R.queue=k,wI(cI.bind(null,S,k,d),[d]),S.flags|=2048,dh(9,{destroy:void 0},lI.bind(null,S,k,b,h),null),b},useId:function(){var d=ca(),h=qn.identifierPrefix;if(yn){var b=No,S=Co;b=(S&~(1<<32-nt(S)-1)).toString(32)+b,h="_"+h+"R_"+b,b=zv++,0<\/script>",k=k.removeChild(k.firstChild);break;case"select":k=typeof S.is=="string"?$.createElement("select",{is:S.is}):$.createElement("select"),S.multiple?k.multiple=!0:S.size&&(k.size=S.size);break;default:k=typeof S.is=="string"?$.createElement(R,{is:S.is}):$.createElement(R)}}k[hi]=h,k[Ai]=S;e:for($=h.child;$!==null;){if($.tag===5||$.tag===6)k.appendChild($.stateNode);else if($.tag!==4&&$.tag!==27&&$.child!==null){$.child.return=$,$=$.child;continue}if($===h)break e;for(;$.sibling===null;){if($.return===null||$.return===h)break e;$=$.return}$.sibling.return=$.return,$=$.sibling}h.stateNode=k;e:switch(Lr(k,R,S),R){case"button":case"input":case"select":case"textarea":S=!!S.autoFocus;break e;case"img":S=!0;break e;default:S=!1}S&&xl(h)}}return ti(h),NE(h,h.type,d===null?null:d.memoizedProps,h.pendingProps,b),null;case 6:if(d&&h.stateNode!=null)d.memoizedProps!==S&&xl(h);else{if(typeof S!="string"&&h.stateNode===null)throw Error(i(166));if(d=ie.current,nh(h)){if(d=h.stateNode,b=h.memoizedProps,S=null,R=Dr,R!==null)switch(R.tag){case 27:case 5:S=R.memoizedProps}d[hi]=h,d=!!(d.nodeValue===b||S!==null&&S.suppressHydrationWarning===!0||aj(d.nodeValue,b)),d||Lc(h,!0)}else d=fy(d).createTextNode(S),d[hi]=h,h.stateNode=d}return ti(h),null;case 31:if(b=h.memoizedState,d===null||d.memoizedState!==null){if(S=nh(h),b!==null){if(d===null){if(!S)throw Error(i(318));if(d=h.memoizedState,d=d!==null?d.dehydrated:null,!d)throw Error(i(557));d[hi]=h}else vd(),(h.flags&128)===0&&(h.memoizedState=null),h.flags|=4;ti(h),d=!1}else b=FM(),d!==null&&d.memoizedState!==null&&(d.memoizedState.hydrationErrors=b),d=!0;if(!d)return h.flags&256?(Xa(h),h):(Xa(h),null);if((h.flags&128)!==0)throw Error(i(558))}return ti(h),null;case 13:if(S=h.memoizedState,d===null||d.memoizedState!==null&&d.memoizedState.dehydrated!==null){if(R=nh(h),S!==null&&S.dehydrated!==null){if(d===null){if(!R)throw Error(i(318));if(R=h.memoizedState,R=R!==null?R.dehydrated:null,!R)throw Error(i(317));R[hi]=h}else vd(),(h.flags&128)===0&&(h.memoizedState=null),h.flags|=4;ti(h),R=!1}else R=FM(),d!==null&&d.memoizedState!==null&&(d.memoizedState.hydrationErrors=R),R=!0;if(!R)return h.flags&256?(Xa(h),h):(Xa(h),null)}return Xa(h),(h.flags&128)!==0?(h.lanes=b,h):(b=S!==null,d=d!==null&&d.memoizedState!==null,b&&(S=h.child,R=null,S.alternate!==null&&S.alternate.memoizedState!==null&&S.alternate.memoizedState.cachePool!==null&&(R=S.alternate.memoizedState.cachePool.pool),k=null,S.memoizedState!==null&&S.memoizedState.cachePool!==null&&(k=S.memoizedState.cachePool.pool),k!==R&&(S.flags|=2048)),b!==d&&b&&(h.child.flags|=8192),Zv(h,h.updateQueue),ti(h),null);case 4:return pe(),d===null&&ZE(h.stateNode.containerInfo),ti(h),null;case 10:return hl(h.type),ti(h),null;case 19:if(X(Ci),S=h.memoizedState,S===null)return ti(h),null;if(R=(h.flags&128)!==0,k=S.rendering,k===null)if(R)og(S,!1);else{if(_i!==0||d!==null&&(d.flags&128)!==0)for(d=h.child;d!==null;){if(k=jv(d),k!==null){for(h.flags|=128,og(S,!1),d=k.updateQueue,h.updateQueue=d,Zv(h,d),h.subtreeFlags=0,d=b,b=h.child;b!==null;)UL(b,d),b=b.sibling;return ae(Ci,Ci.current&1|2),yn&&dl(h,S.treeForkCount),h.child}d=d.sibling}S.tail!==null&&O()>ny&&(h.flags|=128,R=!0,og(S,!1),h.lanes=4194304)}else{if(!R)if(d=jv(k),d!==null){if(h.flags|=128,R=!0,d=d.updateQueue,h.updateQueue=d,Zv(h,d),og(S,!0),S.tail===null&&S.tailMode==="hidden"&&!k.alternate&&!yn)return ti(h),null}else 2*O()-S.renderingStartTime>ny&&b!==536870912&&(h.flags|=128,R=!0,og(S,!1),h.lanes=4194304);S.isBackwards?(k.sibling=h.child,h.child=k):(d=S.last,d!==null?d.sibling=k:h.child=k,S.last=k)}return S.tail!==null?(d=S.tail,S.rendering=d,S.tail=d.sibling,S.renderingStartTime=O(),d.sibling=null,b=Ci.current,ae(Ci,R?b&1|2:b&1),yn&&dl(h,S.treeForkCount),d):(ti(h),null);case 22:case 23:return Xa(h),QM(),S=h.memoizedState!==null,d!==null?d.memoizedState!==null!==S&&(h.flags|=8192):S&&(h.flags|=8192),S?(b&536870912)!==0&&(h.flags&128)===0&&(ti(h),h.subtreeFlags&6&&(h.flags|=8192)):ti(h),b=h.updateQueue,b!==null&&Zv(h,b.retryQueue),b=null,d!==null&&d.memoizedState!==null&&d.memoizedState.cachePool!==null&&(b=d.memoizedState.cachePool.pool),S=null,h.memoizedState!==null&&h.memoizedState.cachePool!==null&&(S=h.memoizedState.cachePool.pool),S!==b&&(h.flags|=2048),d!==null&&X(_d),null;case 24:return b=null,d!==null&&(b=d.memoizedState.cache),h.memoizedState.cache!==b&&(h.flags|=2048),hl(Ii),ti(h),null;case 25:return null;case 30:return null}throw Error(i(156,h.tag))}function Hee(d,h){switch(UM(h),h.tag){case 1:return d=h.flags,d&65536?(h.flags=d&-65537|128,h):null;case 3:return hl(Ii),pe(),d=h.flags,(d&65536)!==0&&(d&128)===0?(h.flags=d&-65537|128,h):null;case 26:case 27:case 5:return ze(h),null;case 31:if(h.memoizedState!==null){if(Xa(h),h.alternate===null)throw Error(i(340));vd()}return d=h.flags,d&65536?(h.flags=d&-65537|128,h):null;case 13:if(Xa(h),d=h.memoizedState,d!==null&&d.dehydrated!==null){if(h.alternate===null)throw Error(i(340));vd()}return d=h.flags,d&65536?(h.flags=d&-65537|128,h):null;case 19:return X(Ci),null;case 4:return pe(),null;case 10:return hl(h.type),null;case 22:case 23:return Xa(h),QM(),d!==null&&X(_d),d=h.flags,d&65536?(h.flags=d&-65537|128,h):null;case 24:return hl(Ii),null;case 25:return null;default:return null}}function uU(d,h){switch(UM(h),h.tag){case 3:hl(Ii),pe();break;case 26:case 27:case 5:ze(h);break;case 4:pe();break;case 31:h.memoizedState!==null&&Xa(h);break;case 13:Xa(h);break;case 19:X(Ci);break;case 10:hl(h.type);break;case 22:case 23:Xa(h),QM(),d!==null&&X(_d);break;case 24:hl(Ii)}}function lg(d,h){try{var b=h.updateQueue,S=b!==null?b.lastEffect:null;if(S!==null){var R=S.next;b=R;do{if((b.tag&d)===d){S=void 0;var k=b.create,$=b.inst;S=k(),$.destroy=S}b=b.next}while(b!==R)}}catch(ne){kn(h,h.return,ne)}}function Hc(d,h,b){try{var S=h.updateQueue,R=S!==null?S.lastEffect:null;if(R!==null){var k=R.next;S=k;do{if((S.tag&d)===d){var $=S.inst,ne=$.destroy;if(ne!==void 0){$.destroy=void 0,R=h;var _e=b,Fe=ne;try{Fe()}catch(Je){kn(R,_e,Je)}}}S=S.next}while(S!==k)}}catch(Je){kn(h,h.return,Je)}}function dU(d){var h=d.updateQueue;if(h!==null){var b=d.stateNode;try{tI(h,b)}catch(S){kn(d,d.return,S)}}}function fU(d,h,b){b.props=Ad(d.type,d.memoizedProps),b.state=d.memoizedState;try{b.componentWillUnmount()}catch(S){kn(d,h,S)}}function cg(d,h){try{var b=d.ref;if(b!==null){switch(d.tag){case 26:case 27:case 5:var S=d.stateNode;break;case 30:S=d.stateNode;break;default:S=d.stateNode}typeof b=="function"?d.refCleanup=b(S):b.current=S}}catch(R){kn(d,h,R)}}function Ro(d,h){var b=d.ref,S=d.refCleanup;if(b!==null)if(typeof S=="function")try{S()}catch(R){kn(d,h,R)}finally{d.refCleanup=null,d=d.alternate,d!=null&&(d.refCleanup=null)}else if(typeof b=="function")try{b(null)}catch(R){kn(d,h,R)}else b.current=null}function hU(d){var h=d.type,b=d.memoizedProps,S=d.stateNode;try{e:switch(h){case"button":case"input":case"select":case"textarea":b.autoFocus&&S.focus();break e;case"img":b.src?S.src=b.src:b.srcSet&&(S.srcset=b.srcSet)}}catch(R){kn(d,d.return,R)}}function RE(d,h,b){try{var S=d.stateNode;ute(S,d.type,b,h),S[Ai]=h}catch(R){kn(d,d.return,R)}}function pU(d){return d.tag===5||d.tag===3||d.tag===26||d.tag===27&&Kc(d.type)||d.tag===4}function PE(d){e:for(;;){for(;d.sibling===null;){if(d.return===null||pU(d.return))return null;d=d.return}for(d.sibling.return=d.return,d=d.sibling;d.tag!==5&&d.tag!==6&&d.tag!==18;){if(d.tag===27&&Kc(d.type)||d.flags&2||d.child===null||d.tag===4)continue e;d.child.return=d,d=d.child}if(!(d.flags&2))return d.stateNode}}function DE(d,h,b){var S=d.tag;if(S===5||S===6)d=d.stateNode,h?(b.nodeType===9?b.body:b.nodeName==="HTML"?b.ownerDocument.body:b).insertBefore(d,h):(h=b.nodeType===9?b.body:b.nodeName==="HTML"?b.ownerDocument.body:b,h.appendChild(d),b=b._reactRootContainer,b!=null||h.onclick!==null||(h.onclick=ll));else if(S!==4&&(S===27&&Kc(d.type)&&(b=d.stateNode,h=null),d=d.child,d!==null))for(DE(d,h,b),d=d.sibling;d!==null;)DE(d,h,b),d=d.sibling}function Qv(d,h,b){var S=d.tag;if(S===5||S===6)d=d.stateNode,h?b.insertBefore(d,h):b.appendChild(d);else if(S!==4&&(S===27&&Kc(d.type)&&(b=d.stateNode),d=d.child,d!==null))for(Qv(d,h,b),d=d.sibling;d!==null;)Qv(d,h,b),d=d.sibling}function mU(d){var h=d.stateNode,b=d.memoizedProps;try{for(var S=d.type,R=h.attributes;R.length;)h.removeAttributeNode(R[0]);Lr(h,S,b),h[hi]=d,h[Ai]=b}catch(k){kn(d,d.return,k)}}var vl=!1,Fi=!1,kE=!1,gU=typeof WeakSet=="function"?WeakSet:Set,xr=null;function Vee(d,h){if(d=d.containerInfo,eA=yy,d=CL(d),AM(d)){if("selectionStart"in d)var b={start:d.selectionStart,end:d.selectionEnd};else e:{b=(b=d.ownerDocument)&&b.defaultView||window;var S=b.getSelection&&b.getSelection();if(S&&S.rangeCount!==0){b=S.anchorNode;var R=S.anchorOffset,k=S.focusNode;S=S.focusOffset;try{b.nodeType,k.nodeType}catch{b=null;break e}var $=0,ne=-1,_e=-1,Fe=0,Je=0,st=d,Ve=null;t:for(;;){for(var Ye;st!==b||R!==0&&st.nodeType!==3||(ne=$+R),st!==k||S!==0&&st.nodeType!==3||(_e=$+S),st.nodeType===3&&($+=st.nodeValue.length),(Ye=st.firstChild)!==null;)Ve=st,st=Ye;for(;;){if(st===d)break t;if(Ve===b&&++Fe===R&&(ne=$),Ve===k&&++Je===S&&(_e=$),(Ye=st.nextSibling)!==null)break;st=Ve,Ve=st.parentNode}st=Ye}b=ne===-1||_e===-1?null:{start:ne,end:_e}}else b=null}b=b||{start:0,end:0}}else b=null;for(tA={focusedElem:d,selectionRange:b},yy=!1,xr=h;xr!==null;)if(h=xr,d=h.child,(h.subtreeFlags&1028)!==0&&d!==null)d.return=h,xr=d;else for(;xr!==null;){switch(h=xr,k=h.alternate,d=h.flags,h.tag){case 0:if((d&4)!==0&&(d=h.updateQueue,d=d!==null?d.events:null,d!==null))for(b=0;b title"))),Lr(k,S,b),k[hi]=d,Te(k),S=k;break e;case"link":var $=Sj("link","href",R).get(S+(b.href||""));if($){for(var ne=0;ne<$.length;ne++)if(k=$[ne],k.getAttribute("href")===(b.href==null||b.href===""?null:b.href)&&k.getAttribute("rel")===(b.rel==null?null:b.rel)&&k.getAttribute("title")===(b.title==null?null:b.title)&&k.getAttribute("crossorigin")===(b.crossOrigin==null?null:b.crossOrigin)){$.splice(ne,1);break t}}k=R.createElement(S),Lr(k,S,b),R.head.appendChild(k);break;case"meta":if($=Sj("meta","content",R).get(S+(b.content||""))){for(ne=0;ne<$.length;ne++)if(k=$[ne],k.getAttribute("content")===(b.content==null?null:""+b.content)&&k.getAttribute("name")===(b.name==null?null:b.name)&&k.getAttribute("property")===(b.property==null?null:b.property)&&k.getAttribute("http-equiv")===(b.httpEquiv==null?null:b.httpEquiv)&&k.getAttribute("charset")===(b.charSet==null?null:b.charSet)){$.splice(ne,1);break t}}k=R.createElement(S),Lr(k,S,b),R.head.appendChild(k);break;default:throw Error(i(468,S))}k[hi]=d,Te(k),S=k}d.stateNode=S}else wj(R,d.type,d.stateNode);else d.stateNode=_j(R,S,d.memoizedProps);else k!==S?(k===null?b.stateNode!==null&&(b=b.stateNode,b.parentNode.removeChild(b)):k.count--,S===null?wj(R,d.type,d.stateNode):_j(R,S,d.memoizedProps)):S===null&&d.stateNode!==null&&RE(d,d.memoizedProps,b.memoizedProps)}break;case 27:Aa(h,d),Ta(d),S&512&&(Fi||b===null||Ro(b,b.return)),b!==null&&S&4&&RE(d,d.memoizedProps,b.memoizedProps);break;case 5:if(Aa(h,d),Ta(d),S&512&&(Fi||b===null||Ro(b,b.return)),d.flags&32){R=d.stateNode;try{To(R,"")}catch(Nt){kn(d,d.return,Nt)}}S&4&&d.stateNode!=null&&(R=d.memoizedProps,RE(d,R,b!==null?b.memoizedProps:R)),S&1024&&(kE=!0);break;case 6:if(Aa(h,d),Ta(d),S&4){if(d.stateNode===null)throw Error(i(162));S=d.memoizedProps,b=d.stateNode;try{b.nodeValue=S}catch(Nt){kn(d,d.return,Nt)}}break;case 3:if(my=null,R=to,to=hy(h.containerInfo),Aa(h,d),to=R,Ta(d),S&4&&b!==null&&b.memoizedState.isDehydrated)try{wh(h.containerInfo)}catch(Nt){kn(d,d.return,Nt)}kE&&(kE=!1,wU(d));break;case 4:S=to,to=hy(d.stateNode.containerInfo),Aa(h,d),Ta(d),to=S;break;case 12:Aa(h,d),Ta(d);break;case 31:Aa(h,d),Ta(d),S&4&&(S=d.updateQueue,S!==null&&(d.updateQueue=null,Jv(d,S)));break;case 13:Aa(h,d),Ta(d),d.child.flags&8192&&d.memoizedState!==null!=(b!==null&&b.memoizedState!==null)&&(ty=O()),S&4&&(S=d.updateQueue,S!==null&&(d.updateQueue=null,Jv(d,S)));break;case 22:R=d.memoizedState!==null;var _e=b!==null&&b.memoizedState!==null,Fe=vl,Je=Fi;if(vl=Fe||R,Fi=Je||_e,Aa(h,d),Fi=Je,vl=Fe,Ta(d),S&8192)e:for(h=d.stateNode,h._visibility=R?h._visibility&-2:h._visibility|1,R&&(b===null||_e||vl||Fi||Td(d)),b=null,h=d;;){if(h.tag===5||h.tag===26){if(b===null){_e=b=h;try{if(k=_e.stateNode,R)$=k.style,typeof $.setProperty=="function"?$.setProperty("display","none","important"):$.display="none";else{ne=_e.stateNode;var st=_e.memoizedProps.style,Ve=st!=null&&st.hasOwnProperty("display")?st.display:null;ne.style.display=Ve==null||typeof Ve=="boolean"?"":(""+Ve).trim()}}catch(Nt){kn(_e,_e.return,Nt)}}}else if(h.tag===6){if(b===null){_e=h;try{_e.stateNode.nodeValue=R?"":_e.memoizedProps}catch(Nt){kn(_e,_e.return,Nt)}}}else if(h.tag===18){if(b===null){_e=h;try{var Ye=_e.stateNode;R?fj(Ye,!0):fj(_e.stateNode,!1)}catch(Nt){kn(_e,_e.return,Nt)}}}else if((h.tag!==22&&h.tag!==23||h.memoizedState===null||h===d)&&h.child!==null){h.child.return=h,h=h.child;continue}if(h===d)break e;for(;h.sibling===null;){if(h.return===null||h.return===d)break e;b===h&&(b=null),h=h.return}b===h&&(b=null),h.sibling.return=h.return,h=h.sibling}S&4&&(S=d.updateQueue,S!==null&&(b=S.retryQueue,b!==null&&(S.retryQueue=null,Jv(d,b))));break;case 19:Aa(h,d),Ta(d),S&4&&(S=d.updateQueue,S!==null&&(d.updateQueue=null,Jv(d,S)));break;case 30:break;case 21:break;default:Aa(h,d),Ta(d)}}function Ta(d){var h=d.flags;if(h&2){try{for(var b,S=d.return;S!==null;){if(pU(S)){b=S;break}S=S.return}if(b==null)throw Error(i(160));switch(b.tag){case 27:var R=b.stateNode,k=PE(d);Qv(d,k,R);break;case 5:var $=b.stateNode;b.flags&32&&(To($,""),b.flags&=-33);var ne=PE(d);Qv(d,ne,$);break;case 3:case 4:var _e=b.stateNode.containerInfo,Fe=PE(d);DE(d,Fe,_e);break;default:throw Error(i(161))}}catch(Je){kn(d,d.return,Je)}d.flags&=-3}h&4096&&(d.flags&=-4097)}function wU(d){if(d.subtreeFlags&1024)for(d=d.child;d!==null;){var h=d;wU(h),h.tag===5&&h.flags&1024&&h.stateNode.reset(),d=d.sibling}}function bl(d,h){if(h.subtreeFlags&8772)for(h=h.child;h!==null;)xU(d,h.alternate,h),h=h.sibling}function Td(d){for(d=d.child;d!==null;){var h=d;switch(h.tag){case 0:case 11:case 14:case 15:Hc(4,h,h.return),Td(h);break;case 1:Ro(h,h.return);var b=h.stateNode;typeof b.componentWillUnmount=="function"&&fU(h,h.return,b),Td(h);break;case 27:vg(h.stateNode);case 26:case 5:Ro(h,h.return),Td(h);break;case 22:h.memoizedState===null&&Td(h);break;case 30:Td(h);break;default:Td(h)}d=d.sibling}}function _l(d,h,b){for(b=b&&(h.subtreeFlags&8772)!==0,h=h.child;h!==null;){var S=h.alternate,R=d,k=h,$=k.flags;switch(k.tag){case 0:case 11:case 15:_l(R,k,b),lg(4,k);break;case 1:if(_l(R,k,b),S=k,R=S.stateNode,typeof R.componentDidMount=="function")try{R.componentDidMount()}catch(Fe){kn(S,S.return,Fe)}if(S=k,R=S.updateQueue,R!==null){var ne=S.stateNode;try{var _e=R.shared.hiddenCallbacks;if(_e!==null)for(R.shared.hiddenCallbacks=null,R=0;R<_e.length;R++)eI(_e[R],ne)}catch(Fe){kn(S,S.return,Fe)}}b&&$&64&&dU(k),cg(k,k.return);break;case 27:mU(k);case 26:case 5:_l(R,k,b),b&&S===null&&$&4&&hU(k),cg(k,k.return);break;case 12:_l(R,k,b);break;case 31:_l(R,k,b),b&&$&4&&bU(R,k);break;case 13:_l(R,k,b),b&&$&4&&_U(R,k);break;case 22:k.memoizedState===null&&_l(R,k,b),cg(k,k.return);break;case 30:break;default:_l(R,k,b)}h=h.sibling}}function OE(d,h){var b=null;d!==null&&d.memoizedState!==null&&d.memoizedState.cachePool!==null&&(b=d.memoizedState.cachePool.pool),d=null,h.memoizedState!==null&&h.memoizedState.cachePool!==null&&(d=h.memoizedState.cachePool.pool),d!==b&&(d!=null&&d.refCount++,b!=null&&Km(b))}function LE(d,h){d=null,h.alternate!==null&&(d=h.alternate.memoizedState.cache),h=h.memoizedState.cache,h!==d&&(h.refCount++,d!=null&&Km(d))}function no(d,h,b,S){if(h.subtreeFlags&10256)for(h=h.child;h!==null;)MU(d,h,b,S),h=h.sibling}function MU(d,h,b,S){var R=h.flags;switch(h.tag){case 0:case 11:case 15:no(d,h,b,S),R&2048&&lg(9,h);break;case 1:no(d,h,b,S);break;case 3:no(d,h,b,S),R&2048&&(d=null,h.alternate!==null&&(d=h.alternate.memoizedState.cache),h=h.memoizedState.cache,h!==d&&(h.refCount++,d!=null&&Km(d)));break;case 12:if(R&2048){no(d,h,b,S),d=h.stateNode;try{var k=h.memoizedProps,$=k.id,ne=k.onPostCommit;typeof ne=="function"&&ne($,h.alternate===null?"mount":"update",d.passiveEffectDuration,-0)}catch(_e){kn(h,h.return,_e)}}else no(d,h,b,S);break;case 31:no(d,h,b,S);break;case 13:no(d,h,b,S);break;case 23:break;case 22:k=h.stateNode,$=h.alternate,h.memoizedState!==null?k._visibility&2?no(d,h,b,S):ug(d,h):k._visibility&2?no(d,h,b,S):(k._visibility|=2,fh(d,h,b,S,(h.subtreeFlags&10256)!==0||!1)),R&2048&&OE($,h);break;case 24:no(d,h,b,S),R&2048&&LE(h.alternate,h);break;default:no(d,h,b,S)}}function fh(d,h,b,S,R){for(R=R&&((h.subtreeFlags&10256)!==0||!1),h=h.child;h!==null;){var k=d,$=h,ne=b,_e=S,Fe=$.flags;switch($.tag){case 0:case 11:case 15:fh(k,$,ne,_e,R),lg(8,$);break;case 23:break;case 22:var Je=$.stateNode;$.memoizedState!==null?Je._visibility&2?fh(k,$,ne,_e,R):ug(k,$):(Je._visibility|=2,fh(k,$,ne,_e,R)),R&&Fe&2048&&OE($.alternate,$);break;case 24:fh(k,$,ne,_e,R),R&&Fe&2048&&LE($.alternate,$);break;default:fh(k,$,ne,_e,R)}h=h.sibling}}function ug(d,h){if(h.subtreeFlags&10256)for(h=h.child;h!==null;){var b=d,S=h,R=S.flags;switch(S.tag){case 22:ug(b,S),R&2048&&OE(S.alternate,S);break;case 24:ug(b,S),R&2048&&LE(S.alternate,S);break;default:ug(b,S)}h=h.sibling}}var dg=8192;function hh(d,h,b){if(d.subtreeFlags&dg)for(d=d.child;d!==null;)EU(d,h,b),d=d.sibling}function EU(d,h,b){switch(d.tag){case 26:hh(d,h,b),d.flags&dg&&d.memoizedState!==null&&Rte(b,to,d.memoizedState,d.memoizedProps);break;case 5:hh(d,h,b);break;case 3:case 4:var S=to;to=hy(d.stateNode.containerInfo),hh(d,h,b),to=S;break;case 22:d.memoizedState===null&&(S=d.alternate,S!==null&&S.memoizedState!==null?(S=dg,dg=16777216,hh(d,h,b),dg=S):hh(d,h,b));break;default:hh(d,h,b)}}function AU(d){var h=d.alternate;if(h!==null&&(d=h.child,d!==null)){h.child=null;do h=d.sibling,d.sibling=null,d=h;while(d!==null)}}function fg(d){var h=d.deletions;if((d.flags&16)!==0){if(h!==null)for(var b=0;bjn&&($=jn,jn=Bt,Bt=$);var ke=AL(ne,Bt),Ee=AL(ne,jn);if(ke&&Ee&&(Ye.rangeCount!==1||Ye.anchorNode!==ke.node||Ye.anchorOffset!==ke.offset||Ye.focusNode!==Ee.node||Ye.focusOffset!==Ee.offset)){var je=st.createRange();je.setStart(ke.node,ke.offset),Ye.removeAllRanges(),Bt>jn?(Ye.addRange(je),Ye.extend(Ee.node,Ee.offset)):(je.setEnd(Ee.node,Ee.offset),Ye.addRange(je))}}}}for(st=[],Ye=ne;Ye=Ye.parentNode;)Ye.nodeType===1&&st.push({element:Ye,left:Ye.scrollLeft,top:Ye.scrollTop});for(typeof ne.focus=="function"&&ne.focus(),ne=0;neb?32:b,V.T=null,b=zE,zE=null;var k=Wc,$=wl;if(Ji=0,gh=Wc=null,wl=0,(Tn&6)!==0)throw Error(i(331));var ne=Tn;if(Tn|=4,TU(k.current),MU(k,k.current,$,b),Tn=ne,mg(0,!1),Re&&typeof Re.onPostCommitFiberRoot=="function")try{Re.onPostCommitFiberRoot(Ie,k)}catch{}return!0}finally{G.p=R,V.T=S,GU(d,h)}}function qU(d,h,b){h=gs(b,h),h=yE(d.stateNode,h,2),d=Fc(d,h,2),d!==null&&(on(d,2),Po(d))}function kn(d,h,b){if(d.tag===3)qU(d,d,b);else for(;h!==null;){if(h.tag===3){qU(h,d,b);break}else if(h.tag===1){var S=h.stateNode;if(typeof h.type.getDerivedStateFromError=="function"||typeof S.componentDidCatch=="function"&&(Gc===null||!Gc.has(S))){d=gs(b,d),b=XI(2),S=Fc(h,b,2),S!==null&&(KI(b,S,h,d),on(S,2),Po(S));break}}h=h.return}}function $E(d,h,b){var S=d.pingCache;if(S===null){S=d.pingCache=new Wee;var R=new Set;S.set(h,R)}else R=S.get(h),R===void 0&&(R=new Set,S.set(h,R));R.has(b)||(IE=!0,R.add(b),d=Zee.bind(null,d,h,b),h.then(d,d))}function Zee(d,h,b){var S=d.pingCache;S!==null&&S.delete(h),d.pingedLanes|=d.suspendedLanes&b,d.warmLanes&=~b,qn===d&&(gn&b)===b&&(_i===4||_i===3&&(gn&62914560)===gn&&300>O()-ty?(Tn&2)===0&&xh(d,0):UE|=b,mh===gn&&(mh=0)),Po(d)}function XU(d,h){h===0&&(h=bt()),d=gd(d,h),d!==null&&(on(d,h),Po(d))}function Qee(d){var h=d.memoizedState,b=0;h!==null&&(b=h.retryLane),XU(d,b)}function Jee(d,h){var b=0;switch(d.tag){case 31:case 13:var S=d.stateNode,R=d.memoizedState;R!==null&&(b=R.retryLane);break;case 19:S=d.stateNode;break;case 22:S=d.stateNode._retryCache;break;default:throw Error(i(314))}S!==null&&S.delete(h),XU(d,b)}function ete(d,h){return De(d,h)}var ly=null,yh=null,GE=!1,cy=!1,WE=!1,Xc=0;function Po(d){d!==yh&&d.next===null&&(yh===null?ly=yh=d:yh=yh.next=d),cy=!0,GE||(GE=!0,nte())}function mg(d,h){if(!WE&&cy){WE=!0;do for(var b=!1,S=ly;S!==null;){if(d!==0){var R=S.pendingLanes;if(R===0)var k=0;else{var $=S.suspendedLanes,ne=S.pingedLanes;k=(1<<31-nt(42|d)+1)-1,k&=R&~($&~ne),k=k&201326741?k&201326741|1:k?k|2:0}k!==0&&(b=!0,QU(S,k))}else k=gn,k=ge(S,S===qn?k:0,S.cancelPendingCommit!==null||S.timeoutHandle!==-1),(k&3)===0||Be(S,k)||(b=!0,QU(S,k));S=S.next}while(b);WE=!1}}function tte(){KU()}function KU(){cy=GE=!1;var d=0;Xc!==0&&fte()&&(d=Xc);for(var h=O(),b=null,S=ly;S!==null;){var R=S.next,k=YU(S,h);k===0?(S.next=null,b===null?ly=R:b.next=R,R===null&&(yh=b)):(b=S,(d!==0||(k&3)!==0)&&(cy=!0)),S=R}Ji!==0&&Ji!==5||mg(d),Xc!==0&&(Xc=0)}function YU(d,h){for(var b=d.suspendedLanes,S=d.pingedLanes,R=d.expirationTimes,k=d.pendingLanes&-62914561;0ne)break;var Je=_e.transferSize,st=_e.initiatorType;Je&&sj(st)&&(_e=_e.responseEnd,$+=Je*(_e"u"?null:document;function vj(d,h,b){var S=bh;if(S&&typeof h=="string"&&h){var R=Cn(h);R='link[rel="'+d+'"][href="'+R+'"]',typeof b=="string"&&(R+='[crossorigin="'+b+'"]'),xj.has(R)||(xj.add(R),d={rel:d,crossOrigin:b,href:h},S.querySelector(R)===null&&(h=S.createElement("link"),Lr(h,"link",d),Te(h),S.head.appendChild(h)))}}function _te(d){Ml.D(d),vj("dns-prefetch",d,null)}function Ste(d,h){Ml.C(d,h),vj("preconnect",d,h)}function wte(d,h,b){Ml.L(d,h,b);var S=bh;if(S&&d&&h){var R='link[rel="preload"][as="'+Cn(h)+'"]';h==="image"&&b&&b.imageSrcSet?(R+='[imagesrcset="'+Cn(b.imageSrcSet)+'"]',typeof b.imageSizes=="string"&&(R+='[imagesizes="'+Cn(b.imageSizes)+'"]')):R+='[href="'+Cn(d)+'"]';var k=R;switch(h){case"style":k=_h(d);break;case"script":k=Sh(d)}Ss.has(k)||(d=f({rel:"preload",href:h==="image"&&b&&b.imageSrcSet?void 0:d,as:h},b),Ss.set(k,d),S.querySelector(R)!==null||h==="style"&&S.querySelector(yg(k))||h==="script"&&S.querySelector(bg(k))||(h=S.createElement("link"),Lr(h,"link",d),Te(h),S.head.appendChild(h)))}}function Mte(d,h){Ml.m(d,h);var b=bh;if(b&&d){var S=h&&typeof h.as=="string"?h.as:"script",R='link[rel="modulepreload"][as="'+Cn(S)+'"][href="'+Cn(d)+'"]',k=R;switch(S){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":k=Sh(d)}if(!Ss.has(k)&&(d=f({rel:"modulepreload",href:d},h),Ss.set(k,d),b.querySelector(R)===null)){switch(S){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(b.querySelector(bg(k)))return}S=b.createElement("link"),Lr(S,"link",d),Te(S),b.head.appendChild(S)}}}function Ete(d,h,b){Ml.S(d,h,b);var S=bh;if(S&&d){var R=Ce(S).hoistableStyles,k=_h(d);h=h||"default";var $=R.get(k);if(!$){var ne={loading:0,preload:null};if($=S.querySelector(yg(k)))ne.loading=5;else{d=f({rel:"stylesheet",href:d,"data-precedence":h},b),(b=Ss.get(k))&&lA(d,b);var _e=$=S.createElement("link");Te(_e),Lr(_e,"link",d),_e._p=new Promise(function(Fe,Je){_e.onload=Fe,_e.onerror=Je}),_e.addEventListener("load",function(){ne.loading|=1}),_e.addEventListener("error",function(){ne.loading|=2}),ne.loading|=4,py($,h,S)}$={type:"stylesheet",instance:$,count:1,state:ne},R.set(k,$)}}}function Ate(d,h){Ml.X(d,h);var b=bh;if(b&&d){var S=Ce(b).hoistableScripts,R=Sh(d),k=S.get(R);k||(k=b.querySelector(bg(R)),k||(d=f({src:d,async:!0},h),(h=Ss.get(R))&&cA(d,h),k=b.createElement("script"),Te(k),Lr(k,"link",d),b.head.appendChild(k)),k={type:"script",instance:k,count:1,state:null},S.set(R,k))}}function Tte(d,h){Ml.M(d,h);var b=bh;if(b&&d){var S=Ce(b).hoistableScripts,R=Sh(d),k=S.get(R);k||(k=b.querySelector(bg(R)),k||(d=f({src:d,async:!0,type:"module"},h),(h=Ss.get(R))&&cA(d,h),k=b.createElement("script"),Te(k),Lr(k,"link",d),b.head.appendChild(k)),k={type:"script",instance:k,count:1,state:null},S.set(R,k))}}function yj(d,h,b,S){var R=(R=ie.current)?hy(R):null;if(!R)throw Error(i(446));switch(d){case"meta":case"title":return null;case"style":return typeof b.precedence=="string"&&typeof b.href=="string"?(h=_h(b.href),b=Ce(R).hoistableStyles,S=b.get(h),S||(S={type:"style",instance:null,count:0,state:null},b.set(h,S)),S):{type:"void",instance:null,count:0,state:null};case"link":if(b.rel==="stylesheet"&&typeof b.href=="string"&&typeof b.precedence=="string"){d=_h(b.href);var k=Ce(R).hoistableStyles,$=k.get(d);if($||(R=R.ownerDocument||R,$={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},k.set(d,$),(k=R.querySelector(yg(d)))&&!k._p&&($.instance=k,$.state.loading=5),Ss.has(d)||(b={rel:"preload",as:"style",href:b.href,crossOrigin:b.crossOrigin,integrity:b.integrity,media:b.media,hrefLang:b.hrefLang,referrerPolicy:b.referrerPolicy},Ss.set(d,b),k||Cte(R,d,b,$.state))),h&&S===null)throw Error(i(528,""));return $}if(h&&S!==null)throw Error(i(529,""));return null;case"script":return h=b.async,b=b.src,typeof b=="string"&&h&&typeof h!="function"&&typeof h!="symbol"?(h=Sh(b),b=Ce(R).hoistableScripts,S=b.get(h),S||(S={type:"script",instance:null,count:0,state:null},b.set(h,S)),S):{type:"void",instance:null,count:0,state:null};default:throw Error(i(444,d))}}function _h(d){return'href="'+Cn(d)+'"'}function yg(d){return'link[rel="stylesheet"]['+d+"]"}function bj(d){return f({},d,{"data-precedence":d.precedence,precedence:null})}function Cte(d,h,b,S){d.querySelector('link[rel="preload"][as="style"]['+h+"]")?S.loading=1:(h=d.createElement("link"),S.preload=h,h.addEventListener("load",function(){return S.loading|=1}),h.addEventListener("error",function(){return S.loading|=2}),Lr(h,"link",b),Te(h),d.head.appendChild(h))}function Sh(d){return'[src="'+Cn(d)+'"]'}function bg(d){return"script[async]"+d}function _j(d,h,b){if(h.count++,h.instance===null)switch(h.type){case"style":var S=d.querySelector('style[data-href~="'+Cn(b.href)+'"]');if(S)return h.instance=S,Te(S),S;var R=f({},b,{"data-href":b.href,"data-precedence":b.precedence,href:null,precedence:null});return S=(d.ownerDocument||d).createElement("style"),Te(S),Lr(S,"style",R),py(S,b.precedence,d),h.instance=S;case"stylesheet":R=_h(b.href);var k=d.querySelector(yg(R));if(k)return h.state.loading|=4,h.instance=k,Te(k),k;S=bj(b),(R=Ss.get(R))&&lA(S,R),k=(d.ownerDocument||d).createElement("link"),Te(k);var $=k;return $._p=new Promise(function(ne,_e){$.onload=ne,$.onerror=_e}),Lr(k,"link",S),h.state.loading|=4,py(k,b.precedence,d),h.instance=k;case"script":return k=Sh(b.src),(R=d.querySelector(bg(k)))?(h.instance=R,Te(R),R):(S=b,(R=Ss.get(k))&&(S=f({},b),cA(S,R)),d=d.ownerDocument||d,R=d.createElement("script"),Te(R),Lr(R,"link",S),d.head.appendChild(R),h.instance=R);case"void":return null;default:throw Error(i(443,h.type))}else h.type==="stylesheet"&&(h.state.loading&4)===0&&(S=h.instance,h.state.loading|=4,py(S,b.precedence,d));return h.instance}function py(d,h,b){for(var S=b.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),R=S.length?S[S.length-1]:null,k=R,$=0;$ title"):null)}function Nte(d,h,b){if(b===1||h.itemProp!=null)return!1;switch(d){case"meta":case"title":return!0;case"style":if(typeof h.precedence!="string"||typeof h.href!="string"||h.href==="")break;return!0;case"link":if(typeof h.rel!="string"||typeof h.href!="string"||h.href===""||h.onLoad||h.onError)break;switch(h.rel){case"stylesheet":return d=h.disabled,typeof h.precedence=="string"&&d==null;default:return!0}case"script":if(h.async&&typeof h.async!="function"&&typeof h.async!="symbol"&&!h.onLoad&&!h.onError&&h.src&&typeof h.src=="string")return!0}return!1}function Mj(d){return!(d.type==="stylesheet"&&(d.state.loading&3)===0)}function Rte(d,h,b,S){if(b.type==="stylesheet"&&(typeof S.media!="string"||matchMedia(S.media).matches!==!1)&&(b.state.loading&4)===0){if(b.instance===null){var R=_h(S.href),k=h.querySelector(yg(R));if(k){h=k._p,h!==null&&typeof h=="object"&&typeof h.then=="function"&&(d.count++,d=gy.bind(d),h.then(d,d)),b.state.loading|=4,b.instance=k,Te(k);return}k=h.ownerDocument||h,S=bj(S),(R=Ss.get(R))&&lA(S,R),k=k.createElement("link"),Te(k);var $=k;$._p=new Promise(function(ne,_e){$.onload=ne,$.onerror=_e}),Lr(k,"link",S),b.instance=k}d.stylesheets===null&&(d.stylesheets=new Map),d.stylesheets.set(b,h),(h=b.state.preload)&&(b.state.loading&3)===0&&(d.count++,b=gy.bind(d),h.addEventListener("load",b),h.addEventListener("error",b))}}var uA=0;function Pte(d,h){return d.stylesheets&&d.count===0&&vy(d,d.stylesheets),0uA?50:800)+h);return d.unsuspend=b,function(){d.unsuspend=null,clearTimeout(S),clearTimeout(R)}}:null}function gy(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)vy(this,this.stylesheets);else if(this.unsuspend){var d=this.unsuspend;this.unsuspend=null,d()}}}var xy=null;function vy(d,h){d.stylesheets=null,d.unsuspend!==null&&(d.count++,xy=new Map,h.forEach(Dte,d),xy=null,gy.call(d))}function Dte(d,h){if(!(h.state.loading&4)){var b=xy.get(d);if(b)var S=b.get(null);else{b=new Map,xy.set(d,b);for(var R=d.querySelectorAll("link[data-precedence],style[data-precedence]"),k=0;k"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),yA.exports=Kte(),yA.exports}var Zte=Yte();const Vt=t=>typeof t=="string",Tg=()=>{let t,e;const n=new Promise((i,r)=>{t=i,e=r});return n.resolve=t,n.reject=e,n},Xj=t=>t==null?"":""+t,Qte=(t,e,n)=>{t.forEach(i=>{e[i]&&(n[i]=e[i])})},Jte=/###/g,Kj=t=>t&&t.indexOf("###")>-1?t.replace(Jte,"."):t,Yj=t=>!t||Vt(t),u0=(t,e,n)=>{const i=Vt(e)?e.split("."):e;let r=0;for(;r{const{obj:i,k:r}=u0(t,e,Object);if(i!==void 0||e.length===1){i[r]=n;return}let a=e[e.length-1],s=e.slice(0,e.length-1),o=u0(t,s,Object);for(;o.obj===void 0&&s.length;)a=`${s[s.length-1]}.${a}`,s=s.slice(0,s.length-1),o=u0(t,s,Object),o?.obj&&typeof o.obj[`${o.k}.${a}`]<"u"&&(o.obj=void 0);o.obj[`${o.k}.${a}`]=n},ene=(t,e,n,i)=>{const{obj:r,k:a}=u0(t,e,Object);r[a]=r[a]||[],r[a].push(n)},R_=(t,e)=>{const{obj:n,k:i}=u0(t,e);if(n&&Object.prototype.hasOwnProperty.call(n,i))return n[i]},tne=(t,e,n)=>{const i=R_(t,n);return i!==void 0?i:R_(e,n)},iG=(t,e,n)=>{for(const i in e)i!=="__proto__"&&i!=="constructor"&&(i in t?Vt(t[i])||t[i]instanceof String||Vt(e[i])||e[i]instanceof String?n&&(t[i]=e[i]):iG(t[i],e[i],n):t[i]=e[i]);return t},Mh=t=>t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var nne={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const ine=t=>Vt(t)?t.replace(/[&<>"'\/]/g,e=>nne[e]):t;class rne{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){const n=this.regExpMap.get(e);if(n!==void 0)return n;const i=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,i),this.regExpQueue.push(e),i}}const ane=[" ",",","?","!",";"],sne=new rne(20),one=(t,e,n)=>{e=e||"",n=n||"";const i=ane.filter(s=>e.indexOf(s)<0&&n.indexOf(s)<0);if(i.length===0)return!0;const r=sne.getRegExp(`(${i.map(s=>s==="?"?"\\?":s).join("|")})`);let a=!r.test(t);if(!a){const s=t.indexOf(n);s>0&&!r.test(t.substring(0,s))&&(a=!0)}return a},cN=(t,e,n=".")=>{if(!t)return;if(t[e])return Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0;const i=e.split(n);let r=t;for(let a=0;a-1&&lt?.replace("_","-"),lne={type:"logger",log(t){this.output("log",t)},warn(t){this.output("warn",t)},error(t){this.output("error",t)},output(t,e){console?.[t]?.apply?.(console,e)}};class P_{constructor(e,n={}){this.init(e,n)}init(e,n={}){this.prefix=n.prefix||"i18next:",this.logger=e||lne,this.options=n,this.debug=n.debug}log(...e){return this.forward(e,"log","",!0)}warn(...e){return this.forward(e,"warn","",!0)}error(...e){return this.forward(e,"error","")}deprecate(...e){return this.forward(e,"warn","WARNING DEPRECATED: ",!0)}forward(e,n,i,r){return r&&!this.debug?null:(Vt(e[0])&&(e[0]=`${i}${this.prefix} ${e[0]}`),this.logger[n](e))}create(e){return new P_(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return e=e||this.options,e.prefix=e.prefix||this.prefix,new P_(this.logger,e)}}var Ho=new P_;let zS=class{constructor(){this.observers={}}on(e,n){return e.split(" ").forEach(i=>{this.observers[i]||(this.observers[i]=new Map);const r=this.observers[i].get(n)||0;this.observers[i].set(n,r+1)}),this}off(e,n){if(this.observers[e]){if(!n){delete this.observers[e];return}this.observers[e].delete(n)}}emit(e,...n){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([r,a])=>{for(let s=0;s{for(let s=0;s-1&&this.options.ns.splice(n,1)}getResource(e,n,i,r={}){const a=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator,s=r.ignoreJSONStructure!==void 0?r.ignoreJSONStructure:this.options.ignoreJSONStructure;let o;e.indexOf(".")>-1?o=e.split("."):(o=[e,n],i&&(Array.isArray(i)?o.push(...i):Vt(i)&&a?o.push(...i.split(a)):o.push(i)));const l=R_(this.data,o);return!l&&!n&&!i&&e.indexOf(".")>-1&&(e=o[0],n=o[1],i=o.slice(2).join(".")),l||!s||!Vt(i)?l:cN(this.data?.[e]?.[n],i,a)}addResource(e,n,i,r,a={silent:!1}){const s=a.keySeparator!==void 0?a.keySeparator:this.options.keySeparator;let o=[e,n];i&&(o=o.concat(s?i.split(s):i)),e.indexOf(".")>-1&&(o=e.split("."),r=n,n=o[1]),this.addNamespaces(n),Zj(this.data,o,r),a.silent||this.emit("added",e,n,i,r)}addResources(e,n,i,r={silent:!1}){for(const a in i)(Vt(i[a])||Array.isArray(i[a]))&&this.addResource(e,n,a,i[a],{silent:!0});r.silent||this.emit("added",e,n,i)}addResourceBundle(e,n,i,r,a,s={silent:!1,skipCopy:!1}){let o=[e,n];e.indexOf(".")>-1&&(o=e.split("."),r=i,i=n,n=o[1]),this.addNamespaces(n);let l=R_(this.data,o)||{};s.skipCopy||(i=JSON.parse(JSON.stringify(i))),r?iG(l,i,a):l={...l,...i},Zj(this.data,o,l),s.silent||this.emit("added",e,n,i)}removeResourceBundle(e,n){this.hasResourceBundle(e,n)&&delete this.data[e][n],this.removeNamespaces(n),this.emit("removed",e,n)}hasResourceBundle(e,n){return this.getResource(e,n)!==void 0}getResourceBundle(e,n){return n||(n=this.options.defaultNS),this.getResource(e,n)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){const n=this.getDataByLanguage(e);return!!(n&&Object.keys(n)||[]).find(r=>n[r]&&Object.keys(n[r]).length>0)}toJSON(){return this.data}}var rG={processors:{},addPostProcessor(t){this.processors[t.name]=t},handle(t,e,n,i,r){return t.forEach(a=>{e=this.processors[a]?.process(e,n,i,r)??e}),e}};const aG=Symbol("i18next/PATH_KEY");function cne(){const t=[],e=Object.create(null);let n;return e.get=(i,r)=>(n?.revoke?.(),r===aG?t:(t.push(r),n=Proxy.revocable(i,e),n.proxy)),Proxy.revocable(Object.create(null),e).proxy}function uN(t,e){const{[aG]:n}=t(cne());return n.join(e?.keySeparator??".")}const Jj={},wA=t=>!Vt(t)&&typeof t!="boolean"&&typeof t!="number";class D_ extends zS{constructor(e,n={}){super(),Qte(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,this),this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=Ho.create("translator")}changeLanguage(e){e&&(this.language=e)}exists(e,n={interpolation:{}}){const i={...n};if(e==null)return!1;const r=this.resolve(e,i);if(r?.res===void 0)return!1;const a=wA(r.res);return!(i.returnObjects===!1&&a)}extractFromKey(e,n){let i=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;i===void 0&&(i=":");const r=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator;let a=n.ns||this.options.defaultNS||[];const s=i&&e.indexOf(i)>-1,o=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!one(e,i,r);if(s&&!o){const l=e.match(this.interpolator.nestingRegexp);if(l&&l.length>0)return{key:e,namespaces:Vt(a)?[a]:a};const c=e.split(i);(i!==r||i===r&&this.options.ns.indexOf(c[0])>-1)&&(a=c.shift()),e=c.join(r)}return{key:e,namespaces:Vt(a)?[a]:a}}translate(e,n,i){let r=typeof n=="object"?{...n}:n;if(typeof r!="object"&&this.options.overloadTranslationOptionHandler&&(r=this.options.overloadTranslationOptionHandler(arguments)),typeof r=="object"&&(r={...r}),r||(r={}),e==null)return"";typeof e=="function"&&(e=uN(e,{...this.options,...r})),Array.isArray(e)||(e=[String(e)]);const a=r.returnDetails!==void 0?r.returnDetails:this.options.returnDetails,s=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator,{key:o,namespaces:l}=this.extractFromKey(e[e.length-1],r),c=l[l.length-1];let u=r.nsSeparator!==void 0?r.nsSeparator:this.options.nsSeparator;u===void 0&&(u=":");const f=r.lng||this.language,p=r.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(f?.toLowerCase()==="cimode")return p?a?{res:`${c}${u}${o}`,usedKey:o,exactUsedKey:o,usedLng:f,usedNS:c,usedParams:this.getUsedParamsDetails(r)}:`${c}${u}${o}`:a?{res:o,usedKey:o,exactUsedKey:o,usedLng:f,usedNS:c,usedParams:this.getUsedParamsDetails(r)}:o;const g=this.resolve(e,r);let y=g?.res;const _=g?.usedKey||o,v=g?.exactUsedKey||o,x=["[object Number]","[object Function]","[object RegExp]"],M=r.joinArrays!==void 0?r.joinArrays:this.options.joinArrays,w=!this.i18nFormat||this.i18nFormat.handleAsObject,E=r.count!==void 0&&!Vt(r.count),T=D_.hasDefaultValue(r),P=E?this.pluralResolver.getSuffix(f,r.count,r):"",N=r.ordinal&&E?this.pluralResolver.getSuffix(f,r.count,{ordinal:!1}):"",U=E&&!r.ordinal&&r.count===0,C=U&&r[`defaultValue${this.options.pluralSeparator}zero`]||r[`defaultValue${P}`]||r[`defaultValue${N}`]||r.defaultValue;let D=y;w&&!y&&T&&(D=C);const F=wA(D),I=Object.prototype.toString.apply(D);if(w&&D&&F&&x.indexOf(I)<0&&!(Vt(M)&&Array.isArray(D))){if(!r.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const q=this.options.returnedObjectHandler?this.options.returnedObjectHandler(_,D,{...r,ns:l}):`key '${o} (${this.language})' returned an object instead of string.`;return a?(g.res=q,g.usedParams=this.getUsedParamsDetails(r),g):q}if(s){const q=Array.isArray(D),L=q?[]:{},H=q?v:_;for(const V in D)if(Object.prototype.hasOwnProperty.call(D,V)){const G=`${H}${s}${V}`;T&&!y?L[V]=this.translate(G,{...r,defaultValue:wA(C)?C[V]:void 0,joinArrays:!1,ns:l}):L[V]=this.translate(G,{...r,joinArrays:!1,ns:l}),L[V]===G&&(L[V]=D[V])}y=L}}else if(w&&Vt(M)&&Array.isArray(y))y=y.join(M),y&&(y=this.extendTranslation(y,e,r,i));else{let q=!1,L=!1;!this.isValidLookup(y)&&T&&(q=!0,y=C),this.isValidLookup(y)||(L=!0,y=o);const V=(r.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&L?void 0:y,G=T&&C!==y&&this.options.updateMissing;if(L||q||G){if(this.logger.log(G?"updateKey":"missingKey",f,c,o,G?C:y),s){const B=this.resolve(o,{...r,keySeparator:!1});B&&B.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let K=[];const Z=this.languageUtils.getFallbackCodes(this.options.fallbackLng,r.lng||this.language);if(this.options.saveMissingTo==="fallback"&&Z&&Z[0])for(let B=0;B{const ce=T&&ae!==y?ae:V;this.options.missingKeyHandler?this.options.missingKeyHandler(B,c,X,ce,G,r):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(B,c,X,ce,G,r),this.emit("missingKey",B,c,X,y)};this.options.saveMissing&&(this.options.saveMissingPlurals&&E?K.forEach(B=>{const X=this.pluralResolver.getSuffixes(B,r);U&&r[`defaultValue${this.options.pluralSeparator}zero`]&&X.indexOf(`${this.options.pluralSeparator}zero`)<0&&X.push(`${this.options.pluralSeparator}zero`),X.forEach(ae=>{se([B],o+ae,r[`defaultValue${ae}`]||C)})}):se(K,o,C))}y=this.extendTranslation(y,e,r,g,i),L&&y===o&&this.options.appendNamespaceToMissingKey&&(y=`${c}${u}${o}`),(L||q)&&this.options.parseMissingKeyHandler&&(y=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${c}${u}${o}`:o,q?y:void 0,r))}return a?(g.res=y,g.usedParams=this.getUsedParamsDetails(r),g):y}extendTranslation(e,n,i,r,a){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...i},i.lng||this.language||r.usedLng,r.usedNS,r.usedKey,{resolved:r});else if(!i.skipInterpolation){i.interpolation&&this.interpolator.init({...i,interpolation:{...this.options.interpolation,...i.interpolation}});const l=Vt(e)&&(i?.interpolation?.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let c;if(l){const f=e.match(this.interpolator.nestingRegexp);c=f&&f.length}let u=i.replace&&!Vt(i.replace)?i.replace:i;if(this.options.interpolation.defaultVariables&&(u={...this.options.interpolation.defaultVariables,...u}),e=this.interpolator.interpolate(e,u,i.lng||this.language||r.usedLng,i),l){const f=e.match(this.interpolator.nestingRegexp),p=f&&f.length;ca?.[0]===f[0]&&!i.context?(this.logger.warn(`It seems you are nesting recursively key: ${f[0]} in key: ${n[0]}`),null):this.translate(...f,n),i)),i.interpolation&&this.interpolator.reset()}const s=i.postProcess||this.options.postProcess,o=Vt(s)?[s]:s;return e!=null&&o?.length&&i.applyPostProcessor!==!1&&(e=rG.handle(o,e,n,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...r,usedParams:this.getUsedParamsDetails(i)},...i}:i,this)),e}resolve(e,n={}){let i,r,a,s,o;return Vt(e)&&(e=[e]),e.forEach(l=>{if(this.isValidLookup(i))return;const c=this.extractFromKey(l,n),u=c.key;r=u;let f=c.namespaces;this.options.fallbackNS&&(f=f.concat(this.options.fallbackNS));const p=n.count!==void 0&&!Vt(n.count),g=p&&!n.ordinal&&n.count===0,y=n.context!==void 0&&(Vt(n.context)||typeof n.context=="number")&&n.context!=="",_=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);f.forEach(v=>{this.isValidLookup(i)||(o=v,!Jj[`${_[0]}-${v}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(o)&&(Jj[`${_[0]}-${v}`]=!0,this.logger.warn(`key "${r}" for languages "${_.join(", ")}" won't get resolved as namespace "${o}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),_.forEach(x=>{if(this.isValidLookup(i))return;s=x;const M=[u];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(M,u,x,v,n);else{let E;p&&(E=this.pluralResolver.getSuffix(x,n.count,n));const T=`${this.options.pluralSeparator}zero`,P=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(p&&(n.ordinal&&E.indexOf(P)===0&&M.push(u+E.replace(P,this.options.pluralSeparator)),M.push(u+E),g&&M.push(u+T)),y){const N=`${u}${this.options.contextSeparator||"_"}${n.context}`;M.push(N),p&&(n.ordinal&&E.indexOf(P)===0&&M.push(N+E.replace(P,this.options.pluralSeparator)),M.push(N+E),g&&M.push(N+T))}}let w;for(;w=M.pop();)this.isValidLookup(i)||(a=w,i=this.getResource(x,v,w,n))}))})}),{res:i,usedKey:r,exactUsedKey:a,usedLng:s,usedNS:o}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e==="")}getResource(e,n,i,r={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,n,i,r):this.resourceStore.getResource(e,n,i,r)}getUsedParamsDetails(e={}){const n=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],i=e.replace&&!Vt(e.replace);let r=i?e.replace:e;if(i&&typeof e.count<"u"&&(r.count=e.count),this.options.interpolation.defaultVariables&&(r={...this.options.interpolation.defaultVariables,...r}),!i){r={...r};for(const a of n)delete r[a]}return r}static hasDefaultValue(e){const n="defaultValue";for(const i in e)if(Object.prototype.hasOwnProperty.call(e,i)&&n===i.substring(0,n.length)&&e[i]!==void 0)return!0;return!1}}class e4{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=Ho.create("languageUtils")}getScriptPartFromCode(e){if(e=O0(e),!e||e.indexOf("-")<0)return null;const n=e.split("-");return n.length===2||(n.pop(),n[n.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(n.join("-"))}getLanguagePartFromCode(e){if(e=O0(e),!e||e.indexOf("-")<0)return e;const n=e.split("-");return this.formatLanguageCode(n[0])}formatLanguageCode(e){if(Vt(e)&&e.indexOf("-")>-1){let n;try{n=Intl.getCanonicalLocales(e)[0]}catch{}return n&&this.options.lowerCaseLng&&(n=n.toLowerCase()),n||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}getBestMatchFromCodes(e){if(!e)return null;let n;return e.forEach(i=>{if(n)return;const r=this.formatLanguageCode(i);(!this.options.supportedLngs||this.isSupportedCode(r))&&(n=r)}),!n&&this.options.supportedLngs&&e.forEach(i=>{if(n)return;const r=this.getScriptPartFromCode(i);if(this.isSupportedCode(r))return n=r;const a=this.getLanguagePartFromCode(i);if(this.isSupportedCode(a))return n=a;n=this.options.supportedLngs.find(s=>{if(s===a)return s;if(!(s.indexOf("-")<0&&a.indexOf("-")<0)&&(s.indexOf("-")>0&&a.indexOf("-")<0&&s.substring(0,s.indexOf("-"))===a||s.indexOf(a)===0&&a.length>1))return s})}),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n}getFallbackCodes(e,n){if(!e)return[];if(typeof e=="function"&&(e=e(n)),Vt(e)&&(e=[e]),Array.isArray(e))return e;if(!n)return e.default||[];let i=e[n];return i||(i=e[this.getScriptPartFromCode(n)]),i||(i=e[this.formatLanguageCode(n)]),i||(i=e[this.getLanguagePartFromCode(n)]),i||(i=e.default),i||[]}toResolveHierarchy(e,n){const i=this.getFallbackCodes((n===!1?[]:n)||this.options.fallbackLng||[],e),r=[],a=s=>{s&&(this.isSupportedCode(s)?r.push(s):this.logger.warn(`rejecting language code not found in supportedLngs: ${s}`))};return Vt(e)&&(e.indexOf("-")>-1||e.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&a(this.formatLanguageCode(e)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&a(this.getScriptPartFromCode(e)),this.options.load!=="currentOnly"&&a(this.getLanguagePartFromCode(e))):Vt(e)&&a(this.formatLanguageCode(e)),i.forEach(s=>{r.indexOf(s)<0&&a(this.formatLanguageCode(s))}),r}}const t4={zero:0,one:1,two:2,few:3,many:4,other:5},n4={select:t=>t===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class une{constructor(e,n={}){this.languageUtils=e,this.options=n,this.logger=Ho.create("pluralResolver"),this.pluralRulesCache={}}addRule(e,n){this.rules[e]=n}clearCache(){this.pluralRulesCache={}}getRule(e,n={}){const i=O0(e==="dev"?"en":e),r=n.ordinal?"ordinal":"cardinal",a=JSON.stringify({cleanedCode:i,type:r});if(a in this.pluralRulesCache)return this.pluralRulesCache[a];let s;try{s=new Intl.PluralRules(i,{type:r})}catch{if(!Intl)return this.logger.error("No Intl support, please use an Intl polyfill!"),n4;if(!e.match(/-|_/))return n4;const l=this.languageUtils.getLanguagePartFromCode(e);s=this.getRule(l,n)}return this.pluralRulesCache[a]=s,s}needsPlural(e,n={}){let i=this.getRule(e,n);return i||(i=this.getRule("dev",n)),i?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,n,i={}){return this.getSuffixes(e,i).map(r=>`${n}${r}`)}getSuffixes(e,n={}){let i=this.getRule(e,n);return i||(i=this.getRule("dev",n)),i?i.resolvedOptions().pluralCategories.sort((r,a)=>t4[r]-t4[a]).map(r=>`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${r}`):[]}getSuffix(e,n,i={}){const r=this.getRule(e,i);return r?`${this.options.prepend}${i.ordinal?`ordinal${this.options.prepend}`:""}${r.select(n)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix("dev",n,i))}}const i4=(t,e,n,i=".",r=!0)=>{let a=tne(t,e,n);return!a&&r&&Vt(n)&&(a=cN(t,n,i),a===void 0&&(a=cN(e,n,i))),a},MA=t=>t.replace(/\$/g,"$$$$");class dne{constructor(e={}){this.logger=Ho.create("interpolator"),this.options=e,this.format=e?.interpolation?.format||(n=>n),this.init(e)}init(e={}){e.interpolation||(e.interpolation={escapeValue:!0});const{escape:n,escapeValue:i,useRawValueToEscape:r,prefix:a,prefixEscaped:s,suffix:o,suffixEscaped:l,formatSeparator:c,unescapeSuffix:u,unescapePrefix:f,nestingPrefix:p,nestingPrefixEscaped:g,nestingSuffix:y,nestingSuffixEscaped:_,nestingOptionsSeparator:v,maxReplaces:x,alwaysFormat:M}=e.interpolation;this.escape=n!==void 0?n:ine,this.escapeValue=i!==void 0?i:!0,this.useRawValueToEscape=r!==void 0?r:!1,this.prefix=a?Mh(a):s||"{{",this.suffix=o?Mh(o):l||"}}",this.formatSeparator=c||",",this.unescapePrefix=u?"":f||"-",this.unescapeSuffix=this.unescapePrefix?"":u||"",this.nestingPrefix=p?Mh(p):g||Mh("$t("),this.nestingSuffix=y?Mh(y):_||Mh(")"),this.nestingOptionsSeparator=v||",",this.maxReplaces=x||1e3,this.alwaysFormat=M!==void 0?M:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const e=(n,i)=>n?.source===i?(n.lastIndex=0,n):new RegExp(i,"g");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,n,i,r){let a,s,o;const l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},c=g=>{if(g.indexOf(this.formatSeparator)<0){const x=i4(n,l,g,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(x,void 0,i,{...r,...n,interpolationkey:g}):x}const y=g.split(this.formatSeparator),_=y.shift().trim(),v=y.join(this.formatSeparator).trim();return this.format(i4(n,l,_,this.options.keySeparator,this.options.ignoreJSONStructure),v,i,{...r,...n,interpolationkey:_})};this.resetRegExp();const u=r?.missingInterpolationHandler||this.options.missingInterpolationHandler,f=r?.interpolation?.skipOnVariables!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:g=>MA(g)},{regex:this.regexp,safeValue:g=>this.escapeValue?MA(this.escape(g)):MA(g)}].forEach(g=>{for(o=0;a=g.regex.exec(e);){const y=a[1].trim();if(s=c(y),s===void 0)if(typeof u=="function"){const v=u(e,a,r);s=Vt(v)?v:""}else if(r&&Object.prototype.hasOwnProperty.call(r,y))s="";else if(f){s=a[0];continue}else this.logger.warn(`missed to pass in variable ${y} for interpolating ${e}`),s="";else!Vt(s)&&!this.useRawValueToEscape&&(s=Xj(s));const _=g.safeValue(s);if(e=e.replace(a[0],_),f?(g.regex.lastIndex+=s.length,g.regex.lastIndex-=a[0].length):g.regex.lastIndex=0,o++,o>=this.maxReplaces)break}}),e}nest(e,n,i={}){let r,a,s;const o=(l,c)=>{const u=this.nestingOptionsSeparator;if(l.indexOf(u)<0)return l;const f=l.split(new RegExp(`${u}[ ]*{`));let p=`{${f[1]}`;l=f[0],p=this.interpolate(p,s);const g=p.match(/'/g),y=p.match(/"/g);((g?.length??0)%2===0&&!y||y.length%2!==0)&&(p=p.replace(/'/g,'"'));try{s=JSON.parse(p),c&&(s={...c,...s})}catch(_){return this.logger.warn(`failed parsing options string in nesting for key ${l}`,_),`${l}${u}${p}`}return s.defaultValue&&s.defaultValue.indexOf(this.prefix)>-1&&delete s.defaultValue,l};for(;r=this.nestingRegexp.exec(e);){let l=[];s={...i},s=s.replace&&!Vt(s.replace)?s.replace:s,s.applyPostProcessor=!1,delete s.defaultValue;const c=/{.*}/.test(r[1])?r[1].lastIndexOf("}")+1:r[1].indexOf(this.formatSeparator);if(c!==-1&&(l=r[1].slice(c).split(this.formatSeparator).map(u=>u.trim()).filter(Boolean),r[1]=r[1].slice(0,c)),a=n(o.call(this,r[1].trim(),s),s),a&&r[0]===e&&!Vt(a))return a;Vt(a)||(a=Xj(a)),a||(this.logger.warn(`missed to resolve ${r[1]} for nesting ${e}`),a=""),l.length&&(a=l.reduce((u,f)=>this.format(u,f,i.lng,{...i,interpolationkey:r[1].trim()}),a.trim())),e=e.replace(r[0],a),this.regexp.lastIndex=0}return e}}const fne=t=>{let e=t.toLowerCase().trim();const n={};if(t.indexOf("(")>-1){const i=t.split("(");e=i[0].toLowerCase().trim();const r=i[1].substring(0,i[1].length-1);e==="currency"&&r.indexOf(":")<0?n.currency||(n.currency=r.trim()):e==="relativetime"&&r.indexOf(":")<0?n.range||(n.range=r.trim()):r.split(";").forEach(s=>{if(s){const[o,...l]=s.split(":"),c=l.join(":").trim().replace(/^'+|'+$/g,""),u=o.trim();n[u]||(n[u]=c),c==="false"&&(n[u]=!1),c==="true"&&(n[u]=!0),isNaN(c)||(n[u]=parseInt(c,10))}})}return{formatName:e,formatOptions:n}},r4=t=>{const e={};return(n,i,r)=>{let a=r;r&&r.interpolationkey&&r.formatParams&&r.formatParams[r.interpolationkey]&&r[r.interpolationkey]&&(a={...a,[r.interpolationkey]:void 0});const s=i+JSON.stringify(a);let o=e[s];return o||(o=t(O0(i),r),e[s]=o),o(n)}},hne=t=>(e,n,i)=>t(O0(n),i)(e);class pne{constructor(e={}){this.logger=Ho.create("formatter"),this.options=e,this.init(e)}init(e,n={interpolation:{}}){this.formatSeparator=n.interpolation.formatSeparator||",";const i=n.cacheInBuiltFormats?r4:hne;this.formats={number:i((r,a)=>{const s=new Intl.NumberFormat(r,{...a});return o=>s.format(o)}),currency:i((r,a)=>{const s=new Intl.NumberFormat(r,{...a,style:"currency"});return o=>s.format(o)}),datetime:i((r,a)=>{const s=new Intl.DateTimeFormat(r,{...a});return o=>s.format(o)}),relativetime:i((r,a)=>{const s=new Intl.RelativeTimeFormat(r,{...a});return o=>s.format(o,a.range||"day")}),list:i((r,a)=>{const s=new Intl.ListFormat(r,{...a});return o=>s.format(o)})}}add(e,n){this.formats[e.toLowerCase().trim()]=n}addCached(e,n){this.formats[e.toLowerCase().trim()]=r4(n)}format(e,n,i,r={}){const a=n.split(this.formatSeparator);if(a.length>1&&a[0].indexOf("(")>1&&a[0].indexOf(")")<0&&a.find(o=>o.indexOf(")")>-1)){const o=a.findIndex(l=>l.indexOf(")")>-1);a[0]=[a[0],...a.splice(1,o)].join(this.formatSeparator)}return a.reduce((o,l)=>{const{formatName:c,formatOptions:u}=fne(l);if(this.formats[c]){let f=o;try{const p=r?.formatParams?.[r.interpolationkey]||{},g=p.locale||p.lng||r.locale||r.lng||i;f=this.formats[c](o,g,{...u,...r,...p})}catch(p){this.logger.warn(p)}return f}else this.logger.warn(`there was no format function for ${c}`);return o},e)}}const mne=(t,e)=>{t.pending[e]!==void 0&&(delete t.pending[e],t.pendingCount--)};class gne extends zS{constructor(e,n,i,r={}){super(),this.backend=e,this.store=n,this.services=i,this.languageUtils=i.languageUtils,this.options=r,this.logger=Ho.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=r.maxParallelReads||10,this.readingCalls=0,this.maxRetries=r.maxRetries>=0?r.maxRetries:5,this.retryTimeout=r.retryTimeout>=1?r.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(i,r.backend,r)}queueLoad(e,n,i,r){const a={},s={},o={},l={};return e.forEach(c=>{let u=!0;n.forEach(f=>{const p=`${c}|${f}`;!i.reload&&this.store.hasResourceBundle(c,f)?this.state[p]=2:this.state[p]<0||(this.state[p]===1?s[p]===void 0&&(s[p]=!0):(this.state[p]=1,u=!1,s[p]===void 0&&(s[p]=!0),a[p]===void 0&&(a[p]=!0),l[f]===void 0&&(l[f]=!0)))}),u||(o[c]=!0)}),(Object.keys(a).length||Object.keys(s).length)&&this.queue.push({pending:s,pendingCount:Object.keys(s).length,loaded:{},errors:[],callback:r}),{toLoad:Object.keys(a),pending:Object.keys(s),toLoadLanguages:Object.keys(o),toLoadNamespaces:Object.keys(l)}}loaded(e,n,i){const r=e.split("|"),a=r[0],s=r[1];n&&this.emit("failedLoading",a,s,n),!n&&i&&this.store.addResourceBundle(a,s,i,void 0,void 0,{skipCopy:!0}),this.state[e]=n?-1:2,n&&i&&(this.state[e]=0);const o={};this.queue.forEach(l=>{ene(l.loaded,[a],s),mne(l,e),n&&l.errors.push(n),l.pendingCount===0&&!l.done&&(Object.keys(l.loaded).forEach(c=>{o[c]||(o[c]={});const u=l.loaded[c];u.length&&u.forEach(f=>{o[c][f]===void 0&&(o[c][f]=!0)})}),l.done=!0,l.errors.length?l.callback(l.errors):l.callback())}),this.emit("loaded",o),this.queue=this.queue.filter(l=>!l.done)}read(e,n,i,r=0,a=this.retryTimeout,s){if(!e.length)return s(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:n,fcName:i,tried:r,wait:a,callback:s});return}this.readingCalls++;const o=(c,u)=>{if(this.readingCalls--,this.waitingReads.length>0){const f=this.waitingReads.shift();this.read(f.lng,f.ns,f.fcName,f.tried,f.wait,f.callback)}if(c&&u&&r{this.read.call(this,e,n,i,r+1,a*2,s)},a);return}s(c,u)},l=this.backend[i].bind(this.backend);if(l.length===2){try{const c=l(e,n);c&&typeof c.then=="function"?c.then(u=>o(null,u)).catch(o):o(null,c)}catch(c){o(c)}return}return l(e,n,o)}prepareLoading(e,n,i={},r){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),r&&r();Vt(e)&&(e=this.languageUtils.toResolveHierarchy(e)),Vt(n)&&(n=[n]);const a=this.queueLoad(e,n,i,r);if(!a.toLoad.length)return a.pending.length||r(),null;a.toLoad.forEach(s=>{this.loadOne(s)})}load(e,n,i){this.prepareLoading(e,n,{},i)}reload(e,n,i){this.prepareLoading(e,n,{reload:!0},i)}loadOne(e,n=""){const i=e.split("|"),r=i[0],a=i[1];this.read(r,a,"read",void 0,void 0,(s,o)=>{s&&this.logger.warn(`${n}loading namespace ${a} for language ${r} failed`,s),!s&&o&&this.logger.log(`${n}loaded namespace ${a} for language ${r}`,o),this.loaded(e,s,o)})}saveMissing(e,n,i,r,a,s={},o=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(n)){this.logger.warn(`did not save key "${i}" as the namespace "${n}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(i==null||i==="")){if(this.backend?.create){const l={...s,isUpdate:a},c=this.backend.create.bind(this.backend);if(c.length<6)try{let u;c.length===5?u=c(e,n,i,r,l):u=c(e,n,i,r),u&&typeof u.then=="function"?u.then(f=>o(null,f)).catch(o):o(null,u)}catch(u){o(u)}else c(e,n,i,r,o,l)}!e||!e[0]||this.store.addResource(e[0],n,i,r)}}}const a4=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:t=>{let e={};if(typeof t[1]=="object"&&(e=t[1]),Vt(t[1])&&(e.defaultValue=t[1]),Vt(t[2])&&(e.tDescription=t[2]),typeof t[2]=="object"||typeof t[3]=="object"){const n=t[3]||t[2];Object.keys(n).forEach(i=>{e[i]=n[i]})}return e},interpolation:{escapeValue:!0,format:t=>t,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),s4=t=>(Vt(t.ns)&&(t.ns=[t.ns]),Vt(t.fallbackLng)&&(t.fallbackLng=[t.fallbackLng]),Vt(t.fallbackNS)&&(t.fallbackNS=[t.fallbackNS]),t.supportedLngs?.indexOf?.("cimode")<0&&(t.supportedLngs=t.supportedLngs.concat(["cimode"])),typeof t.initImmediate=="boolean"&&(t.initAsync=t.initImmediate),t),Ty=()=>{},xne=t=>{Object.getOwnPropertyNames(Object.getPrototypeOf(t)).forEach(n=>{typeof t[n]=="function"&&(t[n]=t[n].bind(t))})};class d0 extends zS{constructor(e={},n){if(super(),this.options=s4(e),this.services={},this.logger=Ho,this.modules={external:[]},xne(this),n&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,n),this;setTimeout(()=>{this.init(e,n)},0)}}init(e={},n){this.isInitializing=!0,typeof e=="function"&&(n=e,e={}),e.defaultNS==null&&e.ns&&(Vt(e.ns)?e.defaultNS=e.ns:e.ns.indexOf("translation")<0&&(e.defaultNS=e.ns[0]));const i=a4();this.options={...i,...this.options,...s4(e)},this.options.interpolation={...i.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator);const r=c=>c?typeof c=="function"?new c:c:null;if(!this.options.isClone){this.modules.logger?Ho.init(r(this.modules.logger),this.options):Ho.init(null,this.options);let c;this.modules.formatter?c=this.modules.formatter:c=pne;const u=new e4(this.options);this.store=new Qj(this.options.resources,this.options);const f=this.services;f.logger=Ho,f.resourceStore=this.store,f.languageUtils=u,f.pluralResolver=new une(u,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==i.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),c&&(!this.options.interpolation.format||this.options.interpolation.format===i.interpolation.format)&&(f.formatter=r(c),f.formatter.init&&f.formatter.init(f,this.options),this.options.interpolation.format=f.formatter.format.bind(f.formatter)),f.interpolator=new dne(this.options),f.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},f.backendConnector=new gne(r(this.modules.backend),f.resourceStore,f,this.options),f.backendConnector.on("*",(g,...y)=>{this.emit(g,...y)}),this.modules.languageDetector&&(f.languageDetector=r(this.modules.languageDetector),f.languageDetector.init&&f.languageDetector.init(f,this.options.detection,this.options)),this.modules.i18nFormat&&(f.i18nFormat=r(this.modules.i18nFormat),f.i18nFormat.init&&f.i18nFormat.init(this)),this.translator=new D_(this.services,this.options),this.translator.on("*",(g,...y)=>{this.emit(g,...y)}),this.modules.external.forEach(g=>{g.init&&g.init(this)})}if(this.format=this.options.interpolation.format,n||(n=Ty),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const c=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);c.length>0&&c[0]!=="dev"&&(this.options.lng=c[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(c=>{this[c]=(...u)=>this.store[c](...u)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(c=>{this[c]=(...u)=>(this.store[c](...u),this)});const o=Tg(),l=()=>{const c=(u,f)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),o.resolve(f),n(u,f)};if(this.languages&&!this.isInitialized)return c(null,this.t.bind(this));this.changeLanguage(this.options.lng,c)};return this.options.resources||!this.options.initAsync?l():setTimeout(l,0),o}loadResources(e,n=Ty){let i=n;const r=Vt(e)?e:this.language;if(typeof e=="function"&&(i=e),!this.options.resources||this.options.partialBundledLanguages){if(r?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return i();const a=[],s=o=>{if(!o||o==="cimode")return;this.services.languageUtils.toResolveHierarchy(o).forEach(c=>{c!=="cimode"&&a.indexOf(c)<0&&a.push(c)})};r?s(r):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(l=>s(l)),this.options.preload?.forEach?.(o=>s(o)),this.services.backendConnector.load(a,this.options.ns,o=>{!o&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),i(o)})}else i(null)}reloadResources(e,n,i){const r=Tg();return typeof e=="function"&&(i=e,e=void 0),typeof n=="function"&&(i=n,n=void 0),e||(e=this.languages),n||(n=this.options.ns),i||(i=Ty),this.services.backendConnector.reload(e,n,a=>{r.resolve(),i(a)}),r}use(e){if(!e)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!e.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return e.type==="backend"&&(this.modules.backend=e),(e.type==="logger"||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type==="languageDetector"&&(this.modules.languageDetector=e),e.type==="i18nFormat"&&(this.modules.i18nFormat=e),e.type==="postProcessor"&&rG.addPostProcessor(e),e.type==="formatter"&&(this.modules.formatter=e),e.type==="3rdParty"&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!(["cimode","dev"].indexOf(e)>-1)){for(let n=0;n-1)&&this.store.hasLanguageSomeTranslations(i)){this.resolvedLanguage=i;break}}!this.resolvedLanguage&&this.languages.indexOf(e)<0&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,n){this.isLanguageChangingTo=e;const i=Tg();this.emit("languageChanging",e);const r=o=>{this.language=o,this.languages=this.services.languageUtils.toResolveHierarchy(o),this.resolvedLanguage=void 0,this.setResolvedLanguage(o)},a=(o,l)=>{l?this.isLanguageChangingTo===e&&(r(l),this.translator.changeLanguage(l),this.isLanguageChangingTo=void 0,this.emit("languageChanged",l),this.logger.log("languageChanged",l)):this.isLanguageChangingTo=void 0,i.resolve((...c)=>this.t(...c)),n&&n(o,(...c)=>this.t(...c))},s=o=>{!e&&!o&&this.services.languageDetector&&(o=[]);const l=Vt(o)?o:o&&o[0],c=this.store.hasLanguageSomeTranslations(l)?l:this.services.languageUtils.getBestMatchFromCodes(Vt(o)?[o]:o);c&&(this.language||r(c),this.translator.language||this.translator.changeLanguage(c),this.services.languageDetector?.cacheUserLanguage?.(c)),this.loadResources(c,u=>{a(u,c)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?s(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(s):this.services.languageDetector.detect(s):s(e),i}getFixedT(e,n,i){const r=(a,s,...o)=>{let l;typeof s!="object"?l=this.options.overloadTranslationOptionHandler([a,s].concat(o)):l={...s},l.lng=l.lng||r.lng,l.lngs=l.lngs||r.lngs,l.ns=l.ns||r.ns,l.keyPrefix!==""&&(l.keyPrefix=l.keyPrefix||i||r.keyPrefix);const c=this.options.keySeparator||".";let u;return l.keyPrefix&&Array.isArray(a)?u=a.map(f=>(typeof f=="function"&&(f=uN(f,{...this.options,...s})),`${l.keyPrefix}${c}${f}`)):(typeof a=="function"&&(a=uN(a,{...this.options,...s})),u=l.keyPrefix?`${l.keyPrefix}${c}${a}`:a),this.t(u,l)};return Vt(e)?r.lng=e:r.lngs=e,r.ns=n,r.keyPrefix=i,r}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,n={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const i=n.lng||this.resolvedLanguage||this.languages[0],r=this.options?this.options.fallbackLng:!1,a=this.languages[this.languages.length-1];if(i.toLowerCase()==="cimode")return!0;const s=(o,l)=>{const c=this.services.backendConnector.state[`${o}|${l}`];return c===-1||c===0||c===2};if(n.precheck){const o=n.precheck(this,s);if(o!==void 0)return o}return!!(this.hasResourceBundle(i,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||s(i,e)&&(!r||s(a,e)))}loadNamespaces(e,n){const i=Tg();return this.options.ns?(Vt(e)&&(e=[e]),e.forEach(r=>{this.options.ns.indexOf(r)<0&&this.options.ns.push(r)}),this.loadResources(r=>{i.resolve(),n&&n(r)}),i):(n&&n(),Promise.resolve())}loadLanguages(e,n){const i=Tg();Vt(e)&&(e=[e]);const r=this.options.preload||[],a=e.filter(s=>r.indexOf(s)<0&&this.services.languageUtils.isSupportedCode(s));return a.length?(this.options.preload=r.concat(a),this.loadResources(s=>{i.resolve(),n&&n(s)}),i):(n&&n(),Promise.resolve())}dir(e){if(e||(e=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!e)return"rtl";try{const r=new Intl.Locale(e);if(r&&r.getTextInfo){const a=r.getTextInfo();if(a&&a.direction)return a.direction}}catch{}const n=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],i=this.services?.languageUtils||new e4(a4());return e.toLowerCase().indexOf("-latn")>1?"ltr":n.indexOf(i.getLanguagePartFromCode(e))>-1||e.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(e={},n){const i=new d0(e,n);return i.createInstance=d0.createInstance,i}cloneInstance(e={},n=Ty){const i=e.forkResourceStore;i&&delete e.forkResourceStore;const r={...this.options,...e,isClone:!0},a=new d0(r);if((e.debug!==void 0||e.prefix!==void 0)&&(a.logger=a.logger.clone(e)),["store","services","language"].forEach(o=>{a[o]=this[o]}),a.services={...this.services},a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},i){const o=Object.keys(this.store.data).reduce((l,c)=>(l[c]={...this.store.data[c]},l[c]=Object.keys(l[c]).reduce((u,f)=>(u[f]={...l[c][f]},u),l[c]),l),{});a.store=new Qj(o,r),a.services.resourceStore=a.store}return a.translator=new D_(a.services,r),a.translator.on("*",(o,...l)=>{a.emit(o,...l)}),a.init(r,n),a.translator.options=r,a.translator.backendConnector.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const wa=d0.createInstance();wa.createInstance;wa.dir;wa.init;wa.loadResources;wa.reloadResources;wa.use;wa.changeLanguage;wa.getFixedT;wa.t;wa.exists;wa.setDefaultNamespace;wa.hasLoadedNamespace;wa.loadNamespaces;wa.loadLanguages;const vne=(t,e,n,i)=>{const r=[n,{code:e,...i||{}}];if(t?.services?.logger?.forward)return t.services.logger.forward(r,"warn","react-i18next::",!0);_f(r[0])&&(r[0]=`react-i18next:: ${r[0]}`),t?.services?.logger?.warn?t.services.logger.warn(...r):console?.warn&&console.warn(...r)},o4={},sG=(t,e,n,i)=>{_f(n)&&o4[n]||(_f(n)&&(o4[n]=new Date),vne(t,e,n,i))},oG=(t,e)=>()=>{if(t.isInitialized)e();else{const n=()=>{setTimeout(()=>{t.off("initialized",n)},0),e()};t.on("initialized",n)}},dN=(t,e,n)=>{t.loadNamespaces(e,oG(t,n))},l4=(t,e,n,i)=>{if(_f(n)&&(n=[n]),t.options.preload&&t.options.preload.indexOf(e)>-1)return dN(t,n,i);n.forEach(r=>{t.options.ns.indexOf(r)<0&&t.options.ns.push(r)}),t.loadLanguages(e,oG(t,i))},yne=(t,e,n={})=>!e.languages||!e.languages.length?(sG(e,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:e.languages}),!0):e.hasLoadedNamespace(t,{lng:n.lng,precheck:(i,r)=>{if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&i.services.backendConnector.backend&&i.isLanguageChangingTo&&!r(i.isLanguageChangingTo,t))return!1}}),_f=t=>typeof t=="string",bne=t=>typeof t=="object"&&t!==null,_ne=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,Sne={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},wne=t=>Sne[t],Mne=t=>t.replace(_ne,wne);let fN={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:Mne};const Ene=(t={})=>{fN={...fN,...t}},Ane=()=>fN;let lG;const Tne=t=>{lG=t},Cne=()=>lG,Nne={type:"3rdParty",init(t){Ene(t.options.react),Tne(t)}},Rne=A.createContext();class Pne{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(n=>{this.usedNamespaces[n]||(this.usedNamespaces[n]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}var EA={exports:{}},AA={};var c4;function Dne(){if(c4)return AA;c4=1;var t=hm();function e(f,p){return f===p&&(f!==0||1/f===1/p)||f!==f&&p!==p}var n=typeof Object.is=="function"?Object.is:e,i=t.useState,r=t.useEffect,a=t.useLayoutEffect,s=t.useDebugValue;function o(f,p){var g=p(),y=i({inst:{value:g,getSnapshot:p}}),_=y[0].inst,v=y[1];return a(function(){_.value=g,_.getSnapshot=p,l(_)&&v({inst:_})},[f,g,p]),r(function(){return l(_)&&v({inst:_}),f(function(){l(_)&&v({inst:_})})},[f]),s(g),g}function l(f){var p=f.getSnapshot;f=f.value;try{var g=p();return!n(f,g)}catch{return!0}}function c(f,p){return p()}var u=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?c:o;return AA.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:u,AA}var u4;function cG(){return u4||(u4=1,EA.exports=Dne()),EA.exports}var xP=cG();const kne=(t,e)=>_f(e)?e:bne(e)&&_f(e.defaultValue)?e.defaultValue:Array.isArray(t)?t[t.length-1]:t,One={t:kne,ready:!1},Lne=()=>()=>{},vP=(t,e={})=>{const{i18n:n}=e,{i18n:i,defaultNS:r}=A.useContext(Rne)||{},a=n||i||Cne();a&&!a.reportNamespaces&&(a.reportNamespaces=new Pne),a||sG(a,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const s=A.useMemo(()=>({...Ane(),...a?.options?.react,...e}),[a,e]),{useSuspense:o,keyPrefix:l}=s,c=r||a?.options?.defaultNS,u=_f(c)?[c]:c||["translation"],f=A.useMemo(()=>u,u);a?.reportNamespaces?.addUsedNamespaces?.(f);const p=A.useRef(0),g=A.useCallback(C=>{if(!a)return Lne;const{bindI18n:D,bindI18nStore:F}=s,I=()=>{p.current+=1,C()};return D&&a.on(D,I),F&&a.store.on(F,I),()=>{D&&D.split(" ").forEach(q=>a.off(q,I)),F&&F.split(" ").forEach(q=>a.store.off(q,I))}},[a,s]),y=A.useRef(),_=A.useCallback(()=>{if(!a)return One;const C=!!(a.isInitialized||a.initializedStoreOnce)&&f.every(H=>yne(H,a,s)),D=e.lng||a.language,F=p.current,I=y.current;if(I&&I.ready===C&&I.lng===D&&I.keyPrefix===l&&I.revision===F)return I;const L={t:a.getFixedT(D,s.nsMode==="fallback"?f:f[0],l),ready:C,lng:D,keyPrefix:l,revision:F};return y.current=L,L},[a,f,l,s,e.lng]),[v,x]=A.useState(0),{t:M,ready:w}=xP.useSyncExternalStore(g,_,_);A.useEffect(()=>{if(a&&!w&&!o){const C=()=>x(D=>D+1);e.lng?l4(a,e.lng,f,C):dN(a,f,C)}},[a,e.lng,f,w,o,v]);const E=a||{},T=A.useRef(null),P=A.useRef(),N=C=>{const D=Object.getOwnPropertyDescriptors(C);D.__original&&delete D.__original;const F=Object.create(Object.getPrototypeOf(C),D);if(!Object.prototype.hasOwnProperty.call(F,"__original"))try{Object.defineProperty(F,"__original",{value:C,writable:!1,enumerable:!1,configurable:!1})}catch{}return F},U=A.useMemo(()=>{const C=E,D=C?.language;let F=C;C&&(T.current&&T.current.__original===C?P.current!==D?(F=N(C),T.current=F,P.current=D):F=T.current:(F=N(C),T.current=F,P.current=D));const I=[M,F,w];return I.t=M,I.i18n=F,I.ready=w,I},[M,E,w,E.resolvedLanguage,E.language,E.languages]);if(a&&o&&!w)throw new Promise(C=>{const D=()=>C();e.lng?l4(a,e.lng,f,D):dN(a,f,D)});return U},{slice:Ine,forEach:Une}=[];function jne(t){return Une.call(Ine.call(arguments,1),e=>{if(e)for(const n in e)t[n]===void 0&&(t[n]=e[n])}),t}function Fne(t){return typeof t!="string"?!1:[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(n=>n.test(t))}const d4=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,zne=function(t,e){const i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:"/"},r=encodeURIComponent(e);let a=`${t}=${r}`;if(i.maxAge>0){const s=i.maxAge-0;if(Number.isNaN(s))throw new Error("maxAge should be a Number");a+=`; Max-Age=${Math.floor(s)}`}if(i.domain){if(!d4.test(i.domain))throw new TypeError("option domain is invalid");a+=`; Domain=${i.domain}`}if(i.path){if(!d4.test(i.path))throw new TypeError("option path is invalid");a+=`; Path=${i.path}`}if(i.expires){if(typeof i.expires.toUTCString!="function")throw new TypeError("option expires is invalid");a+=`; Expires=${i.expires.toUTCString()}`}if(i.httpOnly&&(a+="; HttpOnly"),i.secure&&(a+="; Secure"),i.sameSite)switch(typeof i.sameSite=="string"?i.sameSite.toLowerCase():i.sameSite){case!0:a+="; SameSite=Strict";break;case"lax":a+="; SameSite=Lax";break;case"strict":a+="; SameSite=Strict";break;case"none":a+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return i.partitioned&&(a+="; Partitioned"),a},f4={create(t,e,n,i){let r=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};n&&(r.expires=new Date,r.expires.setTime(r.expires.getTime()+n*60*1e3)),i&&(r.domain=i),document.cookie=zne(t,e,r)},read(t){const e=`${t}=`,n=document.cookie.split(";");for(let i=0;i-1&&(i=window.location.hash.substring(window.location.hash.indexOf("?")));const a=i.substring(1).split("&");for(let s=0;s0&&a[s].substring(0,o)===e&&(n=a[s].substring(o+1))}}return n}},Vne={name:"hash",lookup(t){let{lookupHash:e,lookupFromHashIndex:n}=t,i;if(typeof window<"u"){const{hash:r}=window.location;if(r&&r.length>2){const a=r.substring(1);if(e){const s=a.split("&");for(let o=0;o0&&s[o].substring(0,l)===e&&(i=s[o].substring(l+1))}}if(i)return i;if(!i&&n>-1){const s=r.match(/\/([a-zA-Z-]*)/g);return Array.isArray(s)?s[typeof n=="number"?n:0]?.replace("/",""):void 0}}}return i}};let Eh=null;const h4=()=>{if(Eh!==null)return Eh;try{if(Eh=typeof window<"u"&&window.localStorage!==null,!Eh)return!1;const t="i18next.translate.boo";window.localStorage.setItem(t,"foo"),window.localStorage.removeItem(t)}catch{Eh=!1}return Eh};var $ne={name:"localStorage",lookup(t){let{lookupLocalStorage:e}=t;if(e&&h4())return window.localStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupLocalStorage:n}=e;n&&h4()&&window.localStorage.setItem(n,t)}};let Ah=null;const p4=()=>{if(Ah!==null)return Ah;try{if(Ah=typeof window<"u"&&window.sessionStorage!==null,!Ah)return!1;const t="i18next.translate.boo";window.sessionStorage.setItem(t,"foo"),window.sessionStorage.removeItem(t)}catch{Ah=!1}return Ah};var Gne={name:"sessionStorage",lookup(t){let{lookupSessionStorage:e}=t;if(e&&p4())return window.sessionStorage.getItem(e)||void 0},cacheUserLanguage(t,e){let{lookupSessionStorage:n}=e;n&&p4()&&window.sessionStorage.setItem(n,t)}},Wne={name:"navigator",lookup(t){const e=[];if(typeof navigator<"u"){const{languages:n,userLanguage:i,language:r}=navigator;if(n)for(let a=0;a0?e:void 0}},qne={name:"htmlTag",lookup(t){let{htmlTag:e}=t,n;const i=e||(typeof document<"u"?document.documentElement:null);return i&&typeof i.getAttribute=="function"&&(n=i.getAttribute("lang")),n}},Xne={name:"path",lookup(t){let{lookupFromPathIndex:e}=t;if(typeof window>"u")return;const n=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(n)?n[typeof e=="number"?e:0]?.replace("/",""):void 0}},Kne={name:"subdomain",lookup(t){let{lookupFromSubdomainIndex:e}=t;const n=typeof e=="number"?e+1:1,i=typeof window<"u"&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(i)return i[n]}};let uG=!1;try{document.cookie,uG=!0}catch{}const dG=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];uG||dG.splice(1,1);const Yne=()=>({order:dG,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:t=>t});class fG{constructor(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(e,n)}init(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=e,this.options=jne(n,this.options||{},Yne()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=r=>r.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=i,this.addDetector(Bne),this.addDetector(Hne),this.addDetector($ne),this.addDetector(Gne),this.addDetector(Wne),this.addDetector(qne),this.addDetector(Xne),this.addDetector(Kne),this.addDetector(Vne)}addDetector(e){return this.detectors[e.name]=e,this}detect(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,n=[];return e.forEach(i=>{if(this.detectors[i]){let r=this.detectors[i].lookup(this.options);r&&typeof r=="string"&&(r=[r]),r&&(n=n.concat(r))}}),n=n.filter(i=>i!=null&&!Fne(i)).map(i=>this.options.convertDetectedLanguage(i)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?n:n.length>0?n[0]:null}cacheUserLanguage(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;n&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||n.forEach(i=>{this.detectors[i]&&this.detectors[i].cacheUserLanguage(e,this.options)}))}}fG.type="languageDetector";const Zne={nav:{printers:"Printers",control:"Control",archives:"Archives",queue:"Queue",stats:"Statistics",profiles:"Profiles",maintenance:"Maintenance",settings:"Settings",collapseSidebar:"Collapse sidebar",expandSidebar:"Expand sidebar",update:"Update",updateAvailable:"Update available: v{{version}}",viewOnGithub:"View on GitHub",keyboardShortcuts:"Keyboard shortcuts (?)",switchToLight:"Switch to light mode",switchToDark:"Switch to dark mode"},common:{save:"Save",cancel:"Cancel",delete:"Delete",edit:"Edit",add:"Add",close:"Close",confirm:"Confirm",loading:"Loading...",error:"Error",success:"Success",warning:"Warning",enabled:"Enabled",disabled:"Disabled",yes:"Yes",no:"No",on:"On",off:"Off",all:"All",none:"None",search:"Search",filter:"Filter",sort:"Sort",refresh:"Refresh",download:"Download",upload:"Upload",actions:"Actions",status:"Status",name:"Name",description:"Description",date:"Date",time:"Time",hours:"hours",minutes:"minutes",seconds:"seconds",noPrinters:"No printers configured",noData:"No data available",required:"Required",optional:"Optional"},printers:{title:"Printers",addPrinter:"Add Printer",editPrinter:"Edit Printer",deletePrinter:"Delete Printer",printerName:"Printer Name",serialNumber:"Serial Number",ipAddress:"IP Address",accessCode:"Access Code",model:"Model",nozzleCount:"Nozzle Count",autoArchive:"Auto Archive",status:{idle:"Idle",printing:"Printing",paused:"Paused",offline:"Offline",error:"Error",finished:"Finished",unknown:"Unknown"},temperatures:{nozzle:"Nozzle",bed:"Bed",chamber:"Chamber"},progress:"{{percent}}% complete",timeRemaining:"{{time}} remaining",deleteConfirm:'Are you sure you want to delete "{{name}}"?',maintenanceOk:"Maintenance OK",maintenanceWarning:"{{count}} warning",maintenanceWarning_plural:"{{count}} warnings",maintenanceDue:"{{count}} due",maintenanceDue_plural:"{{count}} due"},archives:{title:"Print Archives",searchPlaceholder:"Search archives...",filterByPrinter:"Filter by printer",filterByStatus:"Filter by status",sortBy:"Sort by",sortNewest:"Newest first",sortOldest:"Oldest first",sortName:"Name",sortDuration:"Duration",noArchives:"No archives found",printTime:"Print Time",filamentUsed:"Filament Used",cost:"Cost",reprint:"Reprint",preview:"Preview",deleteArchive:"Delete Archive",deleteConfirm:"Are you sure you want to delete this archive?",favorite:"Favorite",unfavorite:"Remove from favorites",viewDetails:"View Details",status:{completed:"Completed",failed:"Failed",stopped:"Stopped"}},queue:{title:"Print Queue",addToQueue:"Add to Queue",clearQueue:"Clear Queue",emptyQueue:"Queue is empty",position:"Position",scheduledTime:"Scheduled Time",moveUp:"Move Up",moveDown:"Move Down",remove:"Remove",startNow:"Start Now",status:{pending:"Pending",printing:"Printing",completed:"Completed",failed:"Failed",cancelled:"Cancelled"}},stats:{title:"Statistics",overview:"Overview",totalPrints:"Total Prints",successRate:"Success Rate",totalPrintTime:"Total Print Time",totalFilament:"Total Filament Used",totalCost:"Total Cost",averagePrintTime:"Average Print Time",printsPerDay:"Prints per Day",byPrinter:"By Printer",byMaterial:"By Material",byMonth:"By Month",last7Days:"Last 7 Days",last30Days:"Last 30 Days",last90Days:"Last 90 Days",allTime:"All Time"},profiles:{title:"Filament Profiles",addProfile:"Add Profile",editProfile:"Edit Profile",deleteProfile:"Delete Profile",material:"Material",brand:"Brand",color:"Color",diameter:"Diameter",density:"Density",costPerKg:"Cost per kg",spoolWeight:"Spool Weight",noProfiles:"No profiles configured",deleteConfirm:"Are you sure you want to delete this profile?"},maintenance:{title:"Maintenance",overview:"Overview",allOk:"All maintenance up to date",dueCount:"{{count}} item due",dueCount_plural:"{{count}} items due",warningCount:"{{count}} warning",warningCount_plural:"{{count}} warnings",totalPrintTime:"Total Print Time",nextMaintenance:"Next Maintenance",nothingDue:"Nothing due",tasks:"Tasks",lastPerformed:"Last performed",interval:"Interval",hoursRemaining:"{{hours}}h remaining",hoursOverdue:"{{hours}}h overdue",markDone:"Mark as Done",performMaintenance:"Perform Maintenance",history:"History",noHistory:"No maintenance history",editPrintHours:"Edit Print Hours",currentHours:"Current Hours",types:{lubricateRails:"Lubricate Linear Rails",cleanNozzle:"Clean Nozzle/Hotend",checkBelts:"Check Belt Tension",cleanBuildPlate:"Clean Build Plate",checkExtruder:"Check Extruder Gears",checkCooling:"Check Cooling Fans",generalInspection:"General Inspection"}},settings:{title:"Settings",general:"General",appearance:"Appearance",notifications:"Notifications",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Language",languageDescription:"Select your preferred language",theme:"Theme",themeLight:"Light",themeDark:"Dark",themeSystem:"System",defaultView:"Default View",defaultViewDescription:"Page to show when opening the app",checkForUpdates:"Check for Updates",autoUpdate:"Auto Update",currentVersion:"Current Version",latestVersion:"Latest Version",upToDate:"You are up to date",updateAvailable:"Update available",notificationLanguage:"Notification Language",notificationLanguageDescription:"Language for push notifications",notificationProviders:"Notification Providers",addProvider:"Add Provider",editProvider:"Edit Provider",providerType:"Provider Type",testNotification:"Test Notification",testSuccess:"Test notification sent successfully",testFailed:"Failed to send test notification",quietHours:"Quiet Hours",quietHoursDescription:"Do not disturb during these hours",quietHoursStart:"Start",quietHoursEnd:"End",events:{title:"Notification Events",printStart:"Print Started",printComplete:"Print Completed",printFailed:"Print Failed",printStopped:"Print Stopped",printProgress:"Progress Milestones",printProgressDescription:"Notify at 25%, 50%, 75%",printerOffline:"Printer Offline",printerError:"Printer Error",filamentLow:"Low Filament",maintenanceDue:"Maintenance Due",maintenanceDueDescription:"Notify when maintenance is needed"},smartPlug:{title:"Smart Plugs",add:"Add Smart Plug",edit:"Edit Smart Plug",name:"Name",ipAddress:"IP Address",linkedPrinter:"Linked Printer",autoOn:"Auto Power On",autoOnDescription:"Turn on when print starts",autoOff:"Auto Power Off",autoOffDescription:"Turn off after print completes",offDelay:"Off Delay",offDelayMinutes:"Minutes after print",offDelayTemp:"When nozzle below temperature",currentState:"Current State",turnOn:"Turn On",turnOff:"Turn Off"},spoolmanEnabled:"Enable Spoolman Integration",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Connected",spoolmanDisconnected:"Disconnected"},notification:{printStarted:{title:"Print Started",body:"{{printer}}: {{filename}} has started printing"},printCompleted:{title:"Print Completed",body:"{{printer}}: {{filename}} completed successfully"},printFailed:{title:"Print Failed",body:"{{printer}}: {{filename}} has failed"},printStopped:{title:"Print Stopped",body:"{{printer}}: {{filename}} was stopped"},printProgress:{title:"Print Progress",body:"{{printer}}: {{filename}} is {{percent}}% complete"},printerOffline:{title:"Printer Offline",body:"{{printer}} is offline"},printerError:{title:"Printer Error",body:"{{printer}}: {{error}}"},filamentLow:{title:"Low Filament",body:"{{printer}}: Filament is running low"},maintenanceDue:{title:"Maintenance Due",body:"{{printer}}: {{items}} need attention"}},errors:{generic:"Something went wrong",networkError:"Network error. Please check your connection.",notFound:"Not found",unauthorized:"Unauthorized",serverError:"Server error",validationError:"Please check your input",printerConnectionFailed:"Failed to connect to printer",saveFailed:"Failed to save changes",deleteFailed:"Failed to delete",loadFailed:"Failed to load data"},confirm:{delete:"Are you sure you want to delete this?",unsavedChanges:"You have unsaved changes. Are you sure you want to leave?",clearQueue:"Are you sure you want to clear the queue?"}},Qne={nav:{printers:"Drucker",control:"Steuerung",archives:"Archiv",queue:"Warteschlange",stats:"Statistiken",profiles:"Profile",maintenance:"Wartung",settings:"Einstellungen",collapseSidebar:"Seitenleiste einklappen",expandSidebar:"Seitenleiste ausklappen",update:"Update",updateAvailable:"Update verfügbar: v{{version}}",viewOnGithub:"Auf GitHub ansehen",keyboardShortcuts:"Tastaturkürzel (?)",switchToLight:"Zum hellen Modus wechseln",switchToDark:"Zum dunklen Modus wechseln"},common:{save:"Speichern",cancel:"Abbrechen",delete:"Löschen",edit:"Bearbeiten",add:"Hinzufügen",close:"Schließen",confirm:"Bestätigen",loading:"Lädt...",error:"Fehler",success:"Erfolg",warning:"Warnung",enabled:"Aktiviert",disabled:"Deaktiviert",yes:"Ja",no:"Nein",on:"An",off:"Aus",all:"Alle",none:"Keine",search:"Suchen",filter:"Filtern",sort:"Sortieren",refresh:"Aktualisieren",download:"Herunterladen",upload:"Hochladen",actions:"Aktionen",status:"Status",name:"Name",description:"Beschreibung",date:"Datum",time:"Zeit",hours:"Stunden",minutes:"Minuten",seconds:"Sekunden",noPrinters:"Keine Drucker konfiguriert",noData:"Keine Daten verfügbar",required:"Erforderlich",optional:"Optional"},printers:{title:"Drucker",addPrinter:"Drucker hinzufügen",editPrinter:"Drucker bearbeiten",deletePrinter:"Drucker löschen",printerName:"Druckername",serialNumber:"Seriennummer",ipAddress:"IP-Adresse",accessCode:"Zugangscode",model:"Modell",nozzleCount:"Düsenanzahl",autoArchive:"Automatische Archivierung",status:{idle:"Bereit",printing:"Druckt",paused:"Pausiert",offline:"Offline",error:"Fehler",finished:"Fertig",unknown:"Unbekannt"},temperatures:{nozzle:"Düse",bed:"Druckbett",chamber:"Kammer"},progress:"{{percent}}% abgeschlossen",timeRemaining:"Noch {{time}}",deleteConfirm:'Möchten Sie "{{name}}" wirklich löschen?',maintenanceOk:"Wartung OK",maintenanceWarning:"{{count}} Warnung",maintenanceWarning_plural:"{{count}} Warnungen",maintenanceDue:"{{count}} fällig",maintenanceDue_plural:"{{count}} fällig"},archives:{title:"Druckarchiv",searchPlaceholder:"Archiv durchsuchen...",filterByPrinter:"Nach Drucker filtern",filterByStatus:"Nach Status filtern",sortBy:"Sortieren nach",sortNewest:"Neueste zuerst",sortOldest:"Älteste zuerst",sortName:"Name",sortDuration:"Dauer",noArchives:"Keine Archive gefunden",printTime:"Druckzeit",filamentUsed:"Verbrauchtes Filament",cost:"Kosten",reprint:"Erneut drucken",preview:"Vorschau",deleteArchive:"Archiv löschen",deleteConfirm:"Möchten Sie dieses Archiv wirklich löschen?",favorite:"Favorit",unfavorite:"Aus Favoriten entfernen",viewDetails:"Details anzeigen",status:{completed:"Abgeschlossen",failed:"Fehlgeschlagen",stopped:"Gestoppt"}},queue:{title:"Druckwarteschlange",addToQueue:"Zur Warteschlange hinzufügen",clearQueue:"Warteschlange leeren",emptyQueue:"Warteschlange ist leer",position:"Position",scheduledTime:"Geplante Zeit",moveUp:"Nach oben",moveDown:"Nach unten",remove:"Entfernen",startNow:"Jetzt starten",status:{pending:"Ausstehend",printing:"Druckt",completed:"Abgeschlossen",failed:"Fehlgeschlagen",cancelled:"Abgebrochen"}},stats:{title:"Statistiken",overview:"Übersicht",totalPrints:"Gesamtdrucke",successRate:"Erfolgsrate",totalPrintTime:"Gesamtdruckzeit",totalFilament:"Gesamtverbrauch Filament",totalCost:"Gesamtkosten",averagePrintTime:"Durchschnittliche Druckzeit",printsPerDay:"Drucke pro Tag",byPrinter:"Nach Drucker",byMaterial:"Nach Material",byMonth:"Nach Monat",last7Days:"Letzte 7 Tage",last30Days:"Letzte 30 Tage",last90Days:"Letzte 90 Tage",allTime:"Gesamt"},profiles:{title:"Filament-Profile",addProfile:"Profil hinzufügen",editProfile:"Profil bearbeiten",deleteProfile:"Profil löschen",material:"Material",brand:"Marke",color:"Farbe",diameter:"Durchmesser",density:"Dichte",costPerKg:"Kosten pro kg",spoolWeight:"Spulengewicht",noProfiles:"Keine Profile konfiguriert",deleteConfirm:"Möchten Sie dieses Profil wirklich löschen?"},maintenance:{title:"Wartung",overview:"Übersicht",allOk:"Alle Wartungen aktuell",dueCount:"{{count}} Aufgabe fällig",dueCount_plural:"{{count}} Aufgaben fällig",warningCount:"{{count}} Warnung",warningCount_plural:"{{count}} Warnungen",totalPrintTime:"Gesamtdruckzeit",nextMaintenance:"Nächste Wartung",nothingDue:"Nichts fällig",tasks:"Aufgaben",lastPerformed:"Zuletzt durchgeführt",interval:"Intervall",hoursRemaining:"{{hours}}h verbleibend",hoursOverdue:"{{hours}}h überfällig",markDone:"Als erledigt markieren",performMaintenance:"Wartung durchführen",history:"Verlauf",noHistory:"Kein Wartungsverlauf",editPrintHours:"Druckstunden bearbeiten",currentHours:"Aktuelle Stunden",types:{lubricateRails:"Linearschienen schmieren",cleanNozzle:"Düse/Hotend reinigen",checkBelts:"Riemenspannung prüfen",cleanBuildPlate:"Druckbett reinigen",checkExtruder:"Extruderzahnräder prüfen",checkCooling:"Kühlungslüfter prüfen",generalInspection:"Allgemeine Inspektion"}},settings:{title:"Einstellungen",general:"Allgemein",appearance:"Erscheinungsbild",notifications:"Benachrichtigungen",smartPlugs:"Smart Plugs",spoolman:"Spoolman",updates:"Updates",language:"Sprache",languageDescription:"Wählen Sie Ihre bevorzugte Sprache",theme:"Design",themeLight:"Hell",themeDark:"Dunkel",themeSystem:"System",defaultView:"Standardansicht",defaultViewDescription:"Seite, die beim Öffnen der App angezeigt wird",checkForUpdates:"Nach Updates suchen",autoUpdate:"Automatische Updates",currentVersion:"Aktuelle Version",latestVersion:"Neueste Version",upToDate:"Sie sind auf dem neuesten Stand",updateAvailable:"Update verfügbar",notificationLanguage:"Benachrichtigungssprache",notificationLanguageDescription:"Sprache für Push-Benachrichtigungen",notificationProviders:"Benachrichtigungsanbieter",addProvider:"Anbieter hinzufügen",editProvider:"Anbieter bearbeiten",providerType:"Anbietertyp",testNotification:"Testbenachrichtigung",testSuccess:"Testbenachrichtigung erfolgreich gesendet",testFailed:"Testbenachrichtigung konnte nicht gesendet werden",quietHours:"Ruhezeiten",quietHoursDescription:"Keine Störungen während dieser Zeiten",quietHoursStart:"Beginn",quietHoursEnd:"Ende",events:{title:"Benachrichtigungsereignisse",printStart:"Druck gestartet",printComplete:"Druck abgeschlossen",printFailed:"Druck fehlgeschlagen",printStopped:"Druck gestoppt",printProgress:"Fortschrittsmeldungen",printProgressDescription:"Bei 25%, 50%, 75% benachrichtigen",printerOffline:"Drucker offline",printerError:"Druckerfehler",filamentLow:"Filament niedrig",maintenanceDue:"Wartung fällig",maintenanceDueDescription:"Benachrichtigen, wenn Wartung erforderlich"},smartPlug:{title:"Smart Plugs",add:"Smart Plug hinzufügen",edit:"Smart Plug bearbeiten",name:"Name",ipAddress:"IP-Adresse",linkedPrinter:"Verknüpfter Drucker",autoOn:"Automatisch einschalten",autoOnDescription:"Einschalten beim Druckstart",autoOff:"Automatisch ausschalten",autoOffDescription:"Ausschalten nach Druckende",offDelay:"Ausschaltverzögerung",offDelayMinutes:"Minuten nach Druck",offDelayTemp:"Wenn Düse unter Temperatur",currentState:"Aktueller Status",turnOn:"Einschalten",turnOff:"Ausschalten"},spoolmanEnabled:"Spoolman-Integration aktivieren",spoolmanUrl:"Spoolman URL",spoolmanConnected:"Verbunden",spoolmanDisconnected:"Nicht verbunden"},notification:{printStarted:{title:"Druck gestartet",body:"{{printer}}: {{filename}} wird gedruckt"},printCompleted:{title:"Druck abgeschlossen",body:"{{printer}}: {{filename}} erfolgreich abgeschlossen"},printFailed:{title:"Druck fehlgeschlagen",body:"{{printer}}: {{filename}} ist fehlgeschlagen"},printStopped:{title:"Druck gestoppt",body:"{{printer}}: {{filename}} wurde gestoppt"},printProgress:{title:"Druckfortschritt",body:"{{printer}}: {{filename}} ist zu {{percent}}% abgeschlossen"},printerOffline:{title:"Drucker offline",body:"{{printer}} ist offline"},printerError:{title:"Druckerfehler",body:"{{printer}}: {{error}}"},filamentLow:{title:"Filament niedrig",body:"{{printer}}: Filament geht zur Neige"},maintenanceDue:{title:"Wartung fällig",body:"{{printer}}: {{items}} benötigen Aufmerksamkeit"}},errors:{generic:"Etwas ist schiefgelaufen",networkError:"Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung.",notFound:"Nicht gefunden",unauthorized:"Nicht autorisiert",serverError:"Serverfehler",validationError:"Bitte überprüfen Sie Ihre Eingabe",printerConnectionFailed:"Verbindung zum Drucker fehlgeschlagen",saveFailed:"Speichern fehlgeschlagen",deleteFailed:"Löschen fehlgeschlagen",loadFailed:"Laden der Daten fehlgeschlagen"},confirm:{delete:"Möchten Sie dies wirklich löschen?",unsavedChanges:"Sie haben ungespeicherte Änderungen. Möchten Sie wirklich verlassen?",clearQueue:"Möchten Sie die Warteschlange wirklich leeren?"}},Jne={en:{translation:Zne},de:{translation:Qne}};wa.use(fG).use(Nne).init({resources:Jne,fallbackLng:"en",supportedLngs:["en","de"],detection:{order:["localStorage","navigator","htmlTag"],lookupLocalStorage:"bambutrack_language",caches:["localStorage"]},interpolation:{escapeValue:!1},react:{useSuspense:!1}});const m4=[{code:"en",name:"English",nativeName:"English"},{code:"de",name:"German",nativeName:"Deutsch"}];var g4="popstate";function eie(t={}){function e(i,r){let{pathname:a,search:s,hash:o}=i.location;return hN("",{pathname:a,search:s,hash:o},r.state&&r.state.usr||null,r.state&&r.state.key||"default")}function n(i,r){return typeof r=="string"?r:L0(r)}return nie(e,n,null,t)}function mi(t,e){if(t===!1||t===null||typeof t>"u")throw new Error(e)}function Ws(t,e){if(!t){typeof console<"u"&&console.warn(e);try{throw new Error(e)}catch{}}}function tie(){return Math.random().toString(36).substring(2,10)}function x4(t,e){return{usr:t.state,key:t.key,idx:e}}function hN(t,e,n=null,i){return{pathname:typeof t=="string"?t:t.pathname,search:"",hash:"",...typeof e=="string"?pm(e):e,state:n,key:e&&e.key||i||tie()}}function L0({pathname:t="/",search:e="",hash:n=""}){return e&&e!=="?"&&(t+=e.charAt(0)==="?"?e:"?"+e),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function pm(t){let e={};if(t){let n=t.indexOf("#");n>=0&&(e.hash=t.substring(n),t=t.substring(0,n));let i=t.indexOf("?");i>=0&&(e.search=t.substring(i),t=t.substring(0,i)),t&&(e.pathname=t)}return e}function nie(t,e,n,i={}){let{window:r=document.defaultView,v5Compat:a=!1}=i,s=r.history,o="POP",l=null,c=u();c==null&&(c=0,s.replaceState({...s.state,idx:c},""));function u(){return(s.state||{idx:null}).idx}function f(){o="POP";let v=u(),x=v==null?null:v-c;c=v,l&&l({action:o,location:_.location,delta:x})}function p(v,x){o="PUSH";let M=hN(_.location,v,x);c=u()+1;let w=x4(M,c),E=_.createHref(M);try{s.pushState(w,"",E)}catch(T){if(T instanceof DOMException&&T.name==="DataCloneError")throw T;r.location.assign(E)}a&&l&&l({action:o,location:_.location,delta:1})}function g(v,x){o="REPLACE";let M=hN(_.location,v,x);c=u();let w=x4(M,c),E=_.createHref(M);s.replaceState(w,"",E),a&&l&&l({action:o,location:_.location,delta:0})}function y(v){return iie(v)}let _={get action(){return o},get location(){return t(r,s)},listen(v){if(l)throw new Error("A history only accepts one active listener");return r.addEventListener(g4,f),l=v,()=>{r.removeEventListener(g4,f),l=null}},createHref(v){return e(r,v)},createURL:y,encodeLocation(v){let x=y(v);return{pathname:x.pathname,search:x.search,hash:x.hash}},push:p,replace:g,go(v){return s.go(v)}};return _}function iie(t,e=!1){let n="http://localhost";typeof window<"u"&&(n=window.location.origin!=="null"?window.location.origin:window.location.href),mi(n,"No window.location.(origin|href) available to create URL");let i=typeof t=="string"?t:L0(t);return i=i.replace(/ $/,"%20"),!e&&i.startsWith("//")&&(i=n+i),new URL(i,n)}function hG(t,e,n="/"){return rie(t,e,n,!1)}function rie(t,e,n,i){let r=typeof e=="string"?pm(e):e,a=cc(r.pathname||"/",n);if(a==null)return null;let s=pG(t);aie(s);let o=null;for(let l=0;o==null&&l{let u={relativePath:c===void 0?s.path||"":c,caseSensitive:s.caseSensitive===!0,childrenIndex:o,route:s};if(u.relativePath.startsWith("/")){if(!u.relativePath.startsWith(i)&&l)return;mi(u.relativePath.startsWith(i),`Absolute route path "${u.relativePath}" nested under path "${i}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),u.relativePath=u.relativePath.slice(i.length)}let f=tc([i,u.relativePath]),p=n.concat(u);s.children&&s.children.length>0&&(mi(s.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${f}".`),pG(s.children,e,p,f,l)),!(s.path==null&&!s.index)&&e.push({path:f,score:fie(f,s.index),routesMeta:p})};return t.forEach((s,o)=>{if(s.path===""||!s.path?.includes("?"))a(s,o);else for(let l of mG(s.path))a(s,o,!0,l)}),e}function mG(t){let e=t.split("/");if(e.length===0)return[];let[n,...i]=e,r=n.endsWith("?"),a=n.replace(/\?$/,"");if(i.length===0)return r?[a,""]:[a];let s=mG(i.join("/")),o=[];return o.push(...s.map(l=>l===""?a:[a,l].join("/"))),r&&o.push(...s),o.map(l=>t.startsWith("/")&&l===""?"/":l)}function aie(t){t.sort((e,n)=>e.score!==n.score?n.score-e.score:hie(e.routesMeta.map(i=>i.childrenIndex),n.routesMeta.map(i=>i.childrenIndex)))}var sie=/^:[\w-]+$/,oie=3,lie=2,cie=1,uie=10,die=-2,v4=t=>t==="*";function fie(t,e){let n=t.split("/"),i=n.length;return n.some(v4)&&(i+=die),e&&(i+=lie),n.filter(r=>!v4(r)).reduce((r,a)=>r+(sie.test(a)?oie:a===""?cie:uie),i)}function hie(t,e){return t.length===e.length&&t.slice(0,-1).every((i,r)=>i===e[r])?t[t.length-1]-e[e.length-1]:0}function pie(t,e,n=!1){let{routesMeta:i}=t,r={},a="/",s=[];for(let o=0;o{if(u==="*"){let y=o[p]||"";s=a.slice(0,a.length-y.length).replace(/(.)\/+$/,"$1")}const g=o[p];return f&&!g?c[u]=void 0:c[u]=(g||"").replace(/%2F/g,"/"),c},{}),pathname:a,pathnameBase:s,pattern:t}}function mie(t,e=!1,n=!0){Ws(t==="*"||!t.endsWith("*")||t.endsWith("/*"),`Route path "${t}" will be treated as if it were "${t.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${t.replace(/\*$/,"/*")}".`);let i=[],r="^"+t.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(s,o,l)=>(i.push({paramName:o,isOptional:l!=null}),l?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return t.endsWith("*")?(i.push({paramName:"*"}),r+=t==="*"||t==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?r+="\\/*$":t!==""&&t!=="/"&&(r+="(?:(?=\\/|$))"),[new RegExp(r,e?void 0:"i"),i]}function gie(t){try{return t.split("/").map(e=>decodeURIComponent(e).replace(/\//g,"%2F")).join("/")}catch(e){return Ws(!1,`The URL path "${t}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${e}).`),t}}function cc(t,e){if(e==="/")return t;if(!t.toLowerCase().startsWith(e.toLowerCase()))return null;let n=e.endsWith("/")?e.length-1:e.length,i=t.charAt(n);return i&&i!=="/"?null:t.slice(n)||"/"}var xie=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,vie=t=>xie.test(t);function yie(t,e="/"){let{pathname:n,search:i="",hash:r=""}=typeof t=="string"?pm(t):t,a;if(n)if(vie(n))a=n;else{if(n.includes("//")){let s=n;n=n.replace(/\/\/+/g,"/"),Ws(!1,`Pathnames cannot have embedded double slashes - normalizing ${s} -> ${n}`)}n.startsWith("/")?a=y4(n.substring(1),"/"):a=y4(n,e)}else a=e;return{pathname:a,search:Sie(i),hash:wie(r)}}function y4(t,e){let n=e.replace(/\/+$/,"").split("/");return t.split("/").forEach(r=>{r===".."?n.length>1&&n.pop():r!=="."&&n.push(r)}),n.length>1?n.join("/"):"/"}function TA(t,e,n,i){return`Cannot include a '${t}' character in a manually specified \`to.${e}\` field [${JSON.stringify(i)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function bie(t){return t.filter((e,n)=>n===0||e.route.path&&e.route.path.length>0)}function gG(t){let e=bie(t);return e.map((n,i)=>i===e.length-1?n.pathname:n.pathnameBase)}function xG(t,e,n,i=!1){let r;typeof t=="string"?r=pm(t):(r={...t},mi(!r.pathname||!r.pathname.includes("?"),TA("?","pathname","search",r)),mi(!r.pathname||!r.pathname.includes("#"),TA("#","pathname","hash",r)),mi(!r.search||!r.search.includes("#"),TA("#","search","hash",r)));let a=t===""||r.pathname==="",s=a?"/":r.pathname,o;if(s==null)o=n;else{let f=e.length-1;if(!i&&s.startsWith("..")){let p=s.split("/");for(;p[0]==="..";)p.shift(),f-=1;r.pathname=p.join("/")}o=f>=0?e[f]:"/"}let l=yie(r,o),c=s&&s!=="/"&&s.endsWith("/"),u=(a||s===".")&&n.endsWith("/");return!l.pathname.endsWith("/")&&(c||u)&&(l.pathname+="/"),l}var tc=t=>t.join("/").replace(/\/\/+/g,"/"),_ie=t=>t.replace(/\/+$/,"").replace(/^\/*/,"/"),Sie=t=>!t||t==="?"?"":t.startsWith("?")?t:"?"+t,wie=t=>!t||t==="#"?"":t.startsWith("#")?t:"#"+t;function Mie(t){return t!=null&&typeof t.status=="number"&&typeof t.statusText=="string"&&typeof t.internal=="boolean"&&"data"in t}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var vG=["POST","PUT","PATCH","DELETE"];new Set(vG);var Eie=["GET",...vG];new Set(Eie);var mm=A.createContext(null);mm.displayName="DataRouter";var BS=A.createContext(null);BS.displayName="DataRouterState";A.createContext(!1);var yG=A.createContext({isTransitioning:!1});yG.displayName="ViewTransition";var Aie=A.createContext(new Map);Aie.displayName="Fetchers";var Tie=A.createContext(null);Tie.displayName="Await";var rl=A.createContext(null);rl.displayName="Navigation";var Tx=A.createContext(null);Tx.displayName="Location";var al=A.createContext({outlet:null,matches:[],isDataRoute:!1});al.displayName="Route";var yP=A.createContext(null);yP.displayName="RouteError";function Cie(t,{relative:e}={}){mi(Cx(),"useHref() may be used only in the context of a component.");let{basename:n,navigator:i}=A.useContext(rl),{hash:r,pathname:a,search:s}=Nx(t,{relative:e}),o=a;return n!=="/"&&(o=a==="/"?n:tc([n,a])),i.createHref({pathname:o,search:s,hash:r})}function Cx(){return A.useContext(Tx)!=null}function Sc(){return mi(Cx(),"useLocation() may be used only in the context of a component."),A.useContext(Tx).location}var bG="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function _G(t){A.useContext(rl).static||A.useLayoutEffect(t)}function HS(){let{isDataRoute:t}=A.useContext(al);return t?Vie():Nie()}function Nie(){mi(Cx(),"useNavigate() may be used only in the context of a component.");let t=A.useContext(mm),{basename:e,navigator:n}=A.useContext(rl),{matches:i}=A.useContext(al),{pathname:r}=Sc(),a=JSON.stringify(gG(i)),s=A.useRef(!1);return _G(()=>{s.current=!0}),A.useCallback((l,c={})=>{if(Ws(s.current,bG),!s.current)return;if(typeof l=="number"){n.go(l);return}let u=xG(l,JSON.parse(a),r,c.relative==="path");t==null&&e!=="/"&&(u.pathname=u.pathname==="/"?e:tc([e,u.pathname])),(c.replace?n.replace:n.push)(u,c.state,c)},[e,n,a,r,t])}var Rie=A.createContext(null);function Pie(t){let e=A.useContext(al).outlet;return A.useMemo(()=>e&&A.createElement(Rie.Provider,{value:t},e),[e,t])}function Nx(t,{relative:e}={}){let{matches:n}=A.useContext(al),{pathname:i}=Sc(),r=JSON.stringify(gG(n));return A.useMemo(()=>xG(t,JSON.parse(r),i,e==="path"),[t,r,i,e])}function Die(t,e){return SG(t,e)}function SG(t,e,n,i,r){mi(Cx(),"useRoutes() may be used only in the context of a component.");let{navigator:a}=A.useContext(rl),{matches:s}=A.useContext(al),o=s[s.length-1],l=o?o.params:{},c=o?o.pathname:"/",u=o?o.pathnameBase:"/",f=o&&o.route;{let M=f&&f.path||"";wG(c,!f||M.endsWith("*")||M.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${c}" (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 p=nd(),m;if(e){let M=typeof e=="string"?cm(e):e;mi(d==="/"||M.pathname?.startsWith(d),`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 "${d}" but pathname "${M.pathname}" was given in the \`location\` prop.`),m=M}else m=p;let b=m.pathname||"/",_=b;if(d!=="/"){let M=d.replace(/^\//,"").split("/");_="/"+b.replace(/^\//,"").split("/").slice(M.length).join("/")}let v=sG(t,{pathname:_});bo(f||v!=null,`No routes matched location "${m.pathname}${m.search}${m.hash}" `),bo(v==null||v[v.length-1].route.element!==void 0||v[v.length-1].route.Component!==void 0||v[v.length-1].route.lazy!==void 0,`Matched leaf route at location "${m.pathname}${m.search}${m.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 x=Cie(v&&v.map(M=>Object.assign({},M,{params:Object.assign({},l,M.params),pathname:ec([d,a.encodeLocation?a.encodeLocation(M.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:M.pathname]),pathnameBase:M.pathnameBase==="/"?d:ec([d,a.encodeLocation?a.encodeLocation(M.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:M.pathnameBase])})),s,n,i,r);return e&&x?A.createElement(Sx.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...m},navigationType:"POP"}},x):x}function Mie(){let t=Oie(),e=mie(t)?`${t.status} ${t.statusText}`:t instanceof Error?t.message:JSON.stringify(t),n=t instanceof Error?t.stack:null,i="rgba(200,200,200, 0.5)",r={padding:"0.5rem",backgroundColor:i},a={padding:"2px 4px",backgroundColor:i},s=null;return console.error("Error handled by React Router default ErrorBoundary:",t),s=A.createElement(A.Fragment,null,A.createElement("p",null,"💿 Hey developer 👋"),A.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",A.createElement("code",{style:a},"ErrorBoundary")," or"," ",A.createElement("code",{style:a},"errorElement")," prop on your route.")),A.createElement(A.Fragment,null,A.createElement("h2",null,"Unexpected Application Error!"),A.createElement("h3",{style:{fontStyle:"italic"}},e),n?A.createElement("pre",{style:r},n):null,s)}var Eie=A.createElement(Mie,null),Aie=class extends A.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,e){return e.location!==t.location||e.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:e.error,location:e.location,revalidation:t.revalidation||e.revalidation}}componentDidCatch(t,e){this.props.onError?this.props.onError(t,e):console.error("React Router caught the following error during render",t)}render(){return this.state.error!==void 0?A.createElement(il.Provider,{value:this.props.routeContext},A.createElement(hP.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function Tie({routeContext:t,match:e,children:n}){let i=A.useContext(um);return i&&i.static&&i.staticContext&&(e.route.errorElement||e.route.ErrorBoundary)&&(i.staticContext._deepestRenderedBoundaryId=e.route.id),A.createElement(il.Provider,{value:t},n)}function Cie(t,e=[],n=null,i=null,r=null){if(t==null){if(!n)return null;if(n.errors)t=n.matches;else if(e.length===0&&!n.initialized&&n.matches.length>0)t=n.matches;else return null}let a=t,s=n?.errors;if(s!=null){let d=a.findIndex(f=>f.route.id&&s?.[f.route.id]!==void 0);mi(d>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(s).join(",")}`),a=a.slice(0,Math.min(a.length,d+1))}let o=!1,l=-1;if(n)for(let d=0;d=0?a=a.slice(0,l+1):a=[a[0]];break}}}let c=n&&i?(d,f)=>{i(d,{location:n.location,params:n.matches?.[0]?.params??{},errorInfo:f})}:void 0;return a.reduceRight((d,f,p)=>{let m,b=!1,_=null,v=null;n&&(m=s&&f.route.id?s[f.route.id]:void 0,_=f.route.errorElement||Eie,o&&(l<0&&p===0?(gG("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),b=!0,v=null):l===p&&(b=!0,v=f.route.hydrateFallbackElement||null)));let x=e.concat(a.slice(0,p+1)),M=()=>{let w;return m?w=_:b?w=v:f.route.Component?w=A.createElement(f.route.Component,null):f.route.element?w=f.route.element:w=d,A.createElement(Tie,{match:f,routeContext:{outlet:d,matches:x,isDataRoute:n!=null},children:w})};return n&&(f.route.ErrorBoundary||f.route.errorElement||p===0)?A.createElement(Aie,{location:n.location,revalidation:n.revalidation,component:_,error:m,children:M(),routeContext:{outlet:null,matches:x,isDataRoute:!0},onError:c}):M()},null)}function mP(t){return`${t} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function Nie(t){let e=A.useContext(um);return mi(e,mP(t)),e}function Rie(t){let e=A.useContext(kS);return mi(e,mP(t)),e}function Pie(t){let e=A.useContext(il);return mi(e,mP(t)),e}function gP(t){let e=Pie(t),n=e.matches[e.matches.length-1];return mi(n.route.id,`${t} can only be used on routes that contain a unique "id"`),n.route.id}function Die(){return gP("useRouteId")}function Oie(){let t=A.useContext(hP),e=Rie("useRouteError"),n=gP("useRouteError");return t!==void 0?t:e.errors?.[n]}function kie(){let{router:t}=Nie("useNavigate"),e=gP("useNavigate"),n=A.useRef(!1);return pG(()=>{n.current=!0}),A.useCallback(async(r,a={})=>{bo(n.current,hG),n.current&&(typeof r=="number"?t.navigate(r):await t.navigate(r,{fromRouteId:e,...a}))},[t,e])}var mj={};function gG(t,e,n){!e&&!mj[t]&&(mj[t]=!0,bo(!1,n))}A.memo(Lie);function Lie({routes:t,future:e,state:n,unstable_onError:i}){return mG(t,void 0,n,i,e)}function Iie(t){return Sie(t.context)}function Ul(t){mi(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function Uie({basename:t="/",children:e=null,location:n,navigationType:i="POP",navigator:r,static:a=!1}){mi(!wx(),"You cannot render a inside another . You should never have more than one in your app.");let s=t.replace(/^\/*/,"/"),o=A.useMemo(()=>({basename:s,navigator:r,static:a,future:{}}),[s,r,a]);typeof n=="string"&&(n=cm(n));let{pathname:l="/",search:c="",hash:d="",state:f=null,key:p="default"}=n,m=A.useMemo(()=>{let b=lc(l,s);return b==null?null:{location:{pathname:b,search:c,hash:d,state:f,key:p},navigationType:i}},[s,l,c,d,f,p,i]);return bo(m!=null,` is not able to match the URL "${l}${c}${d}" because it does not start with the basename, so the won't render anything.`),m==null?null:A.createElement(nl.Provider,{value:o},A.createElement(Sx.Provider,{children:e,value:m}))}function jie({children:t,location:e}){return wie(lN(t),e)}function lN(t,e=[]){let n=[];return A.Children.forEach(t,(i,r)=>{if(!A.isValidElement(i))return;let a=[...e,r];if(i.type===A.Fragment){n.push.apply(n,lN(i.props.children,a));return}mi(i.type===Ul,`[${typeof i.type=="string"?i.type:i.type.name}] is not a component. All component children of must be a or `),mi(!i.props.index||!i.props.children,"An index route cannot have child routes.");let s={id:i.props.id||a.join("-"),caseSensitive:i.props.caseSensitive,element:i.props.element,Component:i.props.Component,index:i.props.index,path:i.props.path,middleware:i.props.middleware,loader:i.props.loader,action:i.props.action,hydrateFallbackElement:i.props.hydrateFallbackElement,HydrateFallback:i.props.HydrateFallback,errorElement:i.props.errorElement,ErrorBoundary:i.props.ErrorBoundary,hasErrorBoundary:i.props.hasErrorBoundary===!0||i.props.ErrorBoundary!=null||i.props.errorElement!=null,shouldRevalidate:i.props.shouldRevalidate,handle:i.props.handle,lazy:i.props.lazy};i.props.children&&(s.children=lN(i.props.children,a)),n.push(s)}),n}var Jb="get",e_="application/x-www-form-urlencoded";function LS(t){return t!=null&&typeof t.tagName=="string"}function Fie(t){return LS(t)&&t.tagName.toLowerCase()==="button"}function zie(t){return LS(t)&&t.tagName.toLowerCase()==="form"}function Bie(t){return LS(t)&&t.tagName.toLowerCase()==="input"}function Hie(t){return!!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey)}function Vie(t,e){return t.button===0&&(!e||e==="_self")&&!Hie(t)}var _y=null;function $ie(){if(_y===null)try{new FormData(document.createElement("form"),0),_y=!1}catch{_y=!0}return _y}var Gie=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function wA(t){return t!=null&&!Gie.has(t)?(bo(!1,`"${t}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${e_}"`),null):t}function Wie(t,e){let n,i,r,a,s;if(zie(t)){let o=t.getAttribute("action");i=o?lc(o,e):null,n=t.getAttribute("method")||Jb,r=wA(t.getAttribute("enctype"))||e_,a=new FormData(t)}else if(Fie(t)||Bie(t)&&(t.type==="submit"||t.type==="image")){let o=t.form;if(o==null)throw new Error('Cannot submit a